単一のデバイス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コピーでのみこのコマンドを実行してください。
答え2
Linuxカーネル5.11では、ファイルチェックサムをマウントして無視するオプションが導入されました。これにより、データが誤ったcsumからコピーされる可能性があります。
mount -o rescue=ignoredatacsums /dev/sdX /mnt
これにより、ファイルが最小限に破損し、パリティの種類がある場合は、ファイルを完全に回復できます。2ストローク