「Badblocks」の版間の差分
(→ファイルシステムの作成前: 情報を更新) |
(不良セクタを見つけるを翻訳して追加) |
||
166行目: | 166行目: | ||
# badblocks -b ''block size'' |
# badblocks -b ''block size'' |
||
+ | |||
+ | == 不良セクタを見つける == |
||
+ | |||
+ | badblock を使用して不良セクタを見つけることができます。''badblocks'' ではセクターを ''ブロック'' と呼ぶことに注意してください。いくつかのスキャンモードをサポートしています。最も精度の低い読み取り専用モード (デフォルト) があります。破壊的書き込みモード ({{ic|-w}} オプション) これは最も正確ですが、時間がかかり、ドライブ上のすべてのデータが (明らかに) 破壊されるため、セクターとファイルの照合にはまったく役に立ちません。最後に、非破壊読み取り/書き込みモードが登場しました。これはおそらく破壊モードと同じくらい正確ですが、おそらく最も遅いという唯一の本当の欠点があります。ただし、ドライブに障害が発生していることがわかっている場合は、おそらく読み取り専用モードが最も安全です。 |
||
+ | |||
+ | 詳細 ({{ic|-v}} オプション)、読み取り専用スキャンを実行するには、次のコマンドのいずれかを実行します ({{ic|x}} はドライブ文字、{{ic|y}} はスキャンしたいパーティション番号): |
||
+ | |||
+ | ディスク全体のスキャン: |
||
+ | # badblocks -v /dev/sdx |
||
+ | |||
+ | 単一パーティションのスキャン: |
||
+ | # badblocks -v /dev/sdxy |
||
+ | |||
+ | ドライブ全体をスキャンする場合の欠点は、各ファイルシステムが、そのファイルシステムが存在するパーティションを基準にしてブロック数を開始することです。これは、たとえば 2 番目のパーティション上に不良ブロックがあり、そのパーティションがブロック 1000 から始まる場合、必要な番号を取得するにはブロック番号から 1000 を減算する必要があることを意味します。したがって、ディスクの先頭からのスキャンの結果、ブロック番号 1005 が不良であることが判明した場合、実際に使用されるのは 2 番目のパーティションのブロック 5 になります。 |
||
+ | |||
+ | それ以外の場合、フルスキャンの実行後に不良ブロックが見つかった場合は、ブロックの計算を行うことなく、単純にそれらが存在するパーティションを特定し、それらを再スキャンしてブロック番号を取得できます。 |
||
+ | |||
+ | もう 1 つ注意すべき点は、badblock のデフォルトは 1024 バイトブロックであるため、ファイルシステムと一致させるために {{ic|-b}} オプションを使用してデフォルトサイズを変更するか、後でブロック番号を手動で変換する必要があることです。 |
||
+ | |||
+ | パーティションの始まりと終わりを知る必要がある場合は、[[fdisk]] を実行してください。[[fdisk]] が使っているブロックサイズをメモしておけば、スキャンに合わせてブロック数を変換できます。 |
||
+ | |||
+ | {{hc|# fdisk -l /dev/sdx|2= |
||
+ | 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 |
||
+ | }} |
||
+ | |||
+ | これで、不良ブロックのブロック番号と、そのブロックが存在するパーティションとの相対関係がわかるはずです。 |
||
== 参照 == |
== 参照 == |
2023年12月29日 (金) 10:40時点における版
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 -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
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
これで、不良ブロックのブロック番号と、そのブロックが存在するパーティションとの相対関係がわかるはずです。