RAID1 on etch

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

新PCに500GB X 2のが積んであるにも関わらず片方何もしてないので、
にしようとでのソフトウェアRAIDの仕方を探していた。

だったら、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は未使用。
手順としては、↓こんな感じ。

  1. sdbのみ参加させる形のRAID1構築
  2. sdaのデータをsdbに全コピ
  3. sdbで起動してsdaをRAID1に参加
  4. sdb外して起動させてみる

1. sdbのみ参加させる形のRAID1構築

sdaと同じようにパーティションを区切る。
(sdaと違う区切り方をした場合は後でsdaの方を変える必要がある。と思う)

# fdisk /dev/sdaCommand (m for help): p
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 --create /dev/md1 --level=raid1 --raid-devices=2 missing /dev/sdb1
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] [option]
–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/md1
# mkreiserfs -f /dev/md5
# mkreiserfs -f /dev/md6
# mkreiserfs -f /dev/md8
# mkreiserfs -f /dev/md9
# mkswap /dev/md7

これで/dev/md?がmount出来る状態になったらしい。
RAID設定を保存しておく。

echo 'DEVICE /dev/sda* /dev/sdb*' >> /etc/mdadm/mdadm.conf
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

2. sdaのデータをsdbに全コピ
シングルユーザモードで起動し直す。

reboot

grubの選択画面で、eキー押して、kernel・・・の行でさらにeキー押す。

末尾にsingle追加してboot。

立ち上がったら、RAID1の環境をmount。

mount /dev/md1 /mnt
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に全部コピーする

# cd /
# cp -a bin cdrom emul ・・・ /mnt/
# mkdir /mnt/proc
# mkdir /mnt/sys

3. sdbで起動してsdaをRAID1に参加
sdaのgrub設定を修正して、/dev/md(sdb)を起動する。

# cd /boot
# 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            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に参加させると元には戻せなくなる。。
とかでやってるならスナップショットを取ると良い。
実PCでやってるなら腹をくくると良い。

sdaをRAIDに参加させるためパーティションタイプをLinux raid autodetect(0xfd)へ変更する。fdisk or cfdisk辺りを使う。
次のコマンドでsdaをRAIDに参加させる。sdaのデータも消える。。

# mdadm /dev/md1 -a /dev/sda1
# 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

で確認可能。だいたい↓こんな感じ。

# 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はミラー化によって削除されたので、

# cd /boot
# 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 を修正する。

# vi grub/device.map

(hd0) /dev/sda

(hd1) /dev/sdb

sdbにgrubをインストール

# grub-install --no-floppy /dev/sdb
# grub
grub> root (hd0,0)
grub> setup(hd0)
grub> root(hd1,0)
grub> setup(hd1)
grub> quit

/boot/grub/menu.lst を修正する

vi grub/menu.lst

# kopt=root=/dev/md1 ro

これでsda, sdbのどちらからも起動できるようになったはず!?

あ、mdadm.confを更新しておく。

mdadm.confの末尾に、以前追加した、ARRAY *があるので削除した後、

mdadm --detail --scan >> /etc/mdadm/mdadm.conf

とりあえず再起動して正常起動を確認。

5. sdbを外して起動させてみる

今までsdbをメインにRAID構築してきたので試しに外して起動させてみる。

起動したら、状況確認。

% cat /proc/mdstat
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を繋いだ後立ち上げて状況を見てみる。

% cat /proc/mdstat
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 /dev/md1 -a /dev/sdb1

mdadm: re-added /dev/sdb1

みたくなる。こういう物だろう。

あと、追加するとゼロからコピーし直すっぽい。

変更箇所だけとかは無理かぁ。

HDDが故障したときは、

  1. 新HDD繋ぐ
  2. パーティション切る
  3. mdadm /dev/md1 -a /dev/sdc1

ってやれば良いのか。パーティション切るのがちょっと面倒。

【参考サイト】

カテゴリー: サーバ管理, ソフトウェア, ハードウェア タグ: , , , , , , , , , パーマリンク

RAID1 on etch への2件のフィードバック

  1. mdadm

    mkadm 概念 関連ファイル/ディレクトリ コマンド 設定ファイル ログ マニュアル 設定事例 トラブルシュート …

  2. 結局ubuntu8.04LTSServerでRaid5 NAS

    Ubuntu9.04DesktopをRaid化してみました。まず、既存のシステムをRaid化してみました。参考にしたサイトは、Linuxでmdadmを使っ…

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です