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


19

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

まだスナップショットを撮っていないので、その機能は使用できません。他のLinuxファイルシステム用のツールいくつ かありますが、Googleはbtrfsに特化したものを提供していません。btrfsには元に戻すツールが含まれているという漠然とした言及がありましたが、見つかりません。別のファイルシステム用のツールを試す前に、ここで質問します。

詳細:

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

回答:


7

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

strings /dev/sda1 | less

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

数年前に、元に戻すことなく別のファイルシステムで同様の状況にあったとき、実際にそれを行いました。


4

JörgWalter btrfs-undeleteは、find-rootおよびrestoreからのツールを使用してシェルスクリプトを実装しましたbtrfs-progs。これは、こちらにあります。同様の立場にある他のユーザーを支援するはずです。

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


3
このスクリプトには少なくとも1つのパスがハードコードされており(おそらく誤って)、その他のいくつかの問題があるため、購入前に編集する必要があることに注意してください。
ゲームの14

2
元のスクリプトのクリーンアップバージョンは次のとおり
Changaco

「GPLv2でライセンスされているため、ここに含めることはできません」-GPLv2の内容を読んでください。
スラング

4
@slangこのサイトの利用規約を読むべきでしょうか?コントリビューションは、Creative Commons Attribution Share Alike 3.0ライセンスの下でライセンスされている必要があります。
1

@suriv-その理由を理解できると思いますが、それはかなり面倒です。特にCC-BY-SAはGPL(GPLv3sの特許は別として)よりも少しだけ制限が厳しいためです。
オムニファリアス

2

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 restorewith -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


Fedora 26システムでこれをテストしました-そして、そこでbtrfs-find-rootステップは終了しません(つまり、250 GB FSで100%CPUで3時間実行されます)。同様の話spinics.net/lists/linux-btrfs/msg61361.htmlも参照してください。
maxschlepzig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.