Cofanie / odzyskiwanie usuniętych plików w systemach Unix / Linux


124

Czy istnieje polecenie odzyskiwania / cofania usuniętych plików rm?

$ rm -rf /path/to/myfile

Jak mogę odzyskać myfile? Jeśli istnieje takie narzędzie, jak mogę go używać?


1
cyberciti.biz/tips/… może pomóc. Lepiej jest też w Stack Exchange .
fedorqui

1. Byłoby lepiej dla systemów Unix i Linux 2. Kopie zapasowe?

1
Zanim cokolwiek zrobisz, zamontuj system plików tylko do odczytu, aby upewnić się, że dane nie zostaną zastąpione. Zobacz także ten post: superuser.com/questions/170857/ext4-undelete-utilities .

1
@EvanTeitelman masz na myśli, że remont tylko do odczytu jest lepszy niż próba odzyskania pliku, gdy jest on podłączony? btw, midnightcommander (mc) way, sugeruje umounting datarecoverypros.com/recover-linux-midnightcommander.html
Aquarius Power

1
Najlepszym rozwiązaniem jest myślenie naprzód i korzystanie z narzędzia kontroli wersji.
ctrl-alt-delor

Odpowiedzi:


66

Link, który ktoś podał w komentarzach, jest prawdopodobnie twoją najlepszą szansą.

Linux debugfs Hack: Undelete Files

Ten napis, choć trochę onieśmielający, jest dość prosty do naśladowania. Ogólnie kroki są następujące:

  1. Użyj debugfs, aby wyświetlić dziennik systemu plików

    $ debugfs -w /dev/mapper/wks01-root
    
  2. Po pytaniu debugfs

    debugfs: lsdel
    
  3. Próbka wyjściowa

    Inode  Owner  Mode    Size    Blocks   Time deleted
    23601299      0 120777      3    1/   1 Tue Mar 13 16:17:30 2012
    7536655      0 120777      3    1/   1 Tue May  1 06:21:22 2012
    2 deleted inodes found.
    
  4. Uruchom polecenie w debugfs

    debugfs: logdump -i <7536655>
    
  5. Określ i-węzeł plików

    ...
    ...
    ....
    output truncated
        Fast_link_dest: bin
        Blocks:  (0+1): 7235938
      FS block 7536642 logged at sequence 38402086, journal block 26711
        (inode block for inode 7536655):
        Inode: 7536655   Type: symlink        Mode:  0777   Flags: 0x0   Generation: 3532221116
        User:     0   Group:     0   Size: 3
        File ACL: 0    Directory ACL: 0
        Links: 0   Blockcount: 0
        Fragment:  Address: 0    Number: 0    Size: 0
        ctime: 0x4f9fc732 -- Tue May  1 06:21:22 2012
        atime: 0x4f9fc730 -- Tue May  1 06:21:20 2012
        mtime: 0x4f9fc72f -- Tue May  1 06:21:19 2012
        dtime: 0x4f9fc732 -- Tue May  1 06:21:22 2012
        Fast_link_dest: bin
        Blocks:  (0+1): 7235938
    No magic number at block 28053: end of journal.
    
  6. Z powyższymi informacjami i-węzła uruchom następujące polecenia

    # dd if=/dev/mapper/wks01-root of=recovered.file.001 bs=4096 count=1 skip=7235938
    # file recovered.file.001
    file: ASCII text, with very long lines
    

Pliki zostały odzyskane do recovered.file.001.

Inne opcje

Jeśli powyższe nie jest dla ciebie, użyłem narzędzi takich jak photorecodzyskiwanie plików w przeszłości, ale jest ono nastawione tylko na pliki graficzne. O tej metodzie pisałem obszernie na swoim blogu w tym artykule zatytułowanym:

Jak odzyskać uszkodzone pliki JPEG i przenieść pliki z karty SDD aparatu cyfrowego na Fedorze / CentOS / RHEL .


11
Próbowałem z, debugfs -w /dev/sdb2ale lsdelsais:0 deleted inodes found.
rubo77

5
użycie extundeleteext3 / 4 jest łatwiejsze i prawdopodobnie doprowadziłoby do takich samych rezultatów.
eadmaster

1
zadziałało to w celu odzyskania pliku, ale otrzymałem @ y U T6 Ԝ * e 0 v' T 0 <#selinuxsystem_u: object_r: rpm_var_lib_t: s0 } y U T6 ..... próbowanie conv = ascii, conv = ibm i conv = ebcdic daje ten sam problem
codyc4321

2
lsdel: Nie można otworzyć systemu plików, jak go rozwiązać?
Amitābha

3
Rozumiem /dev/mapper/wks01-root: No such file or directory while opening filesystemSkąd to masz /dev/mapper/wks01-root?
Marko Avlijaš

29

Przy odrobinie szansy czasami mogę odzyskać usunięte pliki za pomocą tego skryptu lub następnego rozwiązania w odpowiedzi:

#!/bin/bash

if [[ ! $1 ]]; then
    echo -e "Usage:\n\n\t$0 'file name'"
    exit 1
fi

f=$(ls 2>/dev/null -l /proc/*/fd/* | fgrep "$1 (deleted" | awk '{print $9}')

if [[ $f ]]; then
    echo "fd $f found..."
    cp -v "$f" "$1"
else
    echo >&2 "No fd found..."
    exit 2
fi

Jest jeszcze jedna przydatna sztuczka: jeśli znasz wzór w usuniętych plikach, wpisz alt+ sys+, resuoaby ponownie uruchomić + ponownie zamontować tylko w trybie tylko do odczytu, a następnie w przypadku live-cd użyj grepdo wyszukiwania na dysku twardym:

grep -a -C 500 'known pattern' /dev/sda | tee /tmp/recover

następnie edytuj, /tmp/recoveraby zachować tylko te pliki, które były wcześniej.

Hej, jeśli w filozofii uniksowej wszystko jest plikami, nadszedł czas, aby z tego skorzystać, nie?


5
Twoje grepoparte na rozwiązaniu rozwiązanie jest dla mnie bardzo sprytne, nawet jeśli system plików jest nadal podłączony. Dzięki!
wchargin

Nie rozumiem, w jaki sposób działało dla Ciebie rozwiązanie grep, wyświetla tylko dane binarne. Jak to jest przydatne?
w00t

2
@ w00t Jasne, że „tylko” wyrzuca dane binarne. Ale czasami te dane binarne zawierają bity ASCII odpowiadające plikowi, którego szukam. Chyba nie rozumiem pytania?
wchargin

@ w00t sztuką jest użycie wzorca wyszukiwania, który jest bardzo specyficzny dla tego pliku. Polecenie grep zajmie 500 linii przed i po każdej pasującej linii, więc nadal wypluje wiele nieistotnych danych, ale dzięki edytorowi tekstowemu, który sobie z tym poradzi (np. Vim), łatwo jest oddzielić dobro od złe rzeczy. Możesz także odfiltrować wszystkie wiersze ze znakami niedrukowalnymi, przepuszczając je przez kolejne polecenie grep:grep -av "[^[:print:]]"
CJStuart

grepRozwiązanie pracował dla mnie z modyfikacją: zrobiłem sudo grep --line-buffered -ab "$PATTERN" /dev/sda1 | tee linesi dostałem offsety bajtowe (jak 123123123:line\n456456456:another\n...), a następnie zrobił n=1000; sudo dd of=before if=/dev/sda1 ibs=1 skip=$[123123123-$n] count=$ni n=1000; sudo dd of=after if=/dev/sda1 ibs=1 skip=123123123 count=$nz różnymi nwartościami.
Kirill Bulygin

21

To, co zadziałało, zostało podane przez arch (dotyczy tylko plików tekstowych):

grep -a -C 200 -F 'Unique string in text file' /dev/sdXN

gdzie /dev/sdXNjest partycja zawierająca utracony plik (sprawdź, mountjeśli nie jesteś pewien).

Trwa to trochę dłużej, ale zadziałało, gdy przypadkowo usunąłem kod źródłowy, którego jeszcze nie zatwierdziłem!


4
Bardzo przydatne dla programistów! zazwyczaj zawsze gubiliśmy własne kody.
pylover

1
powiedz mi o tym, przypadkowo pobiegłem rm data/*.json python myFile.pyzamiastrm data/*.json && python myFile.py
William Becker

2
Dzięki kolego, pomogłeś mi odzyskać plik tekstowy, który spędziłem 2 godziny na pisaniu w nocy. PS /dev/sdXNjest dla systemu plików, prawda? Znalazłem mójdf -T | awk '{print $1,$2,$NF}' | grep "^/dev"
Alex

Widzę tylko plik binarny pliku. Czy istnieje sposób na konwersję do normalnego formatu?
silgon

grep: conflicting matchers specified
felwithe

10

Chociaż to pytanie zostało rozwiązane i ma kilka lat, chcę wspomnieć o narzędziu testdisk .

Jak odzyskać pliki za pomocą testdisk, wyjaśniono dobrze w tym samouczku . Aby odzyskać pliki, uruchom testdisk /dev/sdXi wybierz typ tablicy partycji. Następnie wybierz [ Advanced ] Filesystem Utils, a następnie wybierz partycję i wybierz [Undelete]. Teraz możesz przeglądać i wybierać usunięte pliki oraz kopiować je do innej lokalizacji w systemie plików.


Nie widzi mojego / dev / nvme0n1p2
h22

6

W zeszłym tygodniu miałem ten sam problem i wypróbowałem wiele programów, takich jak debugfs, photorec, ext3grep i extundelete. ext3grep był najlepszym programem do odzyskiwania plików. Składnia jest bardzo łatwa:

ext3grep image.img --restore-all

lub:

ext3grep /dev/sda3 --restore-all --after date -d '2015-01-01 00:00:00' '+%s' --before `date -d ‘2015-01-02 00:00:00’ ‘+%s’

Ten film jest mini poradnikiem, który może ci pomóc.


6

Alternatywą może być użycie delzamiast rmdo usuwania:

http://fex.belwue.de/fstools/del.html

del ma funkcję przywracania i działa z dowolnym systemem plików.

Oczywiście nie jest to rozwiązanie, jeśli pliki zostały już usunięte za pomocą polecenia „zabierz więźniów”: -}


1
Nie odpowiedź, jak już powiedziałeś, ale dzięki za wprowadzenie del polecenia.
pylover

5

podłącz dysk przez zewnętrzny interfejs

  1. uchwyt
  2. umount /dev/{sd*}
  3. extundelete --restore-all /dev/{sd*}
  4. wyniki przejdź do folderu domowego na dysku rozruchowym
  5. punkty bonusowe: napisz w tym celu GUI

Zobacz ten link, aby uzyskać więcej informacji: cofnąć usunięcie właśnie usuniętego pliku na ext4 z extundelete .


2
Downvoters, proszę wyjaśnij, dlaczego uważasz, że extundelete nie jest dobrą opcją?
webminal.org,

2
Miły! Dzięki za wysłanie. extundelete to dla mnie nowe narzędzie. Użyłem tego dzisiaj i uważam, że jest to bardzo pomocne. O wiele bardziej pomocna IMO niż zaakceptowana odpowiedź. Jedyne, co dodam do tej odpowiedzi, aby ją nieco poprawić, to (1) powtórzenie instrukcji w niektórych innych odpowiedziach, że należy wyłączyć komputer, którego dotyczy problem, gdy tylko zorientuje się, że pliki zostały omyłkowo usunięte, oraz (2), aby boot z liveCD lub liveUSB OS, takiego jak Kali Linux, który zawiera narzędzie extundelete (odkryłem, że wiele innych liveCD takich jak Debian Jessie nie zawiera tego narzędzia na swoich nośnikach instalacyjnych).
Osteoboon

4

Narzędzia do odzyskiwania - wiersz poleceń:

Narzędzia do odzyskiwania - Gui:

Informacje:

Z mojego osobistego doświadczenia odzyskuję dane za pomocą ufs-explorer i photorec

(1) = Not open source, not free

(2) = Nie open source, za darmo

(3) = Open source i za darmo

(4) = Mają wsparcie NTFS

(5) = Posiada funkcję struktury katalogów


1

Nie zgadzam się, że jest to niemożliwe, po prostu bardzo bardzo trudne i nigdy nie zrobiłem tego poza Linuksem:

Po usunięciu pliki nie są faktycznie usuwane. To, co się dzieje, polega na tym, że miejsce, w którym były na dysku twardym, jest jakby resetowane, więc jeśli komputer próbuje tam zapisać dane, nic nie narzeka. Zasadniczo dane na dysku twardym, które według ciebie zostały usunięte, mogą być tam prawie rok później. A przynajmniej takie jest moje doświadczenie na komputerze z systemem Windows. Nie wiem, czy to działa tak samo, jak w wierszu poleceń w systemie Linux, ale prawdopodobnie potrzebujesz osobnej płyty Live CD, aby otworzyć taką partycję, a także nie ma gwarancji, że pliki nadal tam są. Zrobiłem to kilkakrotnie w systemie Windows XP przy użyciu Zero Assumption Recovery. Jestem pewien, że istnieje podobne narzędzie, jeśli spojrzysz wystarczająco mocno.


W zależności od sytuacji może to być w 100% niemożliwe. To może lub nie może działać, ale NIGDY nie masz żadnych gwarancji.
klutt

0

Po usunięciu pliku liczba łączy w tabeli i-węzłów dla tego pliku jest zmniejszana o jeden. W Uniksie, gdy liczba linków spada do 0, bloki danych dla tego pliku są oznaczane jako wolne i zazwyczaj odwołania do tych bloków danych są tracone. Właśnie odkryłem z komentarza @ fedorqui, że może istnieć sposób na uzyskanie dostępu do tych bloków, ale dotyczy to tylko systemu plików ext3.

Jednym ze sposobów zachowania plików będzie napisanie funkcji, która pozwoli Ci przenieść pliki do kosza (powiedzmy $HOME/.trash) i odzyskać potrzebne pliki z tego miejsca. Tę funkcję można aliasować do rm. Możesz zaplanować zadanie CRON, aby usunąć pliki, które znajdowały się w obszarze kosza przez określoną liczbę dni.


0

To może zaoszczędzić kłopotów niektórym z was.
Jeśli kiedykolwiek użyłeś gedit do edycji tego pliku, domyślnie zostanie utworzona kopia tego pliku.
Załóżmy na przykład, że przypadkowo usunęliśmy plik „mój_plik.txt”.
W folderze, który kiedyś zawierał właśnie usunięty plik, użyj tych poleceń, a stamtąd odzyskasz kopię:
ls | grep 'myfile.txt~'
Przy odrobinie szczęścia znajdziesz ją, a następnie:
cp 'myfile.txt~' 'myfile.txt'
Właśnie odzyskałem plik za pomocą tej metody. Powodzenia!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.