2008/05/07

RAID5を復旧させる

起動途中に電源を落としたりしたせいで、RAID5のディスク一つの同期が取られなくなり、sdc2が認識されずに下記のような状態 "UU_U"になってしまった。

$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid5 sda2[0] sdd2[3] sdb2[1]
      467370816 blocks level 5, 64k chunk, algorithm 2 [4/3] [UU_U]

unused devices: <none>

ちなみにdmesgに表示されている起動途中のメッセージは次のような感じです。

[   75.015810] md: md0 stopped.
[   75.023087] md: bind
[   75.023280] md: bind
[   75.023460] md: bind
[   75.023634] md: bind
[   75.023706] md: kicking non-fresh sdc2 from array!
[   75.023764] md: unbind
[   75.023818] md: export_rdev(sdc2)
[   75.029305] raid5: device sda2 operational as raid disk 0
[   75.029363] raid5: device sdd2 operational as raid disk 3
[   75.029418] raid5: device sdb2 operational as raid disk 1
[   75.030264] raid5: allocated 4262kB for md0
[   75.030322] raid5: raid level 5 set md0 active with 3 out of 4 devices, algorithm 2

さて、ここで sdc2 を復旧します。すでにsdc2はremoved状態になっているので

$ sudo mdadm -D /dev/md0
....
    Number   Major   Minor   RaidDevice State
       0       8        2        0      active sync   /dev/sda2
       1       8       18        1      active sync   /dev/sdb2
       2       0        0        2      removed
       3       8       50        3      active sync   /dev/sdd2

追加は普通にmdadmで追加します。

$ sudo mdadm /dev/md0 --add /dev/sdc2

この直後は/proc/mdstatに進捗が表示されるので終るまで過激なI/Oは一応避けます。

$ while true ; do cat /proc/mdstat ; sleep 5 ; done
$ cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid5 sdc2[4] sda2[0] sdd2[3] sdb2[1]
      467370816 blocks level 5, 64k chunk, algorithm 2 [4/3] [UU_U]
      [>....................]  recovery =  0.1% (201996/155790272) finish=51.3min speed=50499K/sec

さて本格的に壊れなくてよかったなと思いますが、起動する度に sda2 や sdb2 が見えなかった事もあったので物理的には弱いと思いますが、論理的な破壊では意外にRAID5は頑丈なのかもしれません。RAID10も復旧に関しては同じか、RAID5よりもお手軽に解決するでしょうけれども。 まぁバックアップはpdumpfsを使ってUSB接続の外部ディスクに/usr/local, /homeに限定して定期的に取っているので何かあっても大丈夫でしょう。

0 件のコメント: