そのため情報が古い可能性があります。ご了承ください。m(_ _)m
新PCに500GB X 2のhddが積んであるにも関わらず片方何もしてないので、
raid1にしようとlinuxでのソフトウェアRAIDの仕方を探していた。
freebsdだったら、gmirrorとかでサクっと簡単にRAID組めるんだろうけど。。
条件としては、
- ソフトウェアRAID
- どちらのHDDからもブート出来ること。
の2つ。
・・・
mdadmのみ??
ミラー側のパーティション切る必要があったりで、ちょっと面倒そうだったから、
他のを探してみたけど見つからず。。
仕方がないのでmdadmでRAID1を組むことにした。
既にOSインストールして旧PCからデータの移行とかもしてしまってるから、
また改めて初っぱなから環境作り直すとかは嫌だ。ってことで、
今の環境からRAID1環境を構築する方法を探してたところ、
Linuxでmdadmを使ったソフトウェアRAIDの構築・管理メモ – nabeの雑記帳
に、まさしくそんな感じのRAID環境の構築方法が懇切丁寧に記載されていた。GJ!
新PCには、sda, sdbの2台のHDDが積んであって、sdaは現在動作中のHDD。sdbは未使用。
手順としては、↓こんな感じ。
- sdbのみ参加させる形のRAID1構築
- sdaのデータをsdbに全コピ
- sdbで起動してsdaをRAID1に参加
- sdb外して起動させてみる
1. sdbのみ参加させる形のRAID1構築
sdaと同じようにパーティションを区切る。
(sdaと違う区切り方をした場合は後でsdaの方を変える必要がある。と思う)
Disk /dev/sdb: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 * 1 34 273073+ fd Linux raid autodetect
/dev/sdb2 35 60801 488110927+ 5 Extended
/dev/sdb5 35 642 4883728+ fd Linux raid autodetect
/dev/sdb6 643 1007 2931831 fd Linux raid autodetect
/dev/sdb7 1008 1735 5847628+ 82 Linux swap / Solaris
/dev/sdb8 1736 1784 393561 fd Linux raid autodetect
/dev/sdb9 1785 60801 474054021 fd Linux raid autodetect
sdb1 -> /
sdb5 -> /usr
sdb6 -> /var
sdb7 -> swap
sdb8 -> /tmp
sdb9 -> /home
mdadm: /dev/sdb1 appears to contain an ext2fs file system
size=488384000K mtime=Thu Oct 16 21:02:53 2008
Continue creating array? y
# mdadm --create /dev/md5 --level=raid1 --raid-devices=2 missing /dev/sdb5
・・・
# mdadm --create /dev/md6 --level=raid1 --raid-devices=2 missing /dev/sdb6
・・・
# mdadm --create /dev/md7 --level=raid1 --raid-devices=2 missing /dev/sdb7
・・・
# mdadm --create /dev/md8 --level=raid1 --raid-devices=2 missing /dev/sdb8
・・・
# mdadm --create /dev/md9 --level=raid1 --raid-devices=2 missing /dev/sdb9
・・・
mdadm [mode]
–levelには、linear, raid0, 0, stripe, raid1, 1, mirror, raid4, 4, raid5, 5, raid6, 6, multipath, mp 辺りが指定できる模様。
HDD2台のRAID1なので、–level=raid1, –raid-devices=2と指定。
2台のうち1台(sda)は後で参加させるので、ここではmissingを指定。
これらの指定でsdbだけのRAID1が構築される。
次は、ファイルシステムの構築。ext2でもext3でもXFSでもReiserFSでも何でも良いらしい。
# mkreiserfs -f /dev/md5
# mkreiserfs -f /dev/md6
# mkreiserfs -f /dev/md8
# mkreiserfs -f /dev/md9
# mkswap /dev/md7
これで/dev/md?がmount出来る状態になったらしい。
RAID設定を保存しておく。
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
2. sdaのデータをsdbに全コピ
シングルユーザモードで起動し直す。
reboot
grubの選択画面で、eキー押して、kernel・・・の行でさらにeキー押す。
末尾にsingle追加してboot。
立ち上がったら、RAID1の環境をmount。
mkdir /mnt/usr
mount /dev/md5 /mnt/usr
mkdir /mnt/var
mount /dev/md6 /mnt/var
mkdir /mnt/tmp
mount /dev/md8 /mnt/tmp
mkdir /mnt/home
mount /dev/md9 /mnt/home
sdaのデータ(/proc, /sys辺りは除く)を/mntに全部コピーする
# cp -a bin cdrom emul ・・・ /mnt/
# mkdir /mnt/proc
# mkdir /mnt/sys
3. sdbで起動してsdaをRAID1に参加
sdaのgrub設定を修正して、/dev/md(sdb)を起動する。
# mv initrd.img-2.6.18-6-amd64 initrd.img-2.6.18-6-amd64-raid-pre
# mkinitramfs -r /dev/md1 -o initrd.img-2.6.18-6-amd64 (mkinitrdは無くなってた)
# vi grub/menu.lst
title debian GNU/Linux, kernel 2.6.18-6-amd64(raid) root (hd1,0) kernel /boot/vmlinuz-2.6.18-6-amd64 root=/dev/md1 ro initrd /boot/initrd.img-2.6.18-6-amd64 savedefaulttitle Debian GNU/Linux, kernel 2.6.18-6-amd64 root (hd0,0) kernel /boot/vmlinuz-2.6.18-6-amd64 root=/dev/sda1 ro initrd /boot/initrd.img-2.6.18-6-amd64-raid-pre savedefault title Debian GNU/Linux, kernel 2.6.18-6-amd64 (single-user mode) root (hd0,0) kernel /boot/vmlinuz-2.6.18-6-amd64 root=/dev/sda1 ro single initrd /boot/initrd.img-2.6.18-6-amd64-raid-pre savedefault
※ 上1つを追加。下2つはsdaから立ち上がる用。念のため。
sdbから起動する用にsdbのfstabを修正する。
# vi /mnt/etc/fstab
/dev/sda* となっている所を/dev/md*に修正。
再起動。(シングルユーザモードに。)
# reboot
起動したら/dev/md*をマウントしてるか確認。
# mount | grep md
/dev/md1 on / type reiserfs (rw,notail)
/dev/md9 on /home type reiserfs (rw)
/dev/md8 on /tmp type reiserfs (rw)
/dev/md5 on /usr type reiserfs (rw)
/dev/md6 on /var type reiserfs (rw)
ここまでの状況を整理すると、、、
- sda のgrubを見てsdbの/dev/mdをmountして動作している。
- sdaはsdaで単独動作するはず。
なので、何か問題があって戻したい場合は、sdaのgrub設定を元に戻したりすれば、
簡単に元に戻せる。以降の手順でsdaをRAIDに参加させると元には戻せなくなる。。
vmwareとかでやってるならスナップショットを取ると良い。
実PCでやってるなら腹をくくると良い。
sdaをRAIDに参加させるためパーティションタイプをLinux raid autodetect(0xfd)へ変更する。fdisk or cfdisk辺りを使う。
次のコマンドでsdaをRAIDに参加させる。sdaのデータも消える。。
# mdadm /dev/md5 -a /dev/sda5
# mdadm /dev/md6 -a /dev/sda6
# mdadm /dev/md7 -a /dev/sda7
# mdadm /dev/md8 -a /dev/sda8
# mdadm /dev/md9 -a /dev/sda9
状況は
で確認可能。だいたい↓こんな感じ。
# cat /proc/mdstat Personalities : [raid1] md9 : active raid1 sda9[2] sdb9[1] 474053952 blocks [2/1] [_U] [>....................] recovery = 4.6% (22239040/474053952) finish=105.7min speed=71215K/sec md8 : active raid1 sda8[0] sdb8[1] 393472 blocks [2/2] [UU] md7 : active raid1 sda7[0] sdb7[1] 5847552 blocks [2/2] [UU] md6 : active raid1 sda6[0] sdb6[1] 2931712 blocks [2/2] [UU] md5 : active raid1 sda5[0] sdb5[1] 4883648 blocks [2/2] [UU] md1 : active raid1 sda1[0] sdb1[1] 272960 blocks [2/2] [UU] unused devices:
md9をミラーリング中なことがわかる。
/proc/mdstatをちょくちょく確認して、ミラーリングが完了したら、
sda, sdbの両方とも起動するよう設定する。
さっき作ったinitrdとmenu.lstはミラー化によって削除されたので、
# mv initrd.img-2.6.18-6-amd64 initrd.img-2.6.18-6-amd64-raid-pre
# mkinitramfs -r /dev/md1 -o initrd.img-2.6.18-6-amd64
# vi grub/menu.lst
Debian GNU/Linux, kernel 2.6.18-6-amd64 root (hd0,0) kernel /boot/vmlinuz-2.6.18-6-amd64 root=/dev/md1 ro initrd /boot/initrd.img-2.6.18-6-amd64 savedefault title Debian GNU/Linux, kernel 2.6.18-6-amd64 (single-user mode) root (hd0,0) kernel /boot/vmlinuz-2.6.18-6-amd64 root=/dev/md1 ro single initrd /boot/initrd.img-2.6.18-6-amd64 savedefault
/boot/grub/devices.map を修正する。
(hd0) /dev/sda
(hd1) /dev/sdb
sdbにgrubをインストール
# grub
grub> root (hd0,0)
grub> setup(hd0)
grub> root(hd1,0)
grub> setup(hd1)
grub> quit
/boot/grub/menu.lst を修正する
# kopt=root=/dev/md1 ro
これでsda, sdbのどちらからも起動できるようになったはず!?
あ、mdadm.confを更新しておく。
mdadm.confの末尾に、以前追加した、ARRAY *があるので削除した後、
とりあえず再起動して正常起動を確認。
5. sdbを外して起動させてみる
今までsdbをメインにRAID構築してきたので試しに外して起動させてみる。
起動したら、状況確認。
Personalities : [raid1]
md9 : active raid1 sda9[0]
474053952 blocks [2/1] [U_]
md8 : active raid1 sda8[0]
393472 blocks [2/1] [U_]
md7 : active raid1 sda7[0]
5847552 blocks [2/1] [U_]
md6 : active raid1 sda6[0]
2931712 blocks [2/1] [U_]
md5 : active raid1 sda5[0]
4883648 blocks [2/1] [U_]
md1 : active raid1 sda1[0]
272960 blocks [2/1] [U_]
unused devices: <none>
sdb?がいない事が分かる。
ちゃんとsda単独で立ち上がる事が確認できたので、
sdbを繋いだ後立ち上げて状況を見てみる。
Personalities : [raid1]
md9 : active raid1 sda9[0]
474053952 blocks [2/1] [U_]
md8 : active raid1 sda8[0]
393472 blocks [2/1] [U_]
md7 : active raid1 sda7[0]
5847552 blocks [2/1] [U_]
md6 : active raid1 sda6[0]
2931712 blocks [2/1] [U_]
md5 : active raid1 sda5[0]
4883648 blocks [2/1] [U_]
md1 : active raid1 sda1[0]
272960 blocks [2/1] [U_]
unused devices: <none>
変わらず・・・???
どうも自動で修復みたいなことはしてくれないようだ。
もう1度コマンド叩いて追加すると
mdadm: re-added /dev/sdb1
みたくなる。こういう物だろう。
あと、追加するとゼロからコピーし直すっぽい。
変更箇所だけとかは無理かぁ。
HDDが故障したときは、
- 新HDD繋ぐ
- パーティション切る
- mdadm /dev/md1 -a /dev/sdc1
ってやれば良いのか。パーティション切るのがちょっと面倒。
【参考サイト】
mdadm
mkadm 概念 関連ファイル/ディレクトリ コマンド 設定ファイル ログ マニュアル 設定事例 トラブルシュート …
結局ubuntu8.04LTSServerでRaid5 NAS
Ubuntu9.04DesktopをRaid化してみました。まず、既存のシステムをRaid化してみました。参考にしたサイトは、Linuxでmdadmを使っ…