Jak cofnąć usunięcie plików z partycji btrfs?

19

Jak mogę usunąć (odzyskać) usunięty plik na partycji btrfs?

Nie zrobiłem jeszcze migawki, więc nie mogę korzystać z tej funkcji. Wiem, że istnieje kilka narzędzi dla innych systemów plików Linuksa, ale Google nie pojawiło się nic konkretnego do btrfs. Natknąłem się na jedną niejasną wzmiankę, że btrfs zawiera narzędzie do usuwania, ale nie mogę go znaleźć. Zanim wypróbuję narzędzia dla innego systemu plików, pytam tutaj.

Więcej informacji:

  • Te (dwa) usunięte pliki zostały usunięte przez rsyncbłędne polecenie zdalne .
  • Były to małe zwykłe pliki tekstowe.
  • Znam nazwy plików.
  • Być może będę w stanie zapamiętać niektóre ciągi w plikach.
  • Dysk jest zwykłym dyskiem twardym, ale jest duży (2 TB).
  • Korzystam z Kubuntu 12.04 (beta2) ze wszystkimi najnowszymi aktualizacjami.
  • Nie zapisałem żadnych nowych danych na partycji, z której pliki zostały usunięte.
  • Nie mam migawki ani kopii zapasowej tych plików. (Ostatnia kopia zapasowa jest tylko kilka godzin starsza niż te pliki).
  • O dziwo, system plików COW wydaje się mieć mniej opcji usuwania plików niż ext3 / 4 ...
MountainX dla Moniki Cellio
źródło

Odpowiedzi:

7

Ponieważ twoje pliki są małe i zwykły tekst, spróbowałbym zeskanować wyjście „ciągów” do urządzenia, na którym znajduje się system plików, tj.

strings /dev/sda1 | less

następnie użyj „/”, aby wyszukać ciągi znaków, które mogą znajdować się w tym pliku. Po znalezieniu tekstu ogranicz jego początek znakiem „m”, a następnie przejdź na koniec i użyj polecenia „| cat> plik”, aby zapisać go w pliku.

Zrobiłem to, gdy kilka lat temu miałem podobną sytuację na innym systemie plików bez przywracania i działało to dla mnie świetnie.

Durval Menezes
źródło
4

Jörg Walter zaimplementował btrfs-undeleteskrypt powłoki za pomocą narzędzi find-rooti restorez btrfs-progs, które można znaleźć tutaj , i powinien pomóc innym w podobnej sytuacji.

Ponieważ jest licencjonowany na licencji GPLv2, nie mogę go tutaj zamieścić.

Sameer
źródło
3
Warto zauważyć, że wspomniany skrypt ma co najmniej jedną ścieżkę zakodowaną na stałe (prawdopodobnie przez pomyłkę) i ma kilka innych problemów, więc kupujący powinni pamiętać, że należy go edytować przed użyciem.
gamen
2
Oto oczyszczona wersja oryginalnego skryptu: gist.github.com/Changaco/45f8d171027ea2655d74
Changaco
„Ponieważ jest licencjonowany na licencji GPLv2, nie mogę go tutaj zamieścić” - może powinieneś przeczytać to, co mówi GPLv2, ponieważ to nie ma żadnego sensu.
slang
4
@slang może powinieneś przeczytać warunki korzystania z tej strony? Treści muszą być licencjonowane na licencji Creative Commons Uznanie autorstwa Na tych samych warunkach 3.0.
przetrwa
@suriv - Chyba rozumiem ich powody, ale to dość denerwujące. Zwłaszcza, że ​​CC-BY-SA jest tylko nieco bardziej restrykcyjny niż GPL (oprócz patentów GPLv3).
Wszechobecny
2

Jeśli twój dysk btrfs ma podwolumny, musisz przekazać dodatkową -r <subvol-id>opcję do btrfs restore. Niestety skrypty, takie jak jeden opublikowany przez user414471 ( http://oelkers.de/tips/undeleteBtrfs.sh ), nie mają takiej możliwości, ale prawdopodobnie można je do tego dostosować.

Jeśli chcesz to zrobić ręcznie, musisz uzyskać odpowiedni subvol-id, albo z:

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

lub alternatywnie z:

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

Następnie używasz, btrfs-find-rootaby uzyskać numer bloku, na który chcesz przywrócić (zwykle ten, który jest tuż przed maksymalnym, którym jest bieżący root). W tym celu musisz najpierw ustawić domyślną objętość podrzędną na tę, z której chcesz przywrócić pliki (a następnie przywrócić tę zmianę):

# 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

Można wreszcie korzystać btrfs restorez -r <subvol-id>do odzysku (początkowo z --dry-runargumentem, jeśli chcesz):

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

Więcej informacji o tym wszystkim tutaj: https://btrfs.wiki.kernel.org/index.php/Restore

Catalin Hritcu
źródło
Przetestowałem to w systemie Fedora 26 - i tam btrfs-find-rootkrok nigdy się nie kończy (tzn. Działa przy 100% CPU przez 3 godziny na <250 GB FS). Zobacz także podobną historię spinics.net/lists/linux-btrfs/msg61361.html .
maxschlepzig