2008/02/14(木)Linux の badblocks コマンド

Linuxでディスクエラーをチェックするコマンドbadblocksについて。

fsck

man。ファイルシステムのエラーをチェックするプログラム。ディスクの物理エラーを調べてはくれない。

# fsck /dev/hda1

badblocks

デバイスそのもののエラーをチェックする。

# badblocks -s -v /dev/hda	読み出しテスト
# badblocks -s -v -n /dev/hda	非破壊読み書きテスト
# badblocks -s -v -w /dev/hda	破壊読み書きテスト

HDDの区画ではなくHDD全体を与えるのがミソ。破壊テストでは「0xaa, 0x55, 0xff, 0x00」を書き込み読み出してテストします。"-s -v"は進捗などを表示する指定。

一度にテストするサイズは -b(ブロックサイズ)と -c(ブロック数)で指定します。

# badblocks -s -v -b 1024 -c 256 /dev/hda	1024*256

マウントされているディスクでは読み出しテストしかできません。シングルユーザーモードでは読み書きテストができるみたいですが。

非破壊読み書き検査について

非破壊読み書き検査は次の手順で行われます。

  1. ディスクから現在のデータを読み出す
  2. ディスクにテストパターンを書き込む
  3. バッファをフラッシュする
  4. ディスクから読み込み書き込んだテストパターンと比較する
  5. 最初に読み込んだデータを書き戻す

Linuxカーネルで「O_DIRECT」というフラグが使えれば、2と4では O_DIRECT 用いてディスクと直接やりとりをします(ディスクキャッシュを抑制します)。これは比較的最近のカーネルでないとまともに使えないようです。

CTRL-Cなどで止めると大変なことになるので、プログラム側でCTRL-Cで落ちないように抑制されています。(上に書いたとおりですので、この検査をkillとかで止めると大変なことになります。)

非破壊テストは破壊テスト並のチェックができますが、単純な破壊テストよりもメモリと時間が食います。