テスト ファイルでディスク パーティションの不良ブロックをエミュレートするにはどうすればよいですか?

テスト ファイルでディスク パーティションの不良ブロックをエミュレートするにはどうすればよいですか?

実際に適用する前に、いくつかのディスク復旧方法、特に、すべてのコピーで 1 つの不良ブロックが不良ではないと仮定して、ddrescue が複数のディスク コピーから不良ブロックを復元する機能をテストしたいと思います。

Linux ではデバイスはファイルで表現されるため、ファイル内の不良ブロックをマークできると思います。次のように参照ファイルとそのコピーを 2 つ作成したとします。

dd if=/dev/random of=/tmp/file bs=1024 count=32768
cp /tmp/file /tmp/file1
cp /tmp/file /tmp/file2

file1 と file2 の不良ブロックをデバイス ファイルのようにエミュレートするにはどうすればよいですか?

ソリューションここここカミル・マチョロウスキーとここ解決策への良い道筋ではあるが、私のユースケースに完全な方法を提供していない

答え1

Kamil Maciorowski 氏の提案と他の場所での回答のおかげで、次のプロセスを構築してテストすることができました。

1) テストファイルを作成し、そのハッシュを計算して将来の回復を確認する

dd if=/dev/urandom of=/tmp/file bs=512 count=32768 status=progress
sha256sum /tmp/file
f90c19308f9f216bf7dece09dd849eb40e97cdef86c6c37f28fbaf9a7bd07503  /tmp/file

2) それを使ってデバイスを作成する

loopdev=\`losetup -f --show /tmp/file\`
echo $loopdev
/dev/loop1

3) デバイスマッパーを使用して不良ブロックを含む破損したデバイスを作成する

dmsetup create file1 << EOF
    0  2048 linear $loopdev 0
 2048  4096 error
 6144  26624 linear $loopdev 6144
EOF

dmsetup create file2 << EOF
    0  30720 linear $loopdev 0
 30720  2048 error
EOF

ls -l /dev/mapper/
lrwxrwxrwx 1 root root       7 mai   30 09:27 file1 -> ../dm-2
lrwxrwxrwx 1 root root       7 mai   30 09:27 file2 -> ../dm-3

各行の最初の数字は位置、2 番目の数字はサイズです。最後の行の合計はファイルのサイズです: 6144 + 26624 = 32768、30720 + 2048 = 32768

この行は6144 26624 linear $loopdev 6144、デバイス $loopdev をオフセット 6144 (バイト単位) からオフセット 6144 (バイト単位) の file1 に、サイズ 26624 バイトでコピーすることを意味します。

4) 予想される場所でのI/Oエラーをチェックする

dd if=/dev/mapper/file1 of=/dev/null count=2048
ok
dd if=/dev/mapper/file1 of=/dev/null count=2049
dd: error reading '/dev/mapper/file1': Input/output error
dd if=/dev/mapper/file2 of=/dev/null count=30720
ok
dd if=/dev/mapper/file2 of=/dev/null count=30721
dd: error reading '/dev/mapper/file2': Input/output error

この段階で、OP の質問に対する回答は得られました。テストを完了するためにさらに進みましょう。

5) ddrescue をテスト: 正常なブロックのみ

ddrescue -B -v -n /dev/mapper/file1 /tmp/file1 /tmp/log
percent rescued:  87.50%
sha256sum /tmp/file1
0d344253f69688e23dd4558c2ffdabb0325f85848f7e65788ea5c9441e7a700c  /tmp/file1

6) 2番目のコピーで不良ブロックを正常に修復する

ddrescue -B -v -c 16 -r 2 /dev/mapper/file2 /tmp/file1 /tmp/log
percent rescued: 100.00%
sha256sum /tmp/file1
f90c19308f9f216bf7dece09dd849eb40e97cdef86c6c37f28fbaf9a7bd07503  /tmp/file1

7) 必要な場合(100%ではない)、最初のコピーで不良ブロックの救済を試みる

ddrescue -B -v -c 16 -r 2 /dev/mapper/file1 /tmp/file1 /tmp/log

8) クリーンアップ

dmsetup remove file1
dmsetup remove file2
unset loopdev
rm /tmp/file* /tmp/log

関連情報