Błąd w poniedziałek rano: sudo rm -rf --no-preserve-root /

146

Uwaga: odpowiedzi i komentarze do tego pytania zawierają treść z innego, podobnego pytania, które spotkało się z dużym zainteresowaniem ze strony mediów zewnętrznych, ale okazało się, że jest to mistyfikacja w jakimś programie marketingu wirusowego. Ponieważ nie zezwalamy na nadużywanie ServerFault w taki sposób, oryginalne pytanie zostało usunięte, a odpowiedzi zostały scalone z tym pytaniem.


Oto zabawna tragedia. Dziś rano przeprowadziłem trochę konserwacji na moim serwerze produkcyjnym, gdy przez pomyłkę wykonałem następujące polecenie:

sudo rm -rf --no-preserve-root /mnt/hetznerbackup /

Nie zauważyłem poprzedniej przestrzeni /i kilka sekund później, gdy ostrzeżenia zalewały moją linię poleceń, zdałem sobie sprawę, że właśnie nacisnąłem przycisk samozniszczenia. Oto trochę tego, co wypaliło mi oczy:

rm: cannot remove `/mnt/hetznerbackup': Is a directory
rm: cannot remove `/sys/fs/ecryptfs/version': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/inode_readahead_blks': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_max_to_scan': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/delayed_allocation_blocks': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/max_writeback_mb_bump': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_stream_req': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_min_to_scan': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_stats': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/trigger_fs_error': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/session_write_kbytes': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/lifetime_write_kbytes': Operation not permitted
# and so on..

Zatrzymałem zadanie i poczułem ulgę, gdy odkryłem, że usługa produkcyjna nadal działa. Niestety serwer nie akceptuje już mojego klucza publicznego ani hasła dla żadnego użytkownika za pośrednictwem SSH.

Jak posunąłbyś się stąd? Popłynę oceanem z drutu kolczastego, żeby odzyskać dostęp do SSH.

Serwer działa Ubuntu-12.04 i jest hostowany w Hetzner.

Jonas Nielsen
źródło
48
Przywróć z kopii zapasowych. Szczerze mówiąc, jest to jeden z tych niełatwych do rozwiązania scenariuszy.
MadHatter
310
Jak w ogóle piszesz --no-preserve-rootprzypadkowo ?! : -o
ThatGraemeGuy
144
Cholera, klucze są jak obok siebie.
MadHatter
38
Praca we wtorek: poszukaj nowej pracy;) Weź lekcję, dlaczego potrzebne są kopie zapasowe.
TomTom,
43
To z pewnością wydaje mi się trollowaniem. Nie możesz przypadkowo wpisać - i-naprawdę-znaczy-usunąć-mój-cały-root.
psusi

Odpowiedzi:

95

Uruchom system ratunkowy dostarczony przez Hetznera i sprawdź, jakie szkody wyrządziłeś.
Przenieś wszystkie pliki do bezpiecznej lokalizacji, a następnie ponownie wdróż serwer.

Obawiam się, że to najlepsze rozwiązanie w twoim przypadku.

oszust
źródło
102
patrz z drugiej strony, przynajmniej nie ma problemów z sercem!
metacom
222

Faktem jest? W tym momencie nie ma prostej / łatwej automatycznej naprawy tego problemu. Odzyskiwanie danych to nauka, a nawet podstawowe, powszechne narzędzia potrzebują kogoś, kto usiądzie i zapewni dane. Jeśli spodziewasz się, że wyjdziesz z tego bez ogromnych przestojów, będziesz rozczarowany.

Sugeruję użycie testdisk lub jakiegoś narzędzia do odzyskiwania specyficznego dla systemu plików. Wypróbuj jeden system, sprawdź, czy działa i tak dalej. Nie ma prawdziwego sposobu na zautomatyzowanie tego procesu, ale prawdopodobnie możesz to zrobić ostrożnie partiami.

To powiedziawszy, jest kilka bardzo przerażających rzeczy w pytaniach i komentarzach, które powinny być częścią raportów po akcji.

Po pierwsze, uruchomiłeś polecenie wszędzie, nie sprawdzając go najpierw. Uruchom polecenie na jednym polu. Potem kilka, potem więcej. Zasadniczo, jeśli coś pójdzie nie tak, lepiej wpłynąć na kilka, a nie na wszystkie systemy.

Po drugie

@Tim, jak wykonać kopię zapasową bez montowania zdalnego napędu na serwerze?

Przeraża mnie. Kopie zapasowe jednokierunkowe na poziomie plików są rozwiązanym problemem . Rsync może służyć do zachowania uprawnień i kopiowania plików w jeden sposób na stronę kopii zapasowej. Przypadkowo coś? Ponownie zainstaluj (najlepiej automatycznie) rsync i wszystko działa. W przyszłości możesz używać migawek na poziomie systemu plików z migawkami btrfs lub zfs i przesyłać je do kopii zapasowych na poziomie systemu. Właściwie bym się rozdzielił serwery aplikacji, bazy danych i pamięć masową i wprowadziłem zasadę najmniejszych uprawnień, abyś podzielił ryzyko takiego czegoś ...

Wiem, że mogę coś zrobić. Teraz muszę pomyśleć, jak się chronić

Po tym, jak coś się wydarzyło, jest to najgorszy moment na rozważenie tego.

Czego możemy się z tego nauczyć?

  1. Kopie zapasowe zapisują dane. Prawdopodobnie kariery.
  2. Jeśli masz narzędzie i nie wiesz, co on może zrobić, jest to niebezpieczne. Jedi może robić niesamowite rzeczy za pomocą miecza świetlnego. Pokój szympansów z mieczami świetlnymi ... bałagan.
  3. Nigdy nie uruchamiaj polecenia wszędzie jednocześnie. Oddziel maszyny testowe i produkcyjne, a najlepiej produkuj maszyny etapami. Lepiej jest naprawić 1 lub 10 maszyn niż 100 lub 1000.

  4. Komendy podwójnego i potrójnego sprawdzania. Nie ma się czego wstydzić, prosząc współpracownika o podwójne sprawdzenie: „hej, mam zamiar zrobić dysk, czy możesz to sprawdzić, żeby nie wyczyścić dysku?”. Opakowanie może również pomóc, ale nic nie przebije mniej zmęczonego zestawu oczu.

Co możesz teraz zrobić? Wyślij wiadomość e-mail do klientów. Poinformuj ich, że są przestoje i katastrofalne awarie. Porozmawiaj ze swoimi wyższymi awansami, działami prawnymi, sprzedażą itp. I zobacz, jak możesz zmniejszyć szkody. Rozpocznij planowanie odzyskiwania, aw razie potrzeby będziesz musiał w najlepszym razie zatrudnić dodatkowe ręce. W najgorszym przypadku planujesz wydać dużo pieniędzy na regenerację. Na tym etapie będziesz pracował nad złagodzeniem skutków awarii oraz poprawkami technicznymi.

Journeyman Geek
źródło
9
@MarcoMarsala Jeśli coś zamontowałeś przed użyciem rsync, nie robiłeś tego poprawnie. Powinieneś używać rsync przez ssh.
Michael Hampton
67
Dodałbym do tej doskonałej odpowiedzi: Odsuń się od komputera. Nie próbuj niczego naprawiać, dopóki się nie uspokoisz. Już patrzysz na poważne przestoje; poświęcenie czasu na przemyślenie sprawy zamiast niszczenia systemów jeszcze bardziej (jak w ddpowyższym numerze) nie pogorszy sytuacji.
Jenny D.
22
Masz pojęcie, dlaczego polecenie faktycznie się uruchomiło? Jeśli $fooi $baroba były niezdefiniowane, rm -rf /powinny były zostać zignorowane z --no-preserve-rootwiadomością. Jedyny sposób, w jaki mogę to wymyślić, to by faktycznie działało na maszynie CentOS7, jeśli zostanie to $barocenione *, więc to, co zostało uruchomione, było rm -rf /*.
terdon
9
Uwielbiam stylizm w „Przypadkowo czymś?”. To musi znaczyć, że słowo „usunięte” zostało „usunięte” lub „upuszczone” przypadkowo.
patrz
20
@MarcoMarsala cóż, przynajmniej jesteś sławny teraz niezależny.co.uk/
Martin Smith
92

Po usunięciu rzeczy rm -rf --no-preserve-rootprawie nie można odzyskać. Jest bardzo prawdopodobne, że straciłeś wszystkie ważne pliki.

Jak powiedział @faker w swojej odpowiedzi, najlepszym sposobem jest przeniesienie plików do bezpiecznej lokalizacji, a następnie ponowne wdrożenie serwera.

Aby uniknąć podobnych sytuacji w przyszłości, sugeruję:

  • Rób kopie zapasowe co tydzień lub co najmniej co dwa tygodnie. Pomoże to w przywróceniu usługi, której dotyczy problem, przy możliwie najniższym MTTR.

  • Nie pracuj jako root, gdy nie jest potrzebny . I zawsze pomyśl dwa razy, zanim cokolwiek zrobisz. Sugeruję również zainstalowanie safe-rm .

  • Nie wpisuj opcji, których nie zamierzasz wywoływać , na przykład --no-preserve-rootlub --permission-to-kill-kittens-explicitly-granted.

Amal Murali
źródło
18
Podobnie, chyba że NAPRAWDĘ OZNACISZ, nie dodawaj --please-destroy-my-driveparametru do hdparm.
MikeyB,
3
Chciałbym dodać; „Potrójnie sprawdź argumenty (i opcje) podczas pracy jako root”, „Sprawdź swój CurrentWorkingDirectory (przed zrobieniem czegoś takiego jak rm -rf *)” i „Użyj pełnych ścieżek do poleceń (nie polegaj na $ PATH).
Baard Kopperud
47

Miałem ten sam problem, ale po prostu testowałem na dysku twardym, wszystko straciłem. Nie wiem, czy będzie to przydatne, ale niczego nie instaluj , nie nadpisuj danych , musisz zamontować dyski twarde i uruchomić niektóre narzędzia kryminalistyczne, takie jak autopsja, photorec, Testdisk.

Zdecydowanie polecam Testdisk, z kilkoma podstawowymi poleceniami możesz odzyskać swoje dane, jeśli ich nie zastąpisz.

Octo
źródło
8
Zdecydowanie zaleciłbym przestawienie pamięci w tryb offline, jeśli to w ogóle możliwe, i ponowne zamontowanie jako „tylko do odczytu”, jeśli w ogóle możesz. Czy to za pomocą liveisk, czy innej instancji serwera.
mhouston100 12.04.16
2
Zastanawiałbym się nawet nad zrobieniem kopii oryginalnego dysku na nowym dysku z montażu oryginalnego dysku tylko do odczytu, aby zachować bezpieczeństwo.
Jim
3
«Te narzędzia nie odzyskają nazwy pliku i ścieżki» Tak, robią to. Spośród 3 wymienionych narzędzi tylko jedno (Photorec) wykonuje rzeźbienie.
Andrea Lazzarotto
34

Najlepszym sposobem na rozwiązanie takiego problemu jest nie zajmowanie się nim w pierwszej kolejności.

Nie wprowadzaj ręcznie polecenia „rm -rf” z ukośnikiem na liście argumentów. (Umieszczenie takich poleceń w skrypcie powłoki z naprawdę dobrymi procedurami sprawdzania poprawności / poprawiania higieny, aby uchronić cię przed zrobieniem czegoś głupiego, jest inne.)

Po prostu nie rób tego.
Zawsze. Jeśli uważasz, że musisz to zrobić, nie myślisz wystarczająco mocno.

Zamiast tego zmień katalog roboczy na katalog nadrzędny katalogu, z którego chcesz rozpocząć usuwanie, aby cel polecenia rm nie wymagał ukośnika:

cd / mnt

sudo rm -rf hetznerbackup

Monty Harder
źródło
31
Zawsze umieszczam -rf na końcu listy argumentów, więc rm /bla/foo/bar -rf. Przynajmniej w ten sposób nie mam większych problemów, kiedy akcentuję akcentowo klawisz Return rm /.
Jens Timmerman
5
Podobnie, usuwając pliki „* ~”, najpierw wpisuję tyldę, a następnie dodaj gwiazdkę.
tekknolagi
4
Więc wolisz usunąć swój dom niż wszystko w bieżącym katalogu?!?
greg0ire 17.04.16
@ greg0ire Nie, myślę, że chciał powiedzieć, że w /mnt/hetznerbackupśrodku musiał użyć „/”, aby zaznaczyć wszystko w tym folderze .. ale od rodzica hetznerbackupwystarczy tylko , bez ukośników.
T.Todua
1
@tazotodua: Odniosłem się do komentarza
tekknolagi
16

Spróbowałbym odzyskać komputer z kopią zapasową, na której były przechowywane wszystkie kopie:

  • Pierwszy krok - Wykonaj kopię zapasową skasowanych dysków „maszyny kopii zapasowej” za pomocą polecenia dd.
  • Drugi krok - służy testdiskdo odzyskiwania plików.

Powiedzmy, że chcesz odzyskać 1 TB, będziesz potrzebować dodatkowych 2 TB, 1 TB na kopię zapasową (1. krok) plus 1 TB na odzyskiwanie (2. krok).

Zrobiłem podobny błąd z aliasem rm -fr [telefon zadzwonił] i cd do cennego katalogu. Teraz zawsze myślę dwa razy i sprawdzam kilka razy, zanim użyję polecenia rm lub dd.

Abc Xyz
źródło
6
W ten sposób prawie wyzerowałeś dysk. To poważnie utrudnia odzyskanie. Jest dobry powód, dla którego OP zasugerował, że spróbowałeś użyć testdisk i odzyskać najpierw, i chociaż składnia dd może być trochę dziwna, to dobry powód do podwójnego i potrójnego sprawdzania przed uruchomieniem polecenia. Wyczyściłeś tylko jeden serwer, prawda?
Journeyman Geek
1
Nadal możesz się zregenerować, zależy od tego, jak długo pozwoliłeś ddskasować ostatnią szansę.
Abc Xyz
129
przykro mi to mówić, ale czuję ogromnego trolla w tym pytaniu ...
tymik
3
mam nadzieję, że czujesz małego trolla w odpowiedzi :)
Abc Xyz
5
Szczerze. Nie jestem pewien, czy jesteś prawdziwy. Jeśli tak, prawdopodobnie jesteś w złej pracy ...
pozostawiono
7

Jak wspomniano w innej odpowiedzi, Hetzner ma system ratunkowy. Zawiera zarówno opcję netboot z dostępem ssh, jak i aplet java, który udostępnia ekran i klawiaturę na serwerze vserver.

Jeśli chcesz odzyskać jak najwięcej, zrestartuj serwer w systemie netboot, a następnie zaloguj się i pobierz obraz systemu plików, czytając z odpowiedniego i-węzła urządzenia.

Myślę, że coś takiego powinno działać:

ssh root@host cat /dev/sda > server.img

Oczywiście przekierowanie jest wykonywane przez powłokę przed wywołaniem polecenia ssh, więc server.img jest plikiem lokalnym. Jeśli chcesz tylko główny system plików, a nie pełny dysk, zastąp sdago, sda3zakładając, że używasz tego samego obrazu co ja.

kasperd
źródło
może być: ssh root@host cat /dev/sda | gzip -c - > /path/to/dir_on_huge_partition/server.img.gz(gzip w locie pomoże lub nie pomoże, w zależności od zawartości systemu plików ...)
Olivier Dulac
@OlivierDulac Korzystanie z gzip w ten sposób wysłałoby dane nieskompresowane przez sieć, a następnie skompresuje je po stronie odbierającej. Zakładam, że zamierzonym rezultatem było skompresowanie danych podczas przesyłania. Lokalny obraz może być zapisany jako skompresowany lub nie, ale narzędzia, które chcesz zastosować do tego obrazu później, nie będą działać z wersją skompresowaną. Jeśli wszystko, co chcesz osiągnąć, to kompresja danych podczas przesyłania, możesz skorzystać z funkcji kompresji w ssh. Można ją włączyć, -Cjeśli nie jest jeszcze włączona w konfiguracji.
kasperd
2
Próbowałem bardziej zmniejszyć rozmiar pliku. Ale jeśli chcesz zaoszczędzić przepustowość (dobry pomysł): po prostu dodaj cudzysłowy: ssh root@host "cat /dev/sda | gzip -c - " > /path/to/dir_on_huge_partition/server.img.gz(opcja -c ssh jest również zwykle dobra, ale nadal musisz kompresować na końcu, ponieważ ssh kompresuje się tylko przy wejściu do tunelu i rozpakuj przed wysłaniem na standardowe wyjście)
Olivier Dulac
2

Jak posunąłbyś się stąd?

Przysiągłbym używać rmdo końca życia i uważam, że szaleństwem jest to, że trash-cli nie jest domyślną komendą usuwania w systemach nix.

https://github.com/andreafrancia/trash-cli

Chciałbym upewnić się, że jest to pierwsza rzecz, którą instaluję na nowym systemie i alias rmcoś, co mówi ludziom, aby trash-clizamiast tego korzystali . Zawierałaby także notatkę o innym alidzie, który faktycznie działa, /bin/rmale mówi im, aby w większości przypadków nie korzystali z niego.

:( Prawdziwa historia

Gerry
źródło
2
Z mojego doświadczenia wynika, że ​​tego rodzaju narzędzia są bardziej uciążliwe niż faktyczna pomoc - wcześniej czy później, a po przekleństwach je usuniesz. Może to być odpowiednie dla stacji roboczej, ale w wielu, jeśli nie w większości sytuacji, gdy wykonujesz prace administracyjne na serwerze, naprawdę musisz usunąć dane, a nie tylko przenieść je gdzie indziej (a jeśli tak, to po prostu użyj mv zamiast). Poza tym automatyczne przenoszenie danych do folderu kosza może samo w sobie prowadzić do poważnych problemów (np. Kosza nie w tym samym systemie plików, bezpieczeństwa).
maetthu
@maetthu Och, oczywiście, że rzeczy są usuwane po tym, jak znajdują się w koszu przez określoną liczbę dni. Ubuntu Desktop robi to z elementami, które znajdowały się w koszu dłużej niż 30 dni. Na serwerze możesz chcieć czegoś krótszego, np. trash-empty 5w cronie. Chodzi o to, aby dać ci trochę okresu karencji, ponieważ ludzie popełniają błędy.
Gerry
Czy nie lepiej jest mieć działający plan odzyskiwania po katastrofie niż zakazać podstawowych narzędzi systemowych?
user292812 17.04.16
@ user292812 Nie sugerowałem banowania / bin / rm, po prostu to, że w większości przypadków nie powinna to być pierwsza opcja (zwróć uwagę na alias / bin / rm). Twoje pytanie sugeruje również fałszywy wybór między odzyskiwaniem po awarii a opcją usuwania przyjazną dla człowieka. Powinieneś mieć oba.
Gerry
1
Dwustopniowy proces usuwania może zaoszczędzić wielu kłopotów: 1. przenieś do kosza (słownie), 2. opróżnij kosz. Alias ​​takiego skryptu na „rm” i to uratowało mnie przed przypadkowym usunięciem ważnych rzeczy wiele razy.
Sam Watkins,
1

Radziłbym w takim przypadku odmontować i użyć debugfs , a przy pomocy lsdel możesz wyświetlić listę wszystkich ostatnio usuniętych plików, które nie zostały usunięte z czasopism, a następnie zrzuciły potrzebne pliki. Link do szybkiego wyszukiwania tego samego: http://www.linuxvoodoo.com/resources/howtos/debugfs

mam nadzieję, że to komuś pomoże. ;)

I tak, jedną z sugestii jest wykonanie skryptu, który przeniósł ryzę rm na real.rm i symlinc mv na rm ;)

BiG_NoBoDy
źródło
-2

Zatrzymaj wszystkie procesy serwera i wszystko, co może powodować dyskowe operacje we / wy ..., a następnie uruchom testdisk, powinien on znajdować się na stosie oprogramowania. Jeśli masz fizyczny dostęp, użyj płyty live z dyskiem testowym.

Saint Crusty
źródło
1
Nie bardzo rozumiem, dlaczego uważasz, że trzy odpowiedzi zawierające dokładnie tę samą sugestię nie były wystarczające?
kasperd 17.04.16