Jak odzyskać usunięty plik w systemie Linux?

65

Przez przypadek użyłem rmpliku, którego nie chciałem usunąć. Czy istnieje sposób, aby go odzyskać pod Linuksem?

HaiYuan Zhang
źródło
@Nav, rmto „niebezpieczne” polecenie UNIX / Linux (czytaj $ man rm). Używaj go z najwyższą ostrożnością . Powiedziawszy to, jest to szybki sposób na usunięcie plików, których jesteś pewien. Nowoczesne środowiska pulpitu Linux i Unix zapewniają rozwiązanie „Kosza” , dzięki czemu użytkownik może łatwo odzyskać przypadkowo usunięte pliki.
Jose Elera,
1
kilka bardziej aktualnych odpowiedzi: unix.stackexchange.com/questions/122305/...
Ben Crowell
Nie używaj „rm”, jeśli chcesz przywrócić pliki w przyszłości. Zamiast tego użyj
Natesh bhat

Odpowiedzi:

51

Poniżej przedstawiono ogólne kroki odzyskiwania plików tekstowych.

  1. Najpierw użyj polecenia ściany, aby poinformować użytkownika, że ​​system działa w trybie pojedynczego użytkownika:

    # wall
    System is going down to .... please save your work.
    

    Naciśnij CTRL + D, aby wysłać wiadomość.

  2. Następnie użyj polecenia init 1, aby przełączyć system w tryb jednego użytkownika:

    # init 1
    
  3. Używanie grep (tradycyjny sposób UNIX) do odzyskiwania plików

    Użyj następującej składni grep:

    grep -b 'search-text' /dev/partition > file.txt
    

    LUB

    grep -a -B[size before] -A[size after] 'text' /dev/[your_partition] > file.txt
    

    Gdzie,

    -i : Ignore case distinctions in both the PATTERN and the input files i.e. match both uppercase and lowercase character.
    -a : Process a binary file as if it were text
    -B Print number lines/size of leading context before matching lines.
    -A: Print number lines/size of trailing context after matching lines.
    

    Aby odzyskać plik tekstowy zaczynający się od słowa „nixCraft” na / dev / sda1, możesz spróbować wykonać następujące polecenie:

    # grep -i -a -B10 -A100 'nixCraft' /dev/sda1 > file.txt
    
  4. Następnie użyj vi, aby zobaczyć plik.txt.

    Ta metoda jest przydatna TYLKO, jeśli usunięty plik jest plikiem tekstowym. Jeśli używasz systemu plików ext2, wypróbuj polecenie odtwarzania.

Znalezione na http://www.cyberciti.biz/tips/linuxunix-recover-deleted-files.html

Gabriel L. Oliveira
źródło
16
Warto zauważyć, że NIE MOŻNA ZROBIĆ TEGO ZDALNIE tryb pojedynczego użytkownika wyłącza sieć
Quinma
1
Ta metoda działa cuda dla plików tekstowych, dzięki! Podoba mi się to, że nie polega na dzienniku systemu plików (jak extundelete), ale zamiast tego skanuje nieprzetworzone bajty całego dysku. Jeśli to polecenie nie znajdzie twojego pliku, nic nie będzie.
Benjamin B.
1
@Quinma, ta metoda może działać zdalnie z niewielkimi modyfikacjami ... Zamiast uruchamiać init 1ręcznie zabijaj wszystkie demony systemowe oprócz sshd. Myślę też, że w tym momencie powinieneś ponownie zamontować wszystkie systemy plików RO i zapisać na tmpfs (zakładając, że twoje pliki tymczasowe zmieszczą się w pamięci RAM), aby uniknąć zastąpienia plików danymi tymczasowymi. Będziesz oczywiście musiał skopiować go gdzie indziej później, albo na zdalny serwer, albo z powrotem do lokalnych systemów plików po ponownym zamontowaniu RW.
Thomas Guyot-Sionnest,
jaka jest twoja_partycja ??? Mam błąd: / dev / sda1: Nie ma takiego pliku lub katalogu
coolcool1994
1
@Qback, naprawdę nie wiem. Jak wspomniano, po prostu śledziłem krok po kroku. Ale init 1 jest przeznaczony do zadań administracyjnych i być może proces zabicia nie jest powiązany z tym scenariuszem poziomu pracy. Może to pomóc w zapobieganiu użycia dysku twardego i zastąpieniu pliku, który próbujesz odzyskać.
Gabriel L. Oliveira,
13
  • Jeśli jest to bardzo, bardzo ważne, wyjmij dysk z komputera i zatrudnij firmę, która zrobi to za Ciebie.
  • Jeśli jest to bardzo ważne, zamontuj dysk tylko do odczytu, skopiuj całą partycję do pliku za pomocą ddi spróbuj znaleźć plik w nim (za pomocą greplub edytora).

Edycja: czasami ddrescuedziała lepiej niż dd.

Sjoerd
źródło
1
„spróbuj znaleźć plik w nim” Jestem zdezorientowany, w jaki sposób można rozsądnie otworzyć plik o wielkości ponad 15 GB i wyszukać lub potokować tę bestię w grep? A co byś zrobił po znalezieniu tekstu? Jak, u licha, jest to zdrowie?
TheLQ
1
Pierwszą rzeczą do zrobienia jest wypróbowanie kilku popularnych narzędzi przed wypaleniem dużej ilości gotówki w celu uzyskania niepewnego wyniku. BTW, grep naprawdę nie pomoże, photorec lub ext3grep.
wazoox
8

Testdisk ma opcję przywracania, która powinna działać z Linuksem.

Istnieje przewodnik dotyczący systemu Linux . Zauważ, że działa dla ext2 , ext3 i ext4 .

James T.
źródło
1
Polecenie extundelete jest także przydatne, jeśli partycja to ext3 / 4. Jednak pierwszą rzeczą do zrobienia może być odmontowanie partycji.
billc.cn
5
  • Jedyną prawidłową odpowiedzią jest: przywróć plik z kopii zapasowej. Każdy musi mieć kopię zapasową. W przypadku naprawdę ważnych plików powinieneś mieć dwie kopie zapasowe. Ty nie Cóż, szkoda, oto wyciągnięta lekcja (Przepraszam, że brzmię ostro, ale jestem w pamięci masowej, a ludzie nie tworzą kopii zapasowych, dopóki nie stracą ważnych danych, to fakt. Więc tak, wyglądasz głupio, ale podobnie jak prawie wszyscy inni).

  • OK, nie masz kopii zapasowej. musisz przestać używać systemu plików, który zawierał plik RIGHT NOW . Każda czynność zapisu może zdecydowanie zatkać dane pliku, które mogą (tylko mogą ) pozostać na dysku.

  • jeśli popełniłeś tragiczny błąd, używając tylko jednej partycji jako głównego systemu plików i / home, oznacza to, że musisz uruchomić system z innego urządzenia. TERAZ .

  • Jeśli plik ma jakiś popularny format (plik Word, JPG itp.), Użyj Photorec . Photorec może pobierać najpopularniejsze formaty plików.

  • Możesz wypróbować poprzednio zaproponowaną metodę „ext3 undelete”, ale musisz się dobrze posługiwać wierszem poleceń, rozumieć podstawowe wewnętrzne działania linuksa itp.

  • Jeśli twój plik ma jakiś specjalny format, to pecha. Kiedyś napisałem program Perla do skanowania dysku w poszukiwaniu specjalnych plików i działał całkiem nieźle; ale musisz znać programowanie, aby to zrobić, i być całkiem spokojnym z Linuksem.

wazoox
źródło
5

Zrobiłem to kilka lat temu. Moje podejście polegało na bezpośrednim, bez czasu do stracenia, odmontowaniu partycji, a potem

dd if=/dev/hda1 of=backup_image.ext3

mieć plik kopii zapasowej dokładnego stanu partycji. Następnie możesz ponownie zamontować partycję i kontynuować normalną pracę podczas wyszukiwania usuniętego pliku w utworzonym obrazie. Obraz będzie prawdopodobnie BARDZO duży, ponieważ potrzebujesz całej „pustej” przestrzeni, więc przechowywanie go może być praktycznym problemem.

Potem było po prostu nudne wyszukiwanie po fragmentach tekstu, których spodziewałem się gdzieś w zupie zawartości partycji. Np. By znaleźć pliki .tex, uruchomiłem

grep --binary-files=text -1000 "subsection" < backup_image.ext3 > latexfiles

który wydrukował duży kontekst wokół frazy „podsekcja” i zapisał dane wyjściowe w pliku, który można ręcznie przeszukać. Wydrukowałem tak duży kontekst, ponieważ przeszukanie obrazu zajęło tak dużo czasu, że wolałbym nie robić tego więcej razy niż musiałem.

Również polecenie stringsbyło pomocne w usuwaniu śmieci binarnych z danych wyjściowych, ale jeśli dobrze pamiętam, usunęło również wszystkie znaki nowej linii, co może być problemem.

Aby znaleźć pliki binarne w ten sam sposób, można odnieść sukces w znalezieniu charakterystycznego nagłówka lub jakiegoś określonego pliku, ale wyobrażam sobie, że to dość duża przygoda.


Krótkie uwagi techniczne: występują problemy techniczne z odzyskiwaniem dysku i Ext3 / 4. Jest to długa rzecz do wyjaśnienia, ale krótko (i nieodpowiednio): Ext3 / 4 usuwa „znaczniki”, które informują system operacyjny, gdzie znajdują się pliki na dysku podczas ich usuwania. Pliki nie są szorowane, ale nikt nie wie, gdzie na dysku zaczynają i kończą, a czasem są nawet fragmentowane w kilku miejscach. Niektóre inne systemy plików po prostu ustawiają statusy plików na „usunięte”, ale zachowują dane lokalizacji. W takim przypadku cofnięcie usunięcia nie jest trudniejsze niż spojrzenie na wskaźniki plików z tą flagą (powinny one być nadal dostępne, jeśli nie wystąpiło zbyt wiele działań), a następnie mieć nadzieję, że ich zawartość nie zostanie nadpisana.

Co jest najlepsze Moim zdaniem retoryczne. Częste tworzenie kopii zapasowych jest odpowiedzią na wszystkie te problemy. Ważne dane bez automatycznego systemu tworzenia kopii zapasowych to wypadek, na który czeka, IMHO.


Obowiązkowy osobisty anegdota: miałem zamiar usunąć foo\ foo*z ~. napisałem

rm -r foo<Tab>*

, który, niestety, ponieważ foonajwyraźniej był dowiązaniem symbolicznym i jedynym plikiem do niego pasującym, wykonana została powłoka

rm -r foo\ foo *

Nacisnąłem Enter i usiadłem, patrząc na polecenie, które powinno zająć najwyżej sekundę. Po nieco dłuższym czasie rmzapytał mnie, czy chcę „usunąć plik„ chroniony przed zapisem ”„ coś ”. Dość szybko poczułem dreszcze i delikatnie i bardzo kontrolowany nacisnąłem Ctrl+c. ~ Połowa mojego ~została usunięta, ale udało mi się odzyskać wszystko, co jest wartościowe, dzięki wyżej opisanemu greppingowi i niektórym mniej lub bardziej bieżącym kopiom zapasowym. Miałem bardzo cenne osobiście (czytane: czasochłonne) i bardzo aktualne dane pomiarowe na utraconym dysku, ale wykonałem czterokrotne kopie zapasowe. Jeden zniknął tutaj, inny z powodu awarii systemu w szkole, inny był uszkodzony i na początku nie mogłem znaleźć czwartego, ponieważ przez pomyłkę umieściłem go w niewłaściwym folderze :-D. Nie miałrm -rutknął na pliku chronionym przed zapisem, czwarty zostałby zjedzony, ponieważ ten folder został zamontowany przez sshfs w moim ~. Od tego czasu jestem bardziej ostrożny w tego typu sprawach.

Daniel Andersson
źródło
5

Jeśli jest to standardowy rm , mam nadzieję, że masz kopię zapasową. Procedura odzyskiwania usuniętego pliku byłaby inna dla każdego systemu plików, jeśli można to w ogóle zrobić. Linux nie ma wbudowanego „kosza”; po usunięciu pliku prawie go nie ma.

Niezależnie od tego, jak to zrobisz, będziesz chciał odłączyć komputer - tak szybko, jak to możliwe, ponieważ dalsze uruchamianie komputera (nawet w celu jego wyłączenia) powoduje zapis na dysku i zwiększa szansę, że niektóre bloki wcześniej zajmowane przez plik zostanie nadpisany. Gdy to zrobisz, włóż go do innego komputera, uruchom ponownie dysk CD na żywo (pamiętaj, aby nie montować dysku, chyba że zostanie on zamontowany tylko do odczytu) lub wyjmij dysk twardy i zanieś go do specjalisty ds. Odzyskiwania danych.

cHao
źródło
4

Ustaw niskie oczekiwania. Jeśli cokolwiek zostało zapisane na „usuniętych” danych, stracisz je.

Zrobiłem niewielką ilość odzyskiwania, a najlepsze narzędzia, które znalazłem, były często projektowane z myślą o określonych formatach. Na przykład „photorec” był świetny, gdy chciałem odzyskać dziesiątki tysięcy plików JPEG.

Recuva również pomogła mi wcześniej i może być twoim najlepszym wyborem. (Jest bezpłatny, nie daj się zwieść płaceniu za reklamy)

Na koniec dnia, jeśli to, co straciłeś, jest ważne, wyłącz dysk i przestań do niego pisać. Korzystaj z każdego dostępnego oprogramowania do odzyskiwania, dopóki nie odzyskasz danych lub przestanie to być warte. Jeśli jest to naprawdę ważne, wyślij go do profesjonalistów po wysokiej cenie.

Jeśli miałeś wcześniej szczęście z narzędziem, spróbuj ponownie, gdy znasz je. Na koniec dnia nie powinny zapisywać na dysku, więc możesz używać oprogramowania, dopóki nie znajdziesz takiego, który działa.

PriceChild
źródło
2

Oto świetny dokument dla Ciebie. Znajdziesz tam mnóstwo praktycznych wskazówek.

BTW, istnieją dwie grupy osób:

  1. tych, którzy wykonują kopie zapasowe
  2. tych, którzy będą wykonywać kopie zapasowe

Gratulacje, właśnie awansowałeś do grupy 2. ;-)

Michał Šrajer
źródło
2

Jeśli masz otwartą aplikację, która obecnie czyta plik, taką jak VLC lub LibreOffice, ta wspaniała odpowiedź L & U.SO pomogła mi wyjść z tego bałaganu. Oto alternatywna metoda robienia tego samego.

Ogólnym pomysłem jest znalezienie linku /proc/PID/fd/DESCRIPTOR_NUMBERi skopiowanie go z powrotem do pierwotnej lokalizacji. Użyj, ps aux | grep APP_NAMEaby znaleźć PID, a następnie, ls -la /proc/PID/fd/aby znaleźć odpowiedni DESCRIPTOR_NUMBER.

dotancohen
źródło
1

„Prawidłowa” odpowiedź to założenie, że nie ma metody niezawodnego odzyskiwania, i zamiast tego przywrócić z kopii zapasowych lub sklonowanego systemu lub zainstalować ponownie.

TestDisk to świetne narzędzie, a istnieją inne sposoby na odzyskanie niektórych danych z dysku fizycznego, w zależności od systemu plików i częstotliwości usuwania, ale czas i ból mogą być zbyt duże, więc ZACHOWAJ BACKUPS (a także testuj że są ważne i można je przywrócić)!

Andy Lee Robinson
źródło
1

Jeśli nie zostanie nadpisany przez innych użytkowników, masz szczęście. Przypadkowo usunąłem plik źródłowy cpp i użyłem narzędzia o nazwie przede wszystkim , które pomogło mi przywrócić z dysku resztki 60 g cpp. W końcu odzyskałem mój plik, gromadząc te kawałki po kawałku. Myślę, że skanuje pewien wzorzec dla określonego typu pliku i przegląda wszystkie i-węzły na dysku, aby odzyskać pliki! Po prostu spróbuj!

Izana
źródło
0

Jeśli przypadkowo usunąłeś plik z Linuksa, możesz użyć tego polecenia:

find /root -name "search text" -type f  -exec mv {} "/home" \;

zamiast search textmożesz umieścić nazwę pliku i określić katalog, w którym chcesz przywrócić zamiast /home.

Santosh
źródło
2
Cześć Santosh. Nie dodawaj mylących linków do swoich postów. Został usunięty.
ᔕᖺᘎᕊ
0

Możesz wypróbować ten skrypt. Działa ładnie i powinien być używany zamiast RM i używam go teraz intensywnie.

https://github.com/nateshmbhat/safe-rm

Cechy :

  • przeznaczony do użycia zamiast rm
  • obsługuje wszystkie argumenty, które może wziąć rm
  • obsługuje kolizje nazw plików z plikami już znajdującymi się w koszu
  • automatycznie obsługuje niektóre problemy z uprawnieniami
  • jeśli rm jest wywoływany z innego skryptu lub pośrednio, systemowa komenda „rm” jest używana automatycznie
  • pokazuje odpowiednie komunikaty o błędach, takie jak te, które się pojawiają rm
Natesh bhat
źródło
-2

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. Sintax jest bardzo łatwy:

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 pokazuje mini poradnik, który może ci pomóc.

Juan
źródło