badblocks
badblocks はストレージデバイスの不良ブロックをテストするプログラムです。
HDD の場合は全ての不良セクタを退避させる必要があります。セクタはストレージデバイスのトラックの一部分のことをいい、故障が発生してセクタが使用できなくなるとセクタは不良セクタになります。不良セクタが発生するとテキストファイルの文字が変わってしまったりバイナリプログラムがセグメンテーション違反を起こすようになったりします。
S.M.A.R.T. (Self-Monitoring, Analysis, and Reporting Technology) は今日のほとんど全ての HDD に搭載されているハードウェアの機能で、自動的にセクタを退避させます。ただし badblocks がデバイスの全てのブロックにパターンを書き込んで問題のある領域がないかチェックするのに対して、S.M.A.R.T. は受動的にエラーが発生するのを待つだけです。
badblocks によるテストには破壊的な書き込みモード (デバイスを全て消去します) と、非破壊的な読み書きモードと読み込みモードが存在します。
目次
インストール
badblocks は e2fsprogs パッケージに含まれています。
ストレージデバイスの忠実度
明確な規則はありませんが、新しいドライブには不良セクタがゼロであるべきであると考えるのが一般的です。時間の経過とともに不良セクタが発生します。不良セクタをファイルシステムに定義して回避することはできますが、ドライブを継続的に使用すると、通常、さらに不良セクタが形成され、それは最終的にドライブが停止する前兆となります。デバイスの交換をお勧めします。
他のプログラムとの比較
ストレージデバイスの不良セクタをテストするための一般的な推奨方法は、メーカーのテストプログラムを使用することです。ほとんどのメーカーがこのプログラムを用意しています。その主な理由は、メーカーが通常、ドライブの交換が必要かどうかを判断する基準をテストプログラムに組み込んでいるからです。ここでの注意点は、一部のメーカーのテストプログラムでは、完全なテスト結果が得られず、合格か不合格かだけを言って不良セクタの数を許可していることです。しかし、メーカーのプログラムは一般的に badblocks よりも早く、時にはかなり早い場合もあります。
使用方法
不良セクタのテスト
Linux で不良セクタをテストするには、通常、プログラム badblocks が使用されます。badblocks には、不良セクタを検出できるいくつかの異なるモードがあります。
読み書きテスト (破壊的)
新しいドライブを試験するためのテストです。デバイスの全てのブロックにパターンが書き込まれるため、事実上、デバイスの中身は 完全に消去 されます。デフォルトでは4つの異なるパターンを使用して広範囲にテストが行われます: 0xaa (10101010), 0x55 (01010101), 0xff (11111111), 0x00 (00000000) デバイスによってはテスト完了まで数日かかります。
# badblocks -wsv /dev/<device>
Checking for bad blocks in read-write mode From block 0 to 488386583 Testing with pattern 0xaa: done Reading and comparing: done Testing with pattern 0x55: done Reading and comparing: done Testing with pattern 0xff: 22.93% done, 4:09:55 elapsed. (0/0/0 errors) [...] Testing with pattern 0x00: done Reading and comparing: done Pass completed, 0 bad blocks found. (0/0/0 errors)
上記のコマンドで使用しているオプション:
-w
- 破壊的な書き込みテストを実行
-s
- プログレスバーを表示
-v
- 標準出力に検出された不良セクタを出力
他のオプション:
-b number
- ハードディスクのブロックサイズを指定することで、テスト時間を大幅に改善できます。root ユーザーとして (
tune2fs -l partition | grep 'Block size'
) -p number
- 指定された回数だけテストを実行
-o /path/to/output-file
- 不良セクタを標準出力ではなく <output-file> に出力
-t test_pattern
- パターンを指定。
-t random
オプションでランダムなパターンを書き込むことができます
読み書きテスト (非破壊的)
既にデータが存在するデバイス用のテストです。非破壊的な読み書きテストはセクタの元のデータをバックアップしてからパターンを書き込んでテストし、その後はバックアップから中身を元に戻します。メンテナンステストとして有用です。
# badblocks -nsv /dev/<device>
Checking for bad blocks in non-destructive read-write mode From block 0 to 488386583 Checking for bad blocks (non-destructive read-write test) Testing with random pattern: done Pass completed, 0 bad blocks found. (0/0/0 errors)
-n
オプションによって非破壊的な読み書きテストが実行されます。
ファイルシステムから不良セクタ情報を使う
不良セクタを使用しないようにするにはファイルシステムに知らせる必要があります。
ファイルシステムのチェック時
ファイルシステムのチェックユーティリティ (fsck
) によってチェック時に badblocks を使うことができます。読み書きテスト (非破壊的) を実行してファイルシステムに不良セクタの場所を記録させるには:
# fsck -vcck /dev/<device-PARTITION>
-cc
オプションによって非破壊的なテストモードで fsck
が実行され、-v
によって出力が表示され、-k
オプションによって前の不良セクタ情報も維持されます。
読み込みテストを実行するには (非推奨):
# fsck -vck /dev/<device-PARTITION>
ファイルシステムの作成前
ファイルシステムを作成する前に実行することもできます。
badblocks のエラー出力をファイルシステムに渡すために、不良セクタ情報をファイルに書き出してください:
# badblocks -wsv -o /root/<badblocks.txt> /dev/<device>
Checking for bad blocks in read-write mode From block 0 to 488386583 Testing with pattern 0xaa: done Reading and comparing: 6.36% done, 0:51 elapsed. (0/0/14713 errors) [...] Testing with pattern 0x00: done Reading and comparing: done Pass completed, 527405 bad blocks found. (0/0/527405 errors)
作成された情報を使ってファイルシステムを作成:
# mkfs.<filesystem-type> -l /root/<badblocks.txt> /dev/<device>