web-dev-qa-db-ja.com

btrfsパーティションのファイルを元に戻す方法は?

Btrfsパーティションで削除されたファイルの削除を取り消す(回復する)にはどうすればよいですか?

まだスナップショットを撮っていないので、その機能は使用できません。他のLinuxファイルシステムには sometools があることは知っていますが、googleはbtrfsに固有のものを何も表示していません。 btrfsに削除取り消しツールが含まれているという漠然とした言及に出くわしましたが、見つかりません。別のファイルシステム用のツールを試す前に、ここで質問します。

より詳しい情報:

  • (2つの)削除されたファイルは、リモートのrsyncコマンドによって誤って削除されました。
  • これらは小さなプレーンテキストファイルでした。
  • ファイルの名前を知っています。
  • ファイルの一部の文字列を覚えているかもしれません。
  • ディスクは通常のHDDですが、大容量(2TB)です。
  • 私はすべての最新のアップデートでKubuntu 12.04(beta2)を実行しています。
  • ファイルが削除されたパーティションに新しいデータを書き込んでいません。
  • これらのファイルのスナップショットもバックアップもありません。 (最後のバックアップは、これらのファイルよりも数時間古いものです。)
  • 奇妙なことに、COWファイルシステムには、ext3/4よりもファイルの削除取り消しオプションが少ないようです...
20
MountainX

あなたのファイルは小さくプレーンテキストなので、私は「文字列」の出力をスキャンして、ファイルシステムが存在するデバイス、すなわち

strings /dev/sda1 | less

次に、「/」を使用して、そのファイルに含まれる可能性のある文字列を検索します。テキストが見つかったら、その先頭を「m」で区切り、最後に移動し、「| cat> file」を使用してファイルに保存します。

数年前の別のファイルシステムで、削除を取り消さずに同様の状況が発生したときに、実際にそれを実行しました。

7
Durval Menezes

JörgWalterがbtrfs-undeletefind-rootおよびrestoreツールを使用してbtrfs-progsシェルスクリプトを実装しました。これらは here 、そして、同様の立場にある他者を助けるべきです。

GPLv2でライセンスされているため、ここに含めることはできません。

4
Sameer

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

2
Catalin Hritcu