Wie kann ich Dateien auf der btrfs-Partition wiederherstellen?

19

Wie kann ich eine gelöschte Datei auf einer btrfs-Partition wiederherstellen?

Ich habe noch keinen Schnappschuss gemacht, daher kann ich diese Funktion nicht verwenden. Ich weiß, dass es einige Tools für andere Linux-Dateisysteme gibt, aber Google hat nichts spezielles für btrfs gefunden. Ich bin auf eine vage Erwähnung gestoßen, dass btrfs ein nicht gelöschtes Tool enthält, das ich aber nicht finde. Bevor ich Tools für ein anderes Dateisystem ausprobiere, frage ich hier.

Mehr Info:

  • Die (zwei) gelöschten Dateien wurden durch einen rsyncfehlerhaften Remote- Befehl gelöscht .
  • Dies waren kleine Textdateien.
  • Ich kenne die Namen der Dateien.
  • Möglicherweise kann ich mich an einige Zeichenfolgen in den Dateien erinnern.
  • Die Festplatte ist eine normale Festplatte, aber sie ist groß (2 TB).
  • Ich verwende Kubuntu 12.04 (Beta2) mit den neuesten Updates.
  • Ich habe keine neuen Daten in die Partition geschrieben, von der die Dateien gelöscht wurden.
  • Ich habe keinen Schnappschuss oder keine Sicherungskopie dieser Dateien. (Die letzte Sicherung ist nur einige Stunden älter als diese Dateien.)
  • Seltsamerweise scheint ein COW-Dateisystem weniger Optionen zum Wiederherstellen von Dateien zu haben als ext3 / 4 ...
MountainX für Monica Cellio
quelle

Antworten:

7

Da es sich bei Ihren Dateien um kleine und reine Textdateien handelt, würde ich versuchen, die Ausgabe von "Strings" in das Gerät zu scannen, auf dem sich das Dateisystem befindet, d. H.

strings /dev/sda1 | less

Verwenden Sie dann "/", um nach den Zeichenfolgen zu suchen, die sich in dieser Datei befinden könnten. Wenn Sie den Text gefunden haben, begrenzen Sie den Anfang mit "m", gehen Sie zum Ende und speichern Sie ihn mit "| cat> file" in einer Datei.

Ich habe das tatsächlich getan, als ich vor ein paar Jahren eine ähnliche Situation auf einem anderen Dateisystem ohne Wiederherstellung hatte, und es funktionierte großartig für mich.

Durval Menezes
quelle
4

Jörg Walter hat btrfs-undeletemit den Tools find-rootund restorevon ein Shell-Skript implementiert btrfs-progs, das sich hier befindet und anderen in einer ähnlichen Position helfen soll.

Da es unter der GPLv2 lizenziert ist, kann ich es hier nicht aufnehmen.

Sameer
quelle
3
Erwähnenswert ist, dass das Skript mindestens einen Pfad enthält (vermutlich aus Versehen) und einige andere Probleme aufweist. Käufer sollten daher darauf achten, dass es vor der Verwendung bearbeitet werden muss.
Gamen
2
Hier ist eine bereinigte Version des Originalskripts: gist.github.com/Changaco/45f8d171027ea2655d74
Changaco
"Da es unter GPLv2 lizenziert ist, kann ich es hier nicht einfügen" - vielleicht sollten Sie lesen, was die GPLv2 sagt, denn das macht überhaupt keinen Sinn.
Slang
4
@slang Vielleicht solltest du die Nutzungsbedingungen dieser Seite lesen? Beiträge müssen unter der Creative Commons Namensnennung-Weitergabe unter gleichen Bedingungen 3.0-Lizenz lizenziert werden.
Suriv
@suriv - Ich denke, ich kann ihre Gründe dafür verstehen, aber das ist ziemlich ärgerlich. Zumal CC-BY-SA nur geringfügig restriktiver ist als die GPL (abgesehen von GPLv3s Patentmaterial).
Omnifarious
2

Wenn Ihr btrfs-Laufwerk über Subvolumes verfügt, müssen Sie die zusätzliche -r <subvol-id>Option an übergeben btrfs restore. Leider haben die Skripte da draußen, wie die von user414471 ( http://oelkers.de/tips/undeleteBtrfs.sh ), keine Möglichkeit, dies zu tun, aber sie können wahrscheinlich daran angepasst werden.

Wenn Sie dies von Hand tun möchten, müssen Sie die richtige Subvol-ID erhalten, entweder mit:

# mount /dev/sdXY /mnt/blah
# btrfs subvolume list /mnt/blah
# umount /mnt/blah

oder alternativ mit:

# btrfs restore -l /dev/sdXY | grep ROOT_ITEM

Anschließend verwenden Sie btrfs-find-root, um die Blocknummer abzurufen, zu der Sie zurückkehren möchten (normalerweise die Nummer kurz vor der höchsten Nummer, die die aktuelle Wurzel ist). Dazu müssen Sie zuerst das Standard-Subvolume auf dasjenige setzen, von dem Sie Dateien zurücksetzen möchten (und diese Änderung anschließend zurücksetzen):

# 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

Sie können schließlich btrfs restoremit -r <subvol-id>für die Wiederherstellung verwenden (zunächst mit dem --dry-runArgument, wenn Sie möchten):

# btrfs restore -r <subvol-id> -t 9928704 -v --path-regex '^/(|dir1(|/dir2(|/dir3(|/.*))))$' /dev/sdXY /tmp/recovery

Weitere Informationen dazu finden Sie hier: https://btrfs.wiki.kernel.org/index.php/Restore

Catalin Hritcu
quelle
Getestet dies auf einem Fedora 26-System - und dort wird der btrfs-find-rootSchritt nie beendet (dh läuft 3 Stunden lang mit 100% CPU auf einem <250 GB FS). Siehe auch eine ähnliche Geschichte spinics.net/lists/linux-btrfs/msg61361.html .
Maxschlepzig