Btrfsパーティションで削除されたファイルの削除を取り消す(回復する)にはどうすればよいですか?
まだスナップショットを撮っていないので、その機能は使用できません。他のLinuxファイルシステムには sometools があることは知っていますが、googleはbtrfsに固有のものを何も表示していません。 btrfsに削除取り消しツールが含まれているという漠然とした言及に出くわしましたが、見つかりません。別のファイルシステム用のツールを試す前に、ここで質問します。
rsync
コマンドによって誤って削除されました。あなたのファイルは小さくプレーンテキストなので、私は「文字列」の出力をスキャンして、ファイルシステムが存在するデバイス、すなわち
strings /dev/sda1 | less
次に、「/」を使用して、そのファイルに含まれる可能性のある文字列を検索します。テキストが見つかったら、その先頭を「m」で区切り、最後に移動し、「| cat> file」を使用してファイルに保存します。
数年前の別のファイルシステムで、削除を取り消さずに同様の状況が発生したときに、実際にそれを実行しました。
JörgWalterがbtrfs-undelete
のfind-root
およびrestore
ツールを使用してbtrfs-progs
シェルスクリプトを実装しました。これらは here 、そして、同様の立場にある他者を助けるべきです。
GPLv2でライセンスされているため、ここに含めることはできません。
Btrfsドライブにサブボリュームがある場合は、追加の-r <subvol-id>
オプションをbtrfs restore
に渡す必要があります。残念ながら、そこにあるスクリプトは、user414471が投稿した( http://oelkers.de/tips/undeleteBtrfs.sh )のように、これを実行するオプションはありませんが、おそらく適応できますこれに。
これを手動で行う場合は、次のいずれかを使用して正しいsubvol-idを取得する必要があります。
# mount /dev/sdXY /mnt/blah
# btrfs subvolume list /mnt/blah
# umount /mnt/blah
または代わりに:
# btrfs restore -l /dev/sdXY | grep ROOT_ITEM
その後、btrfs-find-root
を使用して、元に戻したいブロック番号を取得します(通常、現在のルートである最大のブロックの直前のブロック番号)。これを行うには、最初にデフォルトのサブボリュームを、ファイルを元に戻す元のボリュームに設定する必要があります(後でこの変更を元に戻します)。
# mount /dev/sdXY /mnt/blah
# btrfs subvolume set-default <subvol-id> /mnt/blah
# umount /mnt/blah
# btrfs-find-root /dev/sdXY
Well block 4321280 seems great, but generation doesn't match, have=400760, want=400984 level 0
...
Well block 9928704 seems great, but generation doesn't match, have=400764, want=400984 level 1
Well block 1094836224 seems great, but generation doesn't match, have=400983, want=400984 level 1
Found tree root at 1095270400 gen 400984 level 1
最後に、btrfs restore
を-r <subvol-id>
とともにリカバリに使用できます(必要に応じて、最初に--dry-run
引数を使用します)。
# btrfs restore -r <subvol-id> -t 9928704 -v --path-regex '^/(|dir1(|/dir2(|/dir3(|/.*))))$' /dev/sdXY /tmp/recovery
このすべての詳細については、こちらをご覧ください: https://btrfs.wiki.kernel.org/index.php/Restore