badblocks

提供: ArchWiki
2021年8月1日 (日) 20:17時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (カテゴリを追加)
ナビゲーションに移動 検索に移動

badblocks はストレージデバイスの不良ブロックをテストするプログラムです。

HDD の場合は全ての不良セクタを退避させる必要があります。セクタはストレージデバイスのトラックの一部分のことをいい、故障が発生してセクタが使用できなくなるとセクタは不良セクタになります。不良セクタが発生するとテキストファイルの文字が変わってしまったりバイナリプログラムがセグメンテーション違反を起こすようになったりします。

S.M.A.R.T. (Self-Monitoring, Analysis, and Reporting Technology) は今日のほとんど全ての HDD に搭載されているハードウェアの機能で、自動的にセクタを退避させます。ただし badblocks がデバイスの全てのブロックにパターンを書き込んで問題のある領域がないかチェックするのに対して、S.M.A.R.T. は受動的にエラーが発生するのを待つだけです。

badblocks によるテストには破壊的な書き込みモード (デバイスを全て消去します) と、非破壊的な読み書きモードと読み込みモードが存在します。

イントロダクション

厳しい規定があるわけではありませんが、基本的には新しいドライブには不良セクタが全く無いと考えてかまいません。時間が経つにつれて、不良セクタがストレージデバイスに発生します。不良セクタの数が増えるというのはハードドライブの死期が迫っている前触れです。デバイスを交換することが推奨されます。

通常、ストレージデバイスの不良セクタをテストする際はメーカー製のテストプログラムを使うことが推奨されています。ほとんどの HDD メーカーはテスト用のプログラムを用意しています。テストプログラムの中にはドライブを交換するべきかいなかを表示する基準が設けられています。メーカーのテストプログラムによっては、基準を越えている場合にのみ不良セクタの数が表示される場合もあります。ただし、基本的にはメーカーのプログラムのほうが badblocks よりも高速です。

インストール

badblocks は e2fsprogs パッケージに含まれています。

使用方法

不良セクタのテスト

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
標準出力に検出された不良セクタを出力

他のオプション:

-p <number>
指定された回数だけテストを実行
-o </path/to/output-file>
不良セクタを標準出力ではなく <output-file> に出力
-t <test_pattern>
パターンを指定。-t random オプションでランダムなパターンを書き込むことができます。
警告: badblocks は urandom のようにエントロピーを利用するのではなく、特定の「ランダムパターン」を繰り返すだけなので、ブロックデバイス暗号化のように真にランダムなデータを必要とする場合は使用しないでください。

読み書きテスト (非破壊的)

既にデータが存在するデバイス用のテストです。非破壊的な読み書きテストはセクタの元のデータをバックアップしてからパターンを書き込んでテストし、その後はバックアップから中身を元に戻します。メンテナンステストとして有用です。

# 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>
ノート: 0/0/527405 は「読み取りエラー/書き込みエラー/破損エラー」を意味しています。

参照