2012/12/31(Mon)Linux Software RAIDのディスク交換と容量増加のオペレーションまとめ

2012/12/31 15:41 Software::Linux
RAIDというものは、バックアップの代替となるものでもないし、ディスクを冗長化してもコントローラが壊れることもあるし、syncに時間がかかって逆にディスクを痛めつけてるのでは…と思うこともあり、決してRAID万歳派ではないのだが、ディスク障害が起こってもすぐに交換できないような場所にはまだ効果もあるだろう。
てなわけで、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の移行
  1. 新旧のディスクのみを接続し、移行後のディスクをfdiskとmkfs.ext4してからdump, restoreでコピー
  2. /etc/fstabのUUIDを適当に書き換える(tune2fsを使ってディスク側を合わせてもOK)
/dev/md0の移行
  1. /dev/sdbをRAIDから脱退し、シャットダウン
  2. /dev/sdbを新しいものに交換、fdiskとresync (約1h)
  3. /dev/sdcをRAIDから脱退し、シャットダウン
  4. /dev/sdcを新しいものに交換、fdiskとresync (約1h)
  5. RAIDアレイを拡大し、resync (約1.5h)
  6. ext3ファイルシステムをパーティションサイズに拡大し、resync (数時間、寝落ちしたので不明)
RAIDの方は自動的にresyncがかかるため、mkfsする必要はない模様。
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を指定できる
# mount /dev/sdc1 /mnt/sdc1 # cd /mnt/sdc1 # dump -0uf - /dev/sdb1 | restore -xf - コピーが終わるまでしばらく待つ

次にブートローダーのインストールを行う。
#  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ディスクの変更

  1. 新システムディスクで起動
    新しいシステムディスクと移行前のRAID1ディスクの組を繋いで、シングルユーザモードで起動。余計なディスクアクセスは抑制する。
    (ここで、すんなり起動しない場合は何か忘れている)
  2. /dev/sdb1をアレイから脱退
    --failで故障マークをつけ、--removeでアレイから脱退させる。
    #  mdadm /dev/md0 --fail /dev/sdb1
    
    #  mdadm /dev/md0 --remove /dev/sdb1
    
  3. /dev/sdbを新ディスクに交換
    一旦シャットダウンして、/dev/sdbを新しいディスクに交換し、再度シングルユーザモードで起動。
  4. fdiskで/dev/sdbにパーティション情報を設定
    #  fdisk /dev/sdb
    
    やることは、新パーティションを作成して、パーティションタイプを0xfd(Linux RAID)にするだけ。フォーマットは不要。
  5. /dev/sdb1をアレイに参加
    --addで追加すると、自動的にresyncが開始される
    #  mdadm /dev/md0 --add /dev/sdb1
    
    別窓で、$ watch -n 1 cat /proc/mdstatなんてやっておくと、resync状況を確認できる。
    # mdadm --wait /dev/md0 && beep等で処理完了を通知することもできる。
  6. /dev/sdc1をアレイから脱退
    /dev/sdbと同様に。パス指定を間違わないように注意。
    #  mdadm /dev/md0 --fail /dev/sdc1
    
    #  mdadm /dev/md0 --remove /dev/sdc1
    
  7. /dev/sdcを新ディスクに交換
    一旦シャットダウンして、/dev/sdcを新しいディスクに交換し、再度シングルユーザモードで起動。
  8. fdiskで/dev/sdcにパーティション情報を設定
    #  fdisk /dev/sdc
    
  9. /dev/sdc1をアレイに参加
    #  mdadm /dev/md0 --add /dev/sdc1
    
  10. アレイの拡大
    このままでは、新ディスクに大きなパーティションを確保しているとはいえ、RAID1上では旧ディスクのアレイ・ファイルシステムを維持しているので、それを拡大する作業が必要。
    まずは、アレイの拡大から。
    #  mdadm --grow /dev/md0 --size=max
    
    例えば、500GBから1TBに拡大した場合、50%からresyncが始まる模様。
  11. ファイルシステムの拡大
    特にサイズの指定は不要。内容は維持したまま、パーティションサイズに合うようにフィッティングされる。
    #  resize2fs -p /dev/md0
    
    進捗状況は$ watch -n 1 df -kで確認すればよいかな?
  12. 完了
    $ 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時間毎くらいにちょっとずつ作業が必要だったので、何か別のことをしながら合間にやる方がいいかも。

*1 : # mount -o ro /dev/sdX1 /mnt/sdX

参考文献

以下の内容をとても参考にさせて頂きました。ありがとうございます。
(やってることはほぼそのままですが、この記事は防備録として書いています…)
Linux ソフト RAID1 のハードディスクを取り替える - LinuxとかOSSで色々やってみる
RAID1の容量を増やす | へっぽこメモ