おおよそ、以下の環境での記録です。 ・ubuntu 12.04 (ブートローダはGRUB2) ・/dev/sdOK のHDDは正常 ・/dev/sdFAILED のHDDは不具合 ・/dev/sdNEW は新規・新品HDD ・sdOK sdFAILED sdNEWは、全て同じ容量、同じパーティション構成 ・/dev/md0は sdOK1 と sdFAILED1 で構成 ・/dev/md1は sdOK2 と sdFAILED2 で構成 まず、データのバックアップをとった。 下の[復旧作業]を他の(仮想)PCで予行演習し、自己責任で作業を実行した。 [役立ちそうな情報確認・表示コマンド] RAIDの状態を表示 # cat /proc/mdstat /dev/sdX の製品名・シリアル番号・容量等を表示 (要 smartmontools パッケージ) # smartctl -i /dev/sdX /dev/sdX のパーティション情報をs(sector)単位で表示 # parted /dev/sdX unit s print [復旧作業] sdFAILED が Fail(F)状態ではない場合、Fail状態に変更。 # mdadm --manage /dev/md0 --fail /dev/sdFAILED1 # mdadm --manage /dev/md1 --fail /dev/sdFAILED2 sdFAILEDをRAIDから除去。 # mdadm --manage /dev/md0 --remove /dev/sdFAILED1 # mdadm --manage /dev/md1 --remove /dev/sdFAILED2 sdOKにGRUBが入っているか確認。 # dpkg-reconfigure grub-pc sdOK,sdFAILED の仕様を確認し、後の作業での取り間違えを回避。 # smartctl -i /dev/sdOK # smartctl -i /dev/sdFAILED PCをシャットダウン、sdFAILEDを除去、sdNEW を接続、PCを起動。 自分の環境では、/etc/grub/defaultの GRUB_TERMINAL=console これを無効に(コメントに)していた事などから、 GRUBのブートメニューでrecovery modeを選択しないと、 degraded状態でのUbuntu起動ができなかった。 とりあえず起動できたので、普通にlogin。 sdOK sdNEW が /dev/sda か /dev/sdb か、何なのかを確認、特定。 (あるいは /dev/disk/by-id/ とかを使えば良いのかもしれない) # ls /dev/sd? # smartctl -i /dev/sda # smartctl -i /dev/sdb # cat /proc/mdstat sdOKのパーティション情報を表示。 # parted /dev/sdOK unit s print /dev/sdNEW のパーティションを以下の条件で作成。 ・パーティションテーブルはMBR(GPTではない) ・パーティション1: 基本(primary)パーティション Start 2048s End 999423s ・パーティション2: 基本(primary)パーティション Start 999424s End 1953523711s ・パーティション1、2は、ともにLinux ソフトウェア raid 用 # parted /dev/sdNEW (parted) unit s (parted) print (parted) mklabel msdos (parted) print (parted) mkpart primary 2048s 999423s (parted) print (parted) mkpart primary 999424s 1953523711s (parted) print (parted) set 1 raid on (parted) set 2 raid on (parted) print (parted) quit /dev/sdNEWをRAIDに追加。 # mdadm --manage /dev/md0 --add /dev/sdNEW1 # mdadm --manage /dev/md1 --add /dev/sdNEW2 RAIDの状態表示で、追加作業の開始を確認し、完了するまで放置。 # cat /proc/mdstat 念のため、initrdを更新。要らないかもしれないが、なんとなく。 # update-initramfs -u GRUBを/dev/sdOK と /dev/sdNEWに(再)インストール。 # dpkg-reconfigure grub-pc PCを再起動し、RAID1障害復旧の完了を確認。 [参考] ソフトウェアRAID1障害時のHDD交換(Parted編) | クラウド備忘録 http://www.cloud-memo.com/2013/04/raidhddparted.html Ubuntu Manpage: GNU Parted - a partition manipulation program http://manpages.ubuntu.com/manpages/precise/man8/parted.8.html [おまけ作業:RAID1 --raid-devices=3] HDD2台(2重)構成のRAID1では、なんとなく心配になってきたので、 HDD(/dev/sdTHIRD)を追加し、HDD3台(3重)構成のRAID1に変更した。 パーティションを作成するところまでは sdNEWと同じなので省略。 spareとしてsdTHIRDを登録。 # mdadm --manage /dev/md0 --add /dev/sdTHIRD1 # mdadm --manage /dev/md1 --add /dev/sdTHIRD2 3台構成に変更。 # mdadm --grow /dev/md0 --raid-devices=3 # mdadm --grow /dev/md1 --raid-devices=3 RAIDの状態表示で、追加作業の開始を確認し、完了するまで放置。 # cat /proc/mdstat initrdの更新と、GRUBをsdTHIRDにもインストール。 # update-initramfs -u # dpkg-reconfigure grub-pc 以上で完了。 ちなみに、2台に戻す場合のmdadm処理は、以下の要領。 # mdadm --manage /dev/md0 --fail /dev/sdTHIRD1 # mdadm --manage /dev/md0 --remove /dev/sdTHIRD1 # mdadm --grow /dev/md0 --raid-devices=2 [おまけ:気になった点] 「initrd.img の更新は必要なのか?」 と思ったが、今回の作業では不要だったかもしれない。 UUIDの変化は、blkid コマンドにて、以下の通りいくつか確認した。 ・構成ディスクが変わっただけなので、md0 md1 のUUIDは変化無し ・sdFAILED[12] と sdNEW[12] のUUIDは同じなので、実質的にUUIDの変化無し ・sdFAILED[12] と sdNEW[12] のUUID_SUBは異なるので、UUID_SUBは変化あり ・mdadm.confには、UUID_SUBの記述は見当たらない ・ついでに、grub.cfgには、UUID_SUBの記述は見当たらない よって、更新は要らないかもしれない。ただし、 # update-initramfs -u # dpkg-reconfigure grub-pc このあたりの処理で、UUID_SUBを検出して利用している可能性はあるので、 これらを実行しておいたほうが無難だとは思う。 Linux ソフトウェア RAID1の障害復旧作業では起こらないかもしれないが、 何らかの理由か、何か別の処理で /dev/md や /dev/sd の UUIDが変われば、 設定の更新処理をしてからGRUBのインストールやinitrd.imgの更新等が必ず必要になるだろう。 処理内容は、おそらく以下のような感じ。※これは予想※ # echo mdを構成するsdのUUIDが変更されたら・・・ # cd /etc/mdadm # mv -i mdadm.conf mdadm.conf--backup # /usr/share/mdadm/mkconf generate # # echo mdのUUIDが変更されたら・・・ # cd /etc # mv -i fstab fstab--backup # vi fstab # # update-initramfs -u # dpkg-reconfigure grub-pc [おまけ:発見したこと] Ubuntu新規インストール時にRAIDの作成処理をした後ぐらいの所で、 「OSブート時、もしもRAIDがdegrade状態だった場合の通常処理は、 そのまま起動か?中止か?」 という選択を求められたが、その変更方法が気になっていた。 # dpkg-reconfigure mdadm これで、変更できるっぽい事を知った。
2013年10月3日木曜日
Linux ソフトウェア RAID1の障害復旧記録(Ubuntu12.04)
登録:
投稿 (Atom)