badblocks

提供: ArchWiki
ナビゲーションに移動 検索に移動

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

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

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

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

インストール

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

使用法については、badblocks(8) を参照してください。

ストレージデバイスの忠実度

明確な規則はありませんが、新しいドライブには不良セクタがゼロであるべきであると考えるのが一般的です。時間の経過とともに不良セクタが発生します。不良セクタをファイルシステムに定義して回避することはできますが、ドライブを継続的に使用すると、通常、さらに不良セクタが形成され、それは最終的にドライブが停止する前兆となります。デバイスの交換をお勧めします。

他のプログラムとの比較

ストレージデバイスの不良セクタをテストするための一般的な推奨方法は、メーカーのテストプログラムを使用することです。ほとんどのメーカーがこのプログラムを用意しています。その主な理由は、メーカーが通常、ドライブの交換が必要かどうかを判断する基準をテストプログラムに組み込んでいるからです。ここでの注意点は、一部のメーカーのテストプログラムでは、完全なテスト結果が得られず、合格か不合格かだけを言って不良セクタの数を許可していることです。しかし、メーカーのプログラムは一般的に 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 オプションでランダムなパターンを書き込むことができます

特定のテストパターンを定義する

manpageより: "test_pattern には 0 から ULONG_MAX-1 までの数値を指定することができます [...]"

ランダムパターン

-t random オプションを使用すると、Badblocks に単一の ランダムパターン を繰り返し書き込むことができます。

# badblocks -wsv -t random /dev/device
Checking for bad blocks in read-write mode
From block 0 to 488386583
Testing with random pattern: done                                                 
Reading and comparing: done                                                 
Pass completed, 0 bad blocks found. (0/0/0 errors)
警告: 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>

ファイルシステムの作成前

ファイルシステムを作成する前に実行することもできます。

-o オプションを指定せずに badblocks を実行すると、不良セクタは stdout にのみ出力されます。

ディスクの先頭での読み取りエラーの出力例:

# badblocks -wsv /dev/drive
[...]
Testing with pattern 0xff: done                                                 
Reading and comparing:
[...]
37584
37585 0.84% done, 7:31:08 elapsed. (0/0/527405 errors)
37586
[...]
done
Testing with pattern 0x00:
Reading and comparing:
[...]
37584
37585
[...]
done
Pass completed, 527405 bad blocks found. (0/0/527405 errors)

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)

次に、次の情報を使用してファイルシステムを (再) 作成します:

# mke2fs -t filesystem-type -l /root/badblocks.txt /dev/device
ノート: 0/0/527405 エラーの意味は、読み取りエラー数 / 書き込みエラー数 / 破損エラー数です

Ext4

mke2fs(8) マニュアルページから:

不良ブロックリスト内のブロック番号は、mke2fs で使用されるのと同じブロックサイズを使用して生成される必要があることに注意してください。その結果、mke2fs-c オプションは、ディスクをフォーマットする前に不良ブロックがないかチェックします、これは、はるかに簡単でエラーが発生しにくい方法です。

したがって、推奨される方法は次のとおりです:

# mkfs.ext4 -c /dev/device

-cc を使用して、読み取り/書き込み不良ブロックテストを実行します。

ブロックサイズ

まず、ファイルシステムの ブロックサイズ を見つけます。たとえば、ext# ファイルシステムの場合は次のようになります。

# dumpe2fs /dev/device-PARTITION | grep 'Block size'

これを badblocks にフィードします:

# badblocks -b block size

不良セクタを見つける

badblock を使用して不良セクタを見つけることができます。badblocks ではセクターを ブロック と呼ぶことに注意してください。いくつかのスキャンモードをサポートしています。最も精度の低い読み取り専用モード (デフォルト) があります。破壊的書き込みモード (-w オプション) これは最も正確ですが、時間がかかり、ドライブ上のすべてのデータが (明らかに) 破壊されるため、セクターとファイルの照合にはまったく役に立ちません。最後に、非破壊読み取り/書き込みモードが登場しました。これはおそらく破壊モードと同じくらい正確ですが、おそらく最も遅いという唯一の本当の欠点があります。ただし、ドライブに障害が発生していることがわかっている場合は、おそらく読み取り専用モードが最も安全です。

詳細 (-v オプション)、読み取り専用スキャンを実行するには、次のコマンドのいずれかを実行します (x はドライブ文字、y はスキャンしたいパーティション番号):

ディスク全体のスキャン:

# badblocks -v /dev/sdx

単一パーティションのスキャン:

# badblocks -v /dev/sdxy

ドライブ全体をスキャンする場合の欠点は、各ファイルシステムが、そのファイルシステムが存在するパーティションを基準にしてブロック数を開始することです。これは、たとえば 2 番目のパーティション上に不良ブロックがあり、そのパーティションがブロック 1000 から始まる場合、必要な番号を取得するにはブロック番号から 1000 を減算する必要があることを意味します。したがって、ディスクの先頭からのスキャンの結果、ブロック番号 1005 が不良であることが判明した場合、実際に使用されるのは 2 番目のパーティションのブロック 5 になります。

それ以外の場合、フルスキャンの実行後に不良ブロックが見つかった場合は、ブロックの計算を行うことなく、単純にそれらが存在するパーティションを特定し、それらを再スキャンしてブロック番号を取得できます。

もう 1 つ注意すべき点は、badblock のデフォルトは 1024 バイトブロックであるため、ファイルシステムと一致させるために -b オプションを使用してデフォルトサイズを変更するか、後でブロック番号を手動で変換する必要があることです。

パーティションの始まりと終わりを知る必要がある場合は、fdisk を実行してください。fdisk が使っているブロックサイズをメモしておけば、スキャンに合わせてブロック数を変換できます。

# fdisk -l /dev/sdx
Disk /dev/sdx: 149.05 GiB, 160041885696 bytes, 312581808 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

これで、不良ブロックのブロック番号と、そのブロックが存在するパーティションとの相対関係がわかるはずです。

再マッピングとの相互作用

SMART を搭載した HDD コントローラーは、一般的に不良セクタの再マッピングが可能です。それでも、不良セクタでの読み出しの再試行には時間を浪費しますが、書き込みでは、(エラーが "ソフト" な場合、つまり ECC 故障の場合) 何とか修正するか、予備セクタが枯渇していない限り、予備セクタに再マッピングします。

  • 非破壊 RW モードでは、不良ブロックは最初にセクタの読み取りを試みます。その結果、"ソフト" と "ハード" 両方の不良セクタが不良とみなされ、それ以上のテストは行われません。SMART では、保留数が変わらないか増加していることがわかります。
  • 破壊的 RW モードでは、badblocks が最初に書き込みを行います。その結果、再マップがトリガーされ、セクターがアクセス可能になるという点で "修正" される必要があります。SMART では保留中のセクター数が減少する一方で、再割り当てされた数は変化しないまま ("ソフト" の場合)、または増加する ("ハード" の場合) ことがわかります。badblocks は、セクターが本来の設計どおりにデータを忠実に保持しているかどうかのテストを続けます。

非破壊テストの不良ブロックリストを使用して書き込みを強制することができます。LBA 範囲を計算し、hdparm --read-sector を使用して単一セクターに絞り込み、最後に hdparm --write-sector [1] を使用して書き込みをトリガーします。このセクターでの今後の再試行は諦めることになりますが、少なくとも読み取りハングはもう発生しません。

代替案

badblocks はもともとフロッピーディスクを検証するために作成されたため、その設計は最新の HDD 用に解釈されていません。18 TB ドライブなどのサイズでは、-b 4096 [2] を使用するという通常のヒントも役に立ちません。これは代替案です:

  1. デバイスの上の暗号化レイヤーをスパンする: cryptsetup open /dev/device name --type plain --cipher aes-xts-plain64
  2. 現在開かれている復号化されたレイヤーにゼロを入力し、暗号化データとして書き込まれます: shred -v -n 0 -z /dev/mapper/name
  3. 新しいゼロを復号化されたレイヤーと比較します: cmp -b /dev/zero /dev/mapper/name ファイルの終わりに関するメッセージが表示されて停止するだけであれば、ドライブは正常です。この方法は、1 回のパスでも Badblock よりもはるかに高速です。コマンドが完全な書き込みを実行すると、(ディスクコントローラに認識されている) も除去されるはずです。

btrfs と ZFS では、設計者はフロッピー時代の不良ブロックリストはもう必要ないと判断しました。欠陥を上書きする限り、通常は正しいものになります (上記を参照) 再試行しても読み取りがハングします。昔のように不良ブロックを "分離" したい場合は、パーティション分割またはLVMによる下位レベルのソリューションを使用してください。

最新の回転ドライブでは、smartctl -t long /dev/device (SMART を参照) は完全な読み取り専用テストを実行します。障害が見つかるとすぐに停止し、LBA_of_first_error データエントリとして記録します。その後、hdparm で上書きできます (上記を参照) フォローアップの選択テストで失敗をスキップできます。