badblocks

提供: ArchWiki
2023年12月29日 (金) 10:32時点におけるKgx (トーク | 投稿記録)による版 (→‎ファイルシステムの作成前: 情報を更新)
ナビゲーションに移動 検索に移動

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 オプションでランダムなパターンを書き込むことができます

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

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

参照