2013年6月4日

動作しないRAIDディスクの交換


前回は不良セクタが発見されたRAIDディスクドライブを修復したが、今回は全く動作しなくなってしまったHDDを新しいドライブに交換する。RAID1の場合を示すが、RAID5やRAID6のレベルでも基本的に同じこと。少し古いが、こちらのサイトこちらのサイトが参考になる。
 


まず、/proc/mdstatでRAIDの状態を確認。
h@spice:~$ cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md1 : a
ctive raid1 sda2[0]      38398908 blocks super 1.1 [2/1] [U_]
      bitmap: 1/1 pages [4KB], 65536KB chunk

md0 : active raid1 sda3[0]
      204788 blocks super 1.0 [2/1] [U_]
    
unused devices: <none>
/dev/sdbが全く見えていない。すでにmdadmが警告のメイルを送ってきているはず。
 

新しいHDDを用意

ペアになる稼働中のHDDと同じモデルが安心できるが、別にこだわる必要はない。ペアになるHDDより少容量でなければよい。5年ほど前までは、例えば同じ「120GB」を公称するHDDでもメーカにより、あるいは同じメーカの同じモデル名でもリビジョンにより実際の容量が微妙に異なり、運悪く稼働中のHDDより少容量のHDDを手に入れてしまうと使えなかったが、今は業界の申し合わせにより、例えば公称「2TB」のHDDはどのメーカ、どのモデル、どのリビジョンでもすべて同一の容量のはずなので心配事が一つ減った。
 

新しいHDDのパーティション

普段使っているfdiskでいちいち手でやるよりも、sfdiskで稼働中のHDDのパーティションをそっくりコピーする方が失敗がない。/dev/sdaから/dev/sdbにパーティションをコピーする。
h@spice:~$ sudo sfdisk -d /dev/sda | sudo sfdisk /dev/sdb
新しいディスクと古いディスクのジオメトリの違いで「I don't like this partition.」と拒絶されたら、--forceオプションを/dev/sdb側につけて強制的にパーティション情報をコピーする。この時点でパーティションのタイプなどもそっくりコピーされる。

注意:2TB以上の領域を使う場合は、2^32以上の512Bセクタを使うのでMBRのパーティションでは対応できず、従ってsfdiskも使えず、GPTを使う必要がある。この辺はご自分で工夫してください。
 

RAIDに新しいパーティションを加える

パーティションが整ったら、新しいパーティションをRAIDに加えてやれば、RAIDが勝手にリシンクを始める。リシンクは同時に一つのRAIDしか実行されないので、小さなサイズのパーティションから先に加えると先にリシンクが完了するので気持ちがよい。
h@spice:~$ sudo mdadm /dev/md0 --add /dev/sdb3
h@spice:~$ sudo mdadm /dev/md1 --add /dev/sdb2

h@spice:~@ sudo mkswap -U xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /dev/sdb1
h@spice:~$ sudo swapon -a


ブートローダの処理

以上のように、RAIDの修復そのものはさして難しくないが、ブートローダはRAIDの範疇ではなく、新しいHDDにはブートローダが書き込まれておらず、もし以前から動いている方のHDDが全く立ち上がらなくなるとブートできなくなってしまうのでこの手当てが必要。
 
ここではgrubを使っている 。個々のgrubコマンドやgrubの文法は「info grub」を熟読して精通しておくことを勧める。要点は「info grub」の「3.2 Installing GRUB natively」を参照。注意すべきことは、grubでのナンバリングは全てゼロベース、すなわち、
  • (hd0)/dev/sda
  • (hd0,0)/dev/sda1
となること。
ここで行うgrubの作業は以下の二つ
  1. 最初のHDDからのブートが失敗したときの代替HDDを指定する
  2. 代替HDD(新しいHDD)にブートローダを書き込む
上記の/proc/mdstatの出力をもう一度見てほしい。/dev/sda3と/dev/sdb3からなる/dev/md0/bootにマウントされていて、ここにブート用カーネルイメージとRAMディスクがある。

ブートパーティションなどの扱いはディストリビューションにより微妙に異なる。ここではFedoraを使っている。
 
代替HDDの指定のために、/boot/grub/grub.confを編集する。「title ~」で始まるブロックがブート可能なオプション。
(これより前省略)
#boot=/dev/sda
default=0
timeout=0
splashimage=(hd0,2)/grub/splash.xpm.gz
hiddenmenu
title Fedora (2.6.34.9-69.fc13.i686.PAE)
        root (hd0,2)
        kernel /vmlinuz-2.6.34.9-69.fc13.i686.PAE ro root=/dev/mapper/vg_mill2-LogVol00 rd_MD_UUID=d1a49db9:b462d70c:4d734507:a1a49339 rd_LVM_LV=vg_mill2/LogVol00 rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYTABLE=us rhgb quiet
        initrd /initramfs-2.6.34.9-69.fc13.i686.PAE.img

title Fedora (2.6.34.8-68.fc13.i686.PAE)
        root (hd0,2)
        kernel /vmlinuz-2.6.34.8-68.fc13.i686.PAE ro root=/dev/mapper/vg_mill2-LogVol00 rd_MD_UUID=d1a49db9:b462d70c:4d734507:a1a49339 rd_LVM_LV=vg_mill2/LogVol00 rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYTABLE=us rhgb quiet
        initrd /initramfs-2.6.34.8-68.fc13.i686.PAE.img

(これより後省略)
黄色の部分(hd0,2)すなわち/dev/sda3(からなる/dev/md0)に最新のブートファイル(カーネルイメージとRAMディスク)があることを示している。

代替用ブートパーティションを指定する。 水色の部分が追加された行。
(これより前省略)
#boot=/dev/sda

default=0
fallback=1

timeout=0
splashimage=(hd0,2)/grub/splash.xpm.gz
hiddenmenu

title Fedora (2.6.34.9-69.fc13.i686.PAE)
        root (hd1,2)
        kernel /vmlinuz-2.6.34.9-69.fc13.i686.PAE ro root=/dev/mapper/vg_mill2-LogVol00 rd_MD_UUID=d1a49db9:b462d70c:4d734507:a1a49339 rd_LVM_LV=vg_mill2/LogVol00 rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYTABLE=us rhgb quiet
        initrd /initramfs-2.6.34.9-69.fc13.i686.PAE.img

title Fedora (2.6.34.9-69.fc13.i686.PAE)
        root (hd0,2)
        kernel /vmlinuz-2.6.34.9-69.fc13.i686.PAE ro root=/dev/mapper/vg_mill2-LogVol00 rd_MD_UUID=d1a49db9:b462d70c:4d734507:a1a49339 rd_LVM_LV=vg_mill2/LogVol00 rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYTABLE=us rhgb quiet
        initrd /initramfs-2.6.34.9-69.fc13.i686.PAE.img

title Fedora (2.6.34.8-68.fc13.i686.PAE)
        root (hd0,2)
        kernel /vmlinuz-2.6.34.8-68.fc13.i686.PAE ro root=/dev/mapper/vg_mill2-LogVol00 rd_MD_UUID=d1a49db9:b462d70c:4d734507:a1a49339 rd_LVM_LV=vg_mill2/LogVol00 rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYTABLE=us rhgb quiet
        initrd /initramfs-2.6.34.8-68.fc13.i686.PAE.img

(これより後省略)
fallback=1」で「default=0」すなわち/dev/sdaからのブートに失敗した時は/dev/sdbを試すことを意味し、「title ~」は黄色の部分をコピーしたもので、「root (hd1,2)」でその時のブートファイルは/dev/sdb3(からなる/dev/md0、ただし多分デグレードしたRAID)にあることを示す。もし3台以上のHDDのRAIDでブートできる場合は「fallback=1 2」のように代替ドライブを列挙し、「title ~」の部分をコピーと(hd*,3)の変更で増やしてやる。

grub.confの追加が終わったら、grubを起動して/dev/sdbにブートローダを書き込む。

注意すべきは、普段はBIOSのデフォルトでは最初に見つかったブート可能なHDDすなわち/dev/sda、grubの表現では(hd0)からブートするが、もしこのHDDが死んでしまうと 物理的に2番目のHDDが/dev/sdaまたは(hd0)にマップされること。

だから以下の作業では、まず「device (hd0) /dev/sdb」で物理的に2番目のHDDを一時的に(hd0)にマップし、その後のコマンド実行のときにこのHDDが実際に2番目の物理デバイスからブートするときはブート可能な最初のHDDであることをシミュレートする。
h@spice:~$ sudo grub
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]

grub> device (hd0) /dev/sdb
grub> root (hd0,2)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,2)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
root (hd0,2)」で/dev/sda3(現在は/dev/sdbとして稼働中)にブートファイルがあることを示し、「setup (hd0)」で現在/dev/sdbとして稼働中のHDDにブートローダを書き込む。

全ての作業が終わったら、念のため一旦シャットダウンし、/dev/sda側のHDDのケーブルを外して/dev/sdb側(2番目の物理のHDD)だけで正常にシステムが起動することを確認して終わり。
 

応用

上記の方法を使って、RAIDのHDDをそっくり入れ替えることもできる。
 
うちのファイアウォールに使っているPCのマザーボードはPATAx2とSATAx2の両方が使えるのだが、導入時になぜかPATAしか使えないと勘違いしてPATAx2のRAID1を構築してしまった。その後PATAのHDDの一台が死に、代替品を入れようとしたがPATAのHDDはもう入手困難。いっそのこと新品のSATAのHDD2台にそっくり入れ替える試みをし、成功した。

以下の手順。
  1. PATAのHDD1台で動作している状態(/proc/mdstatが「U_」を表示する)。
  2. 新しいSATAのHDD2台を接続。
  3. SATAHDDのプライマリ側(/dev/sdb)を上記の手順でRAIDに加え、ブートローダもインストールする。
  4. PATAのHDDを外す。
  5. すでにRAIDに加えたSATAのプライマリ側HDDが/dev/sdaになり、片肺飛行のRAIDとして動作している。
  6. セカンダリ側のSATAHDDを上記の手順でRAIDに加え、ブートローダもインストールして完了。











0 件のコメント:

コメントを投稿