カーネル2.4以降では、RAIDを構成する機能があらかじめ組み込まれているので、この機能を使えるようにするだけでOKですが、手順等に若干コツがあるようです。以下、ここら辺のことを中心に間違いなくRAID1を構成できる事を目指して書きます。なお、RAID5等別の目的には、他のもっと詳しく書いてあるサイトをご覧アレ(笑) 僕んちはPlamo-4.01でRAID1が出来れば十分だったので(笑)
なお、今回はブートローダはGrubを用いています。Liloを用いる場合は別途情報を探してください。
- カーネルの再構築
デフォルトのカーネルは、RAID関連がすべてモジュールとしてコンパイルされている。これだとやりたいルートパーティションのRAID化時点で困るので、あらかじめRAID関連モジュールをカーネルに含める(<M>を<*>にする)。終わったら、出来上がったカーネルで起動することを確認する。
なお、Plamo-4.0ではモジュールのありかを指す文字列が"2.4.26-plamo"という具合に余計なものがついているので、カーネルのバージョンは変わらないが、モジュールのコンパイルはやり直しになる。
- sdaのパーティションサイズを調査する
インストール済みのsdaのパーティションサイズを調査して記録する。sdbをこれと全く同一サイズのパーティション構成にするため。
参考までに、今回作ったマシンでは、以下のようになっている。
bash-3.00# fdisk /dev/sda
The number of cylinders for this disk is set to 17849.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
コマンド (m でヘルプ): p
ディスク /dev/sda: ヘッド 255, セクタ 63, シリンダ 17849
ユニット = シリンダ数 of 16065 * 512 バイト
デバイス ブート 始点 終点 ブロック ID システム
/dev/sda1 * 1 1245 10000431 83 Linux
/dev/sda2 1246 1276 249007+ 82 Linux スワップ
/dev/sda3 1277 1338 498015 83 Linux
/dev/sda4 1339 17849 132624607+ 83 Linux
- sdbにパーティションを確保する
上で調べたサイズにする。結果的にはswapパーティションも同一サイズにすることになる。また、sdbのパーティションタイプを0x83(Linux)から0xfd(Linux raid autodetect)にする。swapパーティションもミラーするので、全部こうする。
bash-3.00# fdisk /dev/sdb
The number of cylinders for this disk is set to 17849.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
コマンド (m でヘルプ): p
ディスク /dev/sdb: ヘッド 255, セクタ 63, シリンダ 17849
ユニット = シリンダ数 of 16065 * 512 バイト
デバイス ブート 始点 終点 ブロック ID システム
/dev/sdb1 * 1 1245 10000431 fd Linux raid 自動検出
/dev/sdb2 1246 1276 249007+ fd Linux raid 自動検出
/dev/sdb3 1277 1338 498015 fd Linux raid 自動検出
/dev/sdb4 1339 17849 132624607+ fd Linux raid 自動検出
- /etc/raidtabを作成
こういう名前のファイルを新規作成して、下記のように記載する。
raiddev /dev/md0
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
chunk-size 4
persistent-superblock 1
device /dev/sdb1
raid-disk 0
device /dev/sda1
failed-disk 1
raiddev /dev/md1
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
chunk-size 4
persistent-superblock 1
device /dev/sdb2
raid-disk 0
device /dev/sda2
failed-disk 1
raiddev /dev/md2
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
chunk-size 4
persistent-superblock 1
device /dev/sdb3
raid-disk 0
device /dev/sda3
failed-disk 1
raiddev /dev/md3
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
chunk-size 4
persistent-superblock 1
device /dev/sdb4
raid-disk 0
device /dev/sda4
failed-disk 1
ここで、raiddevセクションを4つ定義しているが、それぞれ1番目のデバイスにはまだ中身の無いsdbを指定していて、2番目のデバイスである(データの入っている)sdaをfailed-diskにしている点が重要。まだraidが正しく動いていないうちに既存のデータを壊してしまわないためである。
- raidtoolsをインストール
# tar xvfz raidtools-1.00.3.tar.gz
# cd raidtools-1.00.3
※mkraid.cにGCC 3.2では通らないコードがあるので直す。直したコードはコレ、違いはコレ。コレをftp経由でソースツリーに上書きしてからmake。
# ./configure
# make
# make install
- raidを作成
bash-3.00# mkraid /dev/md0
# mkraid /dev/md1
# mkraid /dev/md2
# mkraid /dev/md3
なお、この時点で以下のようなメッセージが出る事が、かなり高い確率である。
bash-3.00# mkraid /dev/md0
handling MD device /dev/md0
analyzing super-block
disk 0: /dev/sdb1, 10000431kB, raid superblock at 10000320kB
/dev/sdb1 appears to be already part of a raid array -- use -f to
force the destruction of the old superblock
mkraid: aborted.
(In addition to the above messages, see the syslog and /proc/mdstat as well
for potential clues.)
このようになったときは、ドキュメントをよく読んでみれば答えが書いてあるので、各自チャレンジしてさい。あくまで自己責任で :-p
- raidが構築されているか確認
# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md3 : active raid1 sdb4[0]
132624512 blocks [2/1] [U_]
md2 : active raid1 sdb3[0]
497920 blocks [2/1] [U_]
md1 : active raid1 sdb2[0]
248896 blocks [2/1] [U_]
md0 : active raid1 sdb1[0]
10000320 blocks [2/1] [U_]
unused devices: <none>
この時点では、sdaがRAIDに参加していないので、いずれも片方しか動作していないことがわかる。この状態を、デグレードRAID(De-grade RAID)というらしい。
- 新しいパーティションにファイルシステムを作成
# mke2fs -jc /dev/md0
# mke2fs -jc /dev/md2
# mke2fs -jc /dev/md3
# mkswap -c /dev/md1
- 新しいパーティションに既存データをコピー
# mount -t ext3 /dev/md0 /mnt
# mkdir /mnt/var
# mount -t ext3 /dev/md2 /mnt/var ←今回は/var用としてわけているため
# mkdir /mnt/home
# mount -t ext3 /dev/md3 /mnt/home ←今回は/home用としてわけているため
# cp -a (/mnt, /proc, /lost+found以外) /mnt
# mkdir /mnt/proc /mnt/mnt
# chmod 555 /proc
コピー実施後、df -T にて使用済みサイズが同一であることを確認。
- 作成したRAIDからブートしてみる
sdaにあるGrubから起動するので、sda1にある/etc/grub.confを以下のように加筆。
default 0
timeout 30
fallback 1
splashimage (hd0,0)/boot/grub/grubimg.xpm.gz
title Plamo-4.0 (md0)[RAID]
root (hd1,0)
↑ 2台目のディスクの1つ目のパーティションからブートするの意
kernel (hd1,0)/vmlinuz root=/dev/md0 ro
↑ 2台目のディスクの1つ目のパーティションの/vmlinuzをカーネルとするの意
title Plamo-4.0 (sda1)
↑ 通常どおりブートする手段を残す
root (hd0,0)
kernel (hd0,0)/vmlinuz root=/dev/sda1 ro
また、sdbにある/etc/fstabを、RAIDディスクを使うように修正。
# vi /mnt/etc/fstab
# cat /mnt/etc/fstab
/dev/md1 swap swap defaults 0 0
/dev/md0 / ext3 defaults 1 1
/dev/md2 /var ext3 defaults 1 2
/dev/md3 /home ext3 defaults 1 2
...
また、sdbからも起動できるように、sdbのMBRにGrubをセットアップする。
# grub
grub> root (hd1,0)
grub> setup (hd1)
grub> quit
これで再起動する。無事ブートしたら、cat /proc/mdstat にて同様にRAID動作を確認する。
- 元のディスクをRAIDに追加する
/etc/raidtab 内の failed-disk を raid-disk に修正。
# vi /etc/raidtab
元のディスクをRAIDに追加するため、sdaのパーティションタイプも同様にすべて0xfdにする。
# fdisk /dev/sda
# raidhotadd /dev/md0 /dev/sda1
# raidhotadd /dev/md1 /dev/sda2
# raidhotadd /dev/md2 /dev/sda3
# raidhotadd /dev/md3 /dev/sda4
これで cat /proc/mdstat すると、再ミラーリング状況が確認できるので、いずれも100%になれば完了。ディスクが大きいと所要時間も長いので、気長に待つ。