btrfsファイルシステムでチェックサムエラーを含むファイル全体の内容を明示的に取得できますか?

btrfsファイルシステムでチェックサムエラーを含むファイル全体の内容を明示的に取得できますか?

単一のデバイスBtrfsのファイルが破損した場合に何が起こるかを想像してください。この場合、破損したビットを含むファイルの内容をそのまま含める必要があります。

mountのマニュアルページに記載されているように:

nodatasum
              Enable/disable data checksumming for newly created files.

したがって、ファイルを読み取るときにチェックサムチェックを無効にしません。

私は、ファイルシステムの読み取りに関連するすべての標準システムコールがこのファイルで失敗することを推測します。断片化の可能性のため、生ディスクの読み取りはオプションではありません。

そのファイルを試してみるとcatエラーが発生します。

cat: file: Input/output error

dmesg次のメッセージを報告します。

[631847.884641] BTRFS warning (device loop0): csum failed ino 257 off 0 csum 1280268577 expected csum 2391276770

破損が発生した場所がわかると、off 0これはファイルの最初の4096バイトなので、実際には破損していないブロックを非常に簡単に検索できました。

dd if=file bs=4K skip=1

ところで、破損したファイルの破損していないブロックにデータを書き込んで追加することも成功します。少なくとも破損したブロックが1つだけで、それが最後のブロックではない場合はそうです。最初は驚きましたが、後で重要なデータを追加する必要があるアプリケーションが破損したファイルにかかるのを防ぐのに最適な機能である可能性があると思いました。

問題は、破損したブロック(または破損したファイル全体)からデータを取得する方法です。

ベストアンサー1

最後の手段として試してみてください。

btrfs チェック --init-csum-tree /tmp/copy_of_the_device.bin

このコマンドはファイルシステムを変更し、結果が以前より悪くなる可能性があるため、ファイルシステムのddまたはddrescueコピーでのみこのコマンドを実行してください。

おすすめ記事