LUKSとXFSを使用しているディスク上のどのファイルが不良ブロックの影響を受けるかどうかを確認するにはどうすればよいですか?

LUKSとXFSを使用しているディスク上のどのファイルが不良ブロックの影響を受けるかどうかを確認するにはどうすればよいですか?

私の設定は次のとおりです。パーティションがなく、LUKS1とXFSのみがあります。

確認のために、ディスク設定はdisk mount、luksFormat、luksOpen、mkfs.xfs、install、get startです。

まず、不良ブロックにはどのブロックサイズを使用する必要がありますか?のようである:

不良ブロックに最適なブロックサイズとブロック数を選択するには?

lsblk -o NAME,PHY-SeC /dev/sdb

結果:4096

物理デバイスで不良ブロックを実行しています。つまり:

badblocks -b 4096 /dev/sdb -sv 

不良ブロック3個を発見しました。

LUKSとXFSの組み合わせをソートして、どのファイルが破損しているかを確認する必要があります。

LUKS1コネクタのサイズはどうなりますか?

ここに矛盾する情報があります。

cryptsetup luksDump /dev/sdb

ペイロードオフセットは4096で示されていますが、ブロックサイズは何ですか?

おそらく、XFSファイルシステムのサイズをブロック単位で取得できます。

xfs_info /dev/mapper/my_data:

blocks=976754134 

(「データ」行の下)

badblocks はブロックの総数を示します。

badblocks -b 4096 /dev/sdb -sv 

Checking blocks 0 to 976754645

したがって、976754645 + 1 = 976754646ディスクの総ブロック数(正しい場合)。

976754646(不良ブロック) - 976754134(xfs_info) = LUKS1 ヘッダーのディスク先頭の 512 ブロック。

しかしここでは:

https://www.smartmontools.org/wiki/BadBlockHowto

LUKSヘッダーは16MBだと思いますか? (MiBにもなりませんか?)LUKS2ヘッダが16MiBであることはわかりますが、LUKS1ヘッダはよくわかりません。上記のテストでは2MiBのように見えますが、cryptsetup convertディスクの先頭に16MiBを使用できない場合は、どのようにそれを行うことができますか? smartmontoolsの記事によると、cryptsetup convertペイロードオフセットのブロックサイズが4096であることを示唆しているようです。

ただし、ディスクにどのように適合するかわからないため、4096 個(ペイロードオフセット) * 512 バイトのブロックサイズ = 2MiB LUKS1 ヘッダオフセットを引き続き想定します。

2MiBオフセット/ 4096ブロックサイズ= LUKS1ヘッダー用のディスクの最初の512ブロック。したがって、翻訳するには、badblocksの出力から512を引く必要があるようです。ディスクエントリーブロックファイルシステム彫刻。

たとえば、badblocksは、ブロック#512が不良であり、XFSファイルシステムではブロック#0になることを示しています。

これで、各不良ブロックのXFSブロック番号があります。

次に、各不良ブロックに対して次のことを行います。

xfs_db -c 'blockget -b <xfs block number>' /dev/mapper/my_data

アイノード番号を教えてくれます。しかし、ここに奇妙なことがあります。出力が次のように見えました。

xfs_db -c 'blockget -b 21512351' /dev/mapper/my_data
setting block 3/3847384 to data
setting inode to 7589729572 for block 3/3847384
inode 7589729572 block 21512351 at offset 34534

これはどういうblock 3/3847384意味ですか?

このinode番号を記録し、ファイルシステムを再マウントします。

次に、ファイルシステムで次のことを行います。

find /mnt/my_data -inum <inode>

これらの不良ブロックの影響を受けるファイルを提供します。

次にテストするには、次のようにします。

dd if=/path/to/file of=/dev/null iflag=direct status=progress

しかし、これは私が見つけたファイルに何のエラーも発生せず、不良ドライブで最後にrsyncを実行した結果、ioエラーを含むまったく異なるファイルを示しました。できる上記のようにddを使用して再現します。

それで…私の間違いはどこにありますか? LUKSヘッダーサイズが間違っていますか?一種の追加オフセットを減算する必要がありますか?

ベストアンサー1

おすすめ記事