RHELではraid-checkというスクリプトがあるけどDebianではcheckarrayがある

まず

タイトルだけ読んでもなんのことかわからないと思うので、まずこの記事を読んだりして調べたことのメモです。
RAIDレベルの話: 1+0と6はどっちが安全か? - たごもりすメモ


ようするに、HDDが壊れた時にRAIDコントローラに通知する機能はHDDにはない。
つまり、RAIDでHDDがfailしたと判定されるのはI/Oの結果、読み出しが失敗した場合。
なので、HDD中に実は読み出し不可能なブロックがあるが、長い間参照されていないために潜在的なfail状態という場合がありうる。
1台目が壊れてHDDを交換してリビルド中に古いファイルを参照した瞬間、2台目も実はfailしていた、という場合がある。
これの対策としては全ブロックを走査する定期的なベリファイで予防が可能、とのこと。


長くなるので自分の言葉で書き直してみたけど説明分かりにくかったら上の記事見てください。
あと元記事に書いてあることは、今回自分が要約したことだけじゃないので、一度全て見ておくことをオススメします。

じゃあベリファイしてくれるツールを探してみた

なので今日ベリファイをするツールを探してたら、RHELではmdadmを入れるとcron.weeklyにraid-checkっていうスクリプトが入るらしい。
Linux Software RAIDでmdをベリファイする - たごもりすメモ

Debianでは同じようなのないかなーと思って探したら、checkarray*1というのがあるようだ。
なのでmdadmを入れれば自動的にベリファイする状態になっている。(cronが有効であれば)


これは/etc/cron.d/mdadmから呼ばれていて、raid-checkとか上の記事にあるid:tagomorisさんの自作スクリプトと同じように「echo "check" >/sys/block/md0/md/sync_action」している。
こうすることでRAIDアレイのベリファイが行われるようだ。

# By default, run at 00:57 on every Sunday, but do nothing unless the day of
# the month is less than or equal to 7. Thus, only run on the first Sunday of
# each month. crontab(5) sucks, unfortunately, in this regard; therefore this
# hack (see #380425).
57 0 * * 0 root if [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ]; then /usr/share/mdadm/checkarray --cron --all --idle --quiet; fi

なんだかごちゃごちゃしてるけど、基本1週間に1回実行して、日付が7日かそれより少ない時(1-6日)には何もしない。
ごちゃごちゃしてるのはcrontabがうんこなので仕方がないよ、というようなことを書いている。(BTSは見てない)

2012-05-05 18:42 追記:tnakaさんからコメント頂きました。

checkarrayは月に一度、最初の日曜日に実行されるようになっています。
cronでは曜日と日付をandで指定できないので、cronで週1で実行しシェルスクリプトで月始めだけ実行するようにしているようです。

なるほど。ちょっと読み間違ってました。ありがとうございます。

オプションの意味

実際checkarrayが呼ばれてる部分の--cron --all --idle --quietのオプションの意味とか調べてみた。

  • -c, --cron
    • 「-c|--cron & honour AUTOCHECK setting in /etc/default/mdadm.」
    • 翻訳:/etc/default/mdadmの環境変数AUTOCHECKでRAIDアレイをチェックするか決定する。AUTOCHECK=falseだったらチェックしない。
    • 補足:デフォルトでtrueなので、/etc/default/mdadmいじってなければチェックする設定になってるはず。
  • -a, --all
    • 「-a|--all & check all assembled arrays (check /proc/mdstat).」
    • 翻訳:全てのRAIDアレイをチェックする。
    • 補足:-aを指定しない場合、引数で/dev/md0とか指定すればそれをチェックするみたい。
    • 補足2:helpには/proc/mdstatを見るって書いてあるけど実際には「arrays="(ls -d1 /sys/block/md* | cut -d/ -f4)")」とかしてた。
  • -i, --idle
    • 「-i|--idle & perform check in a lowest I/O scheduling class (idle).」
    • 翻訳:I/Oに対して低い優先度で動くようにする。
  • -q, --quiet
    • 「-q|--quiet & suppress informational messages.」
    • 翻訳:補足的なメッセージを出力しない。
    • 補足:警告とかエラーは出力する。それも出力させたくない場合は-Qか--real-quietを使う。

*1:Debian squeeze, mdadm v3.1.4 だと /usr/share/mdadm/checkarray だった