2012/12/31(Mon)Linux Software RAIDのディスク交換と容量増加のオペレーションまとめ
2012/12/31 15:41
てなわけで、LinuxのSoftware RAIDでRAID1を構成しており、幸い今までデグレードも起こったことがないのだが、S.M.A.R.T.によると3万時間を経過しているディスクもあり、容量も8割方埋まってきたので、大容量のものに交換することにする。
その手順のまとめ。
環境について
移行時の環境はFedora 16 (i686)で、カーネルは3.6.10-2.fc16.i686.PAE。ディスクを3発入れてあり、/homeを/dev/md0としてRAID1中。
$ cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sdb1[0] sdc1[1] xxxxxxxxx blocks super 1.1 [2/2] [UU] bitmap: 0/4 pages [0KB], 131072KB chunk unused devices: <none>物理パーティション構成は、
- /dev/sda (160GB)
- /dev/sda1 = / (ext3)
- /dev/sda2 = swap
- /dev/sdb (500GB)
- /dev/sdb1 = /home (RAID1 member) (ext3)
- /dev/sdc (500GB)
- /dev/sdc1 = /home (RAID1 member) (ext3)
ブートパーティション(/boot)は作っていない。あまり分ける必要性もないし、中途半端に空いてるとpreupgradeで引っかかったりするし。
/ごとRAIDにしていないのは、GRUBのインストールや障害時のブートが煩雑になるのと、データは基本的に/home上でそこまでアクセスも集中しないだろうから…という理由により。
移行手順概要
今回、システム入りの/dev/sdaもついでに交換したので、ちょっと作業手順が増えたり。RAIDパーティションだけ引っ越す場合は、後半部分のみ。
/dev/sdaの移行
- 新旧のディスクのみを接続し、移行後のディスクをfdiskとmkfs.ext4してからdump, restoreでコピー
- /etc/fstabのUUIDを適当に書き換える(tune2fsを使ってディスク側を合わせてもOK)
- /dev/sdbをRAIDから脱退し、シャットダウン
- /dev/sdbを新しいものに交換、fdiskとresync (約1h)
- /dev/sdcをRAIDから脱退し、シャットダウン
- /dev/sdcを新しいものに交換、fdiskとresync (約1h)
- RAIDアレイを拡大し、resync (約1.5h)
- ext3ファイルシステムをパーティションサイズに拡大し、resync (数時間、寝落ちしたので不明)
500GBから1TBのディスク交換なのに、SATA2接続なせいか、意外とresyncに時間かかった…
作業内容
バックアップ
RAID1なので、最悪アレイがぶっ壊れてもext3でマウントすることにより、中身のデータは救出できる*1が、resyncで負荷をかけているときに壊れないとも限らないので、オフライン媒体にバックアップをとっておくシステムディスクの移行
ext3のお引っ越しは、dump, restoreを使って簡単に。新旧のパーティションサイズが違っても、実容量が足りてれば簡単にごっそり移行できます。
注意点として、
- パーティションのフォーマットは事前に行う必要あり
- フォーマットによってUUIDが変わる(同一にも出来るが、システムからみて新旧の区別が付かなくなる可能性があるので非推奨)
- MBRはコピーされないので、ブートローダーの再インストールが必要
今回は適当に転がってたBackTrackのLive USBから作業し、sdbに旧システムディスク、sdcに新システムディスクを接続する。(RAIDデバイスは取り外しておいた)
# apt-get install dump # fdisk -l 新旧のディスクがどのデバイス(/dev/sdX)かを確認 # fdisk /dev/sdc sdcにsdbと同一のパーティションテーブルを作成 sfdiskコマンドをパイプで繋ぐことで、自動的に同一のパーティションテーブルを作れるらしいのだが、今回は手動で確認しながら。 # mkfs.ext4 /dev/sdc1 ext4でフォーマット
- UでUUIDを指定できる
次にブートローダーのインストールを行う。
# cd /mnt/sdc1 # mount -o sysfs /sys /mnt/sdc1/sys # mount -o proc /proc /mnt/sdc1/proc # mount -o devtmpfs /dev /mnt/sdc1/dev # chroot /mnt/sdc1 # grub2-install /dev/sdcてな具合で。
先ほどsdc1のフォーマットを行った時に、パーティションのUUIDが変わっているので、fstabの変更もお忘れ無く。
あと、今回/をext3からext4に変更したので、その部分も変更が必要。うっかりext3のままにしていたら、後のpreupgradeでmountエラーになり焦った。
# vim /mnt/sdc1/etc/fstab UUID=ここを編集 / ext4 defaults 1 1 UUID=ここを編集 swap swap defaults 0 0これでおしまい。
RAID 1ディスクの変更
- 新システムディスクで起動
新しいシステムディスクと移行前のRAID1ディスクの組を繋いで、シングルユーザモードで起動。余計なディスクアクセスは抑制する。
(ここで、すんなり起動しない場合は何か忘れている) - /dev/sdb1をアレイから脱退
--failで故障マークをつけ、--removeでアレイから脱退させる。# mdadm /dev/md0 --fail /dev/sdb1 # mdadm /dev/md0 --remove /dev/sdb1
- /dev/sdbを新ディスクに交換
一旦シャットダウンして、/dev/sdbを新しいディスクに交換し、再度シングルユーザモードで起動。 - fdiskで/dev/sdbにパーティション情報を設定
# fdisk /dev/sdb
やることは、新パーティションを作成して、パーティションタイプを0xfd(Linux RAID)にするだけ。フォーマットは不要。 - /dev/sdb1をアレイに参加
--addで追加すると、自動的にresyncが開始される# mdadm /dev/md0 --add /dev/sdb1
別窓で、$ watch -n 1 cat /proc/mdstatなんてやっておくと、resync状況を確認できる。
# mdadm --wait /dev/md0 && beep等で処理完了を通知することもできる。 - /dev/sdc1をアレイから脱退
/dev/sdbと同様に。パス指定を間違わないように注意。# mdadm /dev/md0 --fail /dev/sdc1 # mdadm /dev/md0 --remove /dev/sdc1
- /dev/sdcを新ディスクに交換
一旦シャットダウンして、/dev/sdcを新しいディスクに交換し、再度シングルユーザモードで起動。 - fdiskで/dev/sdcにパーティション情報を設定
# fdisk /dev/sdc
- /dev/sdc1をアレイに参加
# mdadm /dev/md0 --add /dev/sdc1
- アレイの拡大
このままでは、新ディスクに大きなパーティションを確保しているとはいえ、RAID1上では旧ディスクのアレイ・ファイルシステムを維持しているので、それを拡大する作業が必要。
まずは、アレイの拡大から。# mdadm --grow /dev/md0 --size=max
例えば、500GBから1TBに拡大した場合、50%からresyncが始まる模様。 - ファイルシステムの拡大
特にサイズの指定は不要。内容は維持したまま、パーティションサイズに合うようにフィッティングされる。# resize2fs -p /dev/md0
進捗状況は$ watch -n 1 df -kで確認すればよいかな? - 完了
$ cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sdb1[2] sdc1[3] xxxxxxxxx blocks super 1.1 [2/2] [UU] bitmap: 0/4 pages [0KB], 131072KB chunk unused devices: <none>
resyncばっかりで、長かった…。
今回は1時間毎くらいにちょっとずつ作業が必要だったので、何か別のことをしながら合間にやる方がいいかも。
参考文献
以下の内容をとても参考にさせて頂きました。ありがとうございます。(やってることはほぼそのままですが、この記事は防備録として書いています…)
Linux ソフト RAID1 のハードディスクを取り替える - LinuxとかOSSで色々やってみる
RAID1の容量を増やす | へっぽこメモ