たごもりすメモ

コードとかその他の話とか。

Linux Software RAIDでmdをベリファイする

RHEL系OSでmdadmを入れていると cron.weekly にraid-checkというスクリプトが入る。これは作成済みのmdすべてに対してベリファイをかけるもので、何も考えていないLinux Software RAID利用者でも実は既にベリファイは行われていたんだよ! なんだってー! というものでたいへんありがたい。
設定は /etc/sysconfig/raid-check にあるので適当にいじるよろし。

複数mdがある場合

しかしこのスクリプト、実はちょっと困る。複数のmdが構成されているときにそのすべてに "check" を実行してしまうため、2つ以上のアレイがある場合に一時的にものすごく負荷がかかって他の処理に影響が出かねない。また各々のアレイのチェックの所要時間も延びてしまう。こういう場合は raid-check の対象から各mdを外してやった上で自分でcronでベリファイを起動してやればいい。

ちなみにベリファイの処理自体は md0 が対象だったら以下のようにすれば起動する。

echo "check" > /sys/block/md0/md/sync_action

実行したら cat /proc/mdstat で状況を確認できる。

$ cat /proc/mdstat 
Personalities : [raid1] [raid6] [raid5] [raid4] 
md0 : active raid1 sda1[0] sdb1[1]
      976759936 blocks [2/2] [UU]
      [>....................]  check =  0.0% (278528/976759936) finish=408.9min speed=39789K/sec

ただし md の状態(リビルド中だったりとか!)に check とかやっちゃうと結果がどうなるかは想像してみるだに恐ろしかったりするので、あんまりこれをカジュアルに実行するのはオススメできない。また定期的に実行したいとき、たとえばmdがリビルド中だったりしたときの例外処理とかまでcrontabに書くのはちょっと面倒。

ということで、昔に書いたそのためのスクリプトがあるので、紛失防止も含めて貼っておいた。
Run "check" about specified md device if it's status is "idle"
mdの状態が "idle" のときにだけ "check" を実行するようになっているので、いちおう安心できる……はず。自宅サーバRAID-6アレイはもうこのスクリプトを5年間走らせていて、いちおう問題は起きてない。*1
こんなふうに使うとよろしかろう。

30	3	*	*	Mon	/root/md_sync_call.sh md1
0	3	*	*	Fri	/root/md_sync_call.sh md2

しかし中身見てみると相当……いやまあ動いてるからいじらないけどさ。くれぐれも自己責任で。

*1:ていうかさっき last-modified を見てちょっとびびった。この頃は raid-check とかなかったから自分で書いたんだよなー。