mdadmのRAID再構築 の編集 (2009/08) anchor.png

mdadmでRAID組んでいたんですが、ディスクが1つ壊れました。
そのときの再構築メモです。

環境:
Debian Linux (testing:squeeze)
カーネル:2.6.26
mdadm 2.6.8-12
HDD:SATA
マザー:ASUS A8N-SLI Premium
ディスクはRAID1(mirroring) で構築。

Page Top

再構築イメージ anchor.png

もともとこんな構成で運用してました。
http://toyao.net/xoops/modules/xpwiki/image/toyaolocal/20090805WS000018.JPG

root および重要なシステムファイルが入っていた /dev/sda が壊れました。
ほんまRAIDにしといて良かったです。RAIDにしてなかったらたぶん3日ほど失踪していました。
HDDは2年くらい使っていました。サーバーなので24時間運転。
あまり掃除してなかったので、ほこりが溜まって冷却がうまくいってなかったのかも知れません。
ちなみに壊れたのは夏の暑い日。
http://toyao.net/xoops/modules/xpwiki/image/toyaolocal/20090805WS000019.JPG

ここから新しいディスクを調達して再構築するわけですが、どうせならこうしようと。
http://toyao.net/xoops/modules/xpwiki/image/toyaolocal/20090805WS000020.JPG
最近1TBのディスクも7000円台で買えるようになってきたので。ディスクも4台よりは2台にした方が熱対策としてもいいし、電気代もたぶん節約できるし。

具体的には以下のようにします。
/data は /home の下に置いて、同じパーティションとして管理することにします。
http://toyao.net/xoops/modules/xpwiki/image/toyaolocal/20090805WS000021.JPG

Page Top

壊れたsdaを交換してパーティションを作成 anchor.png

壊れたsda 250GBを1TBディスクに交換しました。
1TBのディスクは、この後の領域拡張を見越して大きめのパーティションを切っておきます。

cfdisk /dev/sda

注意点として、ディスクタイプは83(Linux) ではなく、FD(Linux raid autodetect)で作ります。
http://toyao.net/xoops/modules/xpwiki/image/toyaolocal/20090805WS000023.JPG

Page Top

mdadmでシンクロ anchor.png

データはsdbから同期させます。単純に同期するだけなので、ここでは1TBのディスクは250GB分の領域しか使えません。
同期するのに、コピー先の領域が大きい分には問題ないですが、サイズが小さくなる場合は考慮が必要です。
今回、/tmp は10GBから5GBに減っているので、そのままでは同期できません。
sdbの/tmpサイズを10GB→5GBにリサイズしてから同期することになるんでしょうが、ここでは手順がややこしそうなので/tmpは同期せず、後から新しく作ることにします。
http://toyao.net/xoops/modules/xpwiki/image/toyaolocal/20090805WS000025.JPG

mdadm /dev/md0 -a /dev/sda1
mdadm /dev/md1 -a /dev/sda2
mdadm /dev/md2 -a /dev/sda3
mdadm /dev/md3 -a /dev/sda5

同期できたかどうかの確認は

cat /proc/mdstat

で分かります。

Page Top

grabでMBRにブートローダをセットアップする anchor.png

データは同期できましたが、このままではまだsdaから起動できません。
sdaから起動できるようにするため、grubでMBRにブートローダをインストールします。

/dev/sdaにセットアップする場合

#grub
>root (hd0,0)
>setup (hd0)

この後、sdaから起動するようにBIOSでHDDの起動順位を変更します。

Page Top

sdbディスクを交換し、sda→sdbへシンクロ anchor.png

sdbディスクを250GBから1TBのものに交換します。
sdbのパーティション構成はsdaとまったく同じにします。
データはsda→sdbに同期します。
http://toyao.net/xoops/modules/xpwiki/image/toyaolocal/20090805WS000026.JPG

mdadm /dev/md0 -a /dev/sdb1
mdadm /dev/md1 -a /dev/sdb2
mdadm /dev/md2 -a /dev/sdb3
mdadm /dev/md3 -a /dev/sdb5
Page Top

ディスク領域を拡張する anchor.png

これで250GB同士の同期はできました。
次に、1TBの領域をフルに使うためにディスク領域の拡張を行います。
size=max とすると、パーティションが持つmaxサイズまでディスク領域を拡張してくれます。

mdadm --grow --size=max /dev/md0
mdadm --grow --size=max /dev/md1
mdadm --grow --size=max /dev/md2
mdadm --grow --size=max /dev/md3

これでRAID的には領域が拡張できましたが、dfコマンドで見ると、パーティションサイズが変わってなかったので、
以下のコマンドも併せて実行しないといけないみたいです。

resize2fs -p /dev/md0
resize2fs -p /dev/md1
resize2fs -p /dev/md2
resize2fs -p /dev/md3

p オプションは進捗を表示するオプション。(-pの有無による違いがよく分かりませんでしたが...)

http://toyao.net/xoops/modules/xpwiki/image/toyaolocal/20090805WS000030.JPG

Page Top

/tmp作成 anchor.png

データ移行していなかった/tmpをRAIDで作ります。

mdadm --create /dev/md4 --level=raid1 --raid-devices=2  missing /dev/sda6

※missing オプションは、縮退状態でcreateするということです。
最初にRAIDパーティションを作るときは、都合良く2つのディスクを同時に同期させた状態で作ることは作ることはできないので、
まず縮退状態で1つディスクを作成します。
上の例では、まず1つ目のRAIDパーティションとして、/dev/sda6 を作成しています。

次にsdb6の方をRAIDのmd4パーティションに参加させます。

mdadm /dev/md4 -a /dev/sdb6
Page Top

initrdの再作成 anchor.png

Linuxの起動にinitrdイメージを用意している場合は、
RAIDに再構築に伴いinitrdを作り直さないといけません。
rootディレクトリをRAIDにしているから必要なんだと思います。

mkinitramfs -o /boot/initrd.img-2.6.26 2.6.26

"2.6.26のところは、`uname -r`コマンドで返ってくる文字列を書けばいいです。

カーネルごと作り直した場合は、/boot/grub/menu.lst が勝手に作り直されて

/boot/vmlinuz-2.6.26 root=/dev/md0 ro

にしていたところが

/boot/vmlinuz-2.6.26 root=/dev/sda1 ro

にされてしまい立ち上がらなくなりますから注意が必要です。(これでハマりました)

Page Top

mdadm.confの更新 anchor.png

/etc/mdadm/mdadm.confを更新します。
UUIDが変わっていると思うので、そのIDを最新のものにします。
最新のUUIDは

mdadm --detail --scan

で確認できます。
あと、いらなくなったmdパーティションも整理。

Page Top

あとかたづけ anchor.png

1TBのRAIDは構築できたので、あとはhdbのMBRの方にもブートローダをインストールします。

#grub
>root (hd1,0)
>setup (hd1)

sdc,sddでRAID構築していた/data ぱ、/homeの下に移動させます。

cp -av /data /home

これが済めばsdc,sddを取り外します。

/etc/fstabも必要ならばメンテナンスします。
今回は、sdc、sddを使ったmd5パーティションが要らなくなったので、このマウント記述を削除しました。

以上で移行完了です。

Page Top

参考 anchor.png

Page Top

まめ知識 anchor.png

RAIDパーティションの削除は、いったん停止(stop)してから削除(remove)する必要があります。

mdadm --manage --stop /dev/md4
mdadm --manage --remove /dev/md4




Page Top

comment anchor.png