Nie próbowałem tego polecenia na Ubuntu (z oczywistych powodów), więc nie jestem pewien, czy Ubuntu pozwoli na jego wykonanie. Ale słynie z usuwania wszystkiego. Z ciekawości, co się stanie, gdy jądro i /bin
zostaną usunięte? Jak rm
utrzymuje się stos czasu wykonywania? Jak rm
zarządza komunikacją z systemem plików i całkowitym usunięciem? Jak komunikuje się ze sprzętem?
kernel
filesystem
rm
Muye
źródło
źródło
rm -rf /
nie usuwa niczego bez--no-preserve-root
.Odpowiedzi:
Nie ma znaczenia, że
/bin/rm
zostanie usunięty. Jest uruchamiany tylko raz i do tego momentu wszystko jest ładowane do pamięci, podobnie jak wszystko inne wymagane do dalszego wysyłania usunięć do systemu plików i dysku.Pasek boczny / aktualizacja: Według odpowiedzi Davida Hoelzera (i wspomnianej w komentarzach) i-węzeł, na
/bin/rm
który wskazywał hardlink, pozostałby do samegorm
końca (ponieważ Linux jest w stanie otwartym), ale fakt ten jest nieistotny; stan dysku w ogóle nie ma znaczenia.Plik binarny jest ładowany do pamięci przed uruchomieniem. Nawet jeśli możesz ręcznie zniszczyć
rm
dane na dysku, nie wpłynie to na proces usuwania ani go nie zatrzyma (przy założeniu, że dysk nie stanie się niedostępny).Nie masz pojęcia, co to jest i-węzeł lub hardlink? To jest odpowiedź na to pytanie.
W każdym razie właśnie dlatego możesz usunąć pakiet dla bieżącego jądra bez implodowania komputera. Dopóki zainstalujesz inną wersję, będzie można ją uruchomić.
Ponownie działa to, ponieważ
rm
jest wywoływane tylko raz. Następujące nie powiedzie się po/bin/rm
śmierci, ponieważ wywołuje to raz dla każdej nazwy pliku:To powiedziawszy,
find / -exec rm -rf {} +
ifind / -print0 | xargs -0 rm -rf
oba prawdopodobnie również zawiodą, ponieważ oba mają ograniczenia argumentów, co oznacza, że usuną tylko kilka plików przed ponownym wywołaniem. W pewnym momencie podróży/bin/rm
może wygasnąć ( i zostać zwolniony) przed usunięciem pozostałych plików. Nie jest to jednak gwarantowane. Gdyby/bin/
wprowadzono ostatni katalog, te metody mogłyby działać.źródło
/bin/rm
nie jest wystarczająco blisko, aby być w ostatniej partii;-exec ... {} +
(ucieczka przed odwrotnym ukośnikiem jest niepotrzebna) nadal powoduje wielokrotne wykonywanie; nie jeden na plik, ale jeden na partię na podstawie liczby argumentów, które mogą zmieścić się w ARG_MAX.Zrobiłem.
rm -rf / --no-preserve-root
działał w sesji root otwartej bezpośrednio na maszynie, podczas gdy ja również byłem połączonyssh
z innego komputera, używając również konta root.Dzieje się tak, że zaczynasz otrzymywać wiele wiadomości, takich jak:
lub:
Co zaskakujące,
ssh
połączenie pozostało otwarte do końca operacji. Dopiero gdy zamknąłem połączenie i próbowałem ponownie je otworzyć, pojawił się błąd:Na komputerze pozostają cztery katalogi:
/dev
. Tutaj przechowywane są pliki urządzeń./proc
—System plików w pamięci utworzony przez jądro./run
, ustandaryzowana lokalizacja systemu plików dla demonów./sys
. Pozwala to uzyskać informacje o systemie i jego komponentach.Oznacza to, że niewiele zostało i nie ma wiele do zrobienia. Nie możesz
ls
(chociaż podczas używania Tabnazwy katalogów i plików są nadal wyświetlane). Możeszcd
w różnych katalogach, a także w różnychecho
rzeczach, ale takie poleceniacat
nie są już dostępne.Nie ma
sudo
też żadnego .shutdown -h now
ireboot
zniknął, więc twoją jedyną opcją wydaje się ręczne wyłączenie urządzenia. Logout (exit
) nie działa, nawet jeśli wyświetla ładny tekst „logout”.Gdy spróbujesz zrestartować komputer, pojawi się niezły błąd GRUB 15, a potem nic się nie dzieje, w tym momencie możesz zacząć myśleć, że mogłeś
rm
zrobić coś złego w twoim systemie.Ty też możesz to zrobić
Nie, czekaj, nie rób tego na swoim komputerze!
Zamiast tego możesz uruchomić maszynę wirtualną . Maszyny wirtualne mają tę zaletę, że ułatwiają eksperymentowanie. Ponieważ używasz Ubuntu, vmbuilder może Cię zainteresować . Jest to narzędzie, które pozwala wdrożyć maszyny wirtualne w ciągu kilku minut (oficjalna dokumentacja twierdzi, że można to zrobić „za około minutę”, ale faktyczny czas, nawet na szybkim sprzęcie, wynosi około dwóch-trzech minut .
Po zakończeniu wdrożenia masz środowisko, w którym możesz grać. Jeśli ostatecznie go zniszczysz, nie ma to znaczenia: ponownie uruchom maszynę, a dwie minuty później możesz kontynuować.
Jeśli korzystasz z oprogramowania takiego jak VMWare, możesz być również zainteresowany migawkami (zwróć uwagę, że darmowy VMWare Player nie ma tej funkcji; musisz kupić VMware Workstation). Pamiętaj, że Hyper-V jest bezpłatny i obsługuje migawki (ale musisz uruchomić system Windows).
Zaletą migawek jest to, że możesz zrobić jedną w ciągu kilku milisekund. Przywracanie do migawki trwa dłużej, ale często zajmuje kilka sekund. To sprawia, że eksperymentowanie jest jeszcze łatwiejsze i szybsze.
To eksperymentowanie nie ogranicza się do samego systemu operacyjnego. Możesz robić różne rzeczy związane z oprogramowaniem. Masz podejrzaną aplikację? Przetestuj na maszynie wirtualnej - jeśli jest to wirus, nie wyrządzi żadnej szkody. Chcesz przetestować operację na bazie danych, ponieważ może to mieć wpływ na środowisko? Przetestuj na maszynie wirtualnej.
Co jeśli zrobiłbyś to na prawdziwej, nie testowej maszynie?
Zdarzają się złe rzeczy. Pamiętaj, że
rm
chroni cię przed sobą:rm -rf /
nie działa: musisz użyć--no-preserve-root
. Ale co jeśli rzeczywiście udało ci się przez pomyłkę usunąć wszystko?rm
usuwa tylko pliki , ale dane są nadal na Twoim dysku twardym. Dzięki temu można je później odzyskać (dlatego nie należy po prostu wyrzucać dysków twardych z danymi wrażliwymi, gdy już nie działają).Oznacza to, że wystarczy mieć zapasowy komputer z obudową dysku twardego, aby odzyskać prawie wszystkie pliki. Ważne jest, aby unikać zapisywania czegokolwiek na dysku twardym w celu odzyskania: zapisane dane zastąpią niepowiązane pliki.
Jak zauważono w artykule w komentarzu 200_success , jeśli będziesz działać mądrze, możesz odzyskać maszynę nawet bez zapasowego komputera. Jeśli zależy Ci tylko na danych, nie zawracałbym sobie głowy - odzyskanie ich za pomocą zapasowego komputera jest znacznie łatwiejsze.
źródło
rm
tak naprawdę nie usuwa danych z dysku twardego, po prostu „rozłącza” (rozłącza) rzeczywiste dane na dysku z drzewa systemu plików, oznaczając je jako wolne (aby mogły zostać ostatecznie nadpisane przez normalne użycie komputera). Więc jeśli, powiedzmy,rm -rf ~
nie wszystko stracone, o ile działasz szybko (np. Zextundelete
). Możesz myśleć o tym jako o jeszcze bardziej niewiarygodnej wersji folderu „usuniętego” w skrzynce pocztowej, możesz odzyskać rzeczy, jeśli nie zaczekasz zbyt długo, ale w końcu zostaną usunięte.rm
aleshred
to już prawie koniec gry, chociaż prawdopodobnie będziesz miał czas, aby uświadomić sobie swój błąd i przerwać, ponieważ niszczenie trwa dłużej.ls
nie ma go,for i in /*; do echo $i; done
powinno działać. Aby zastąpić,cat
możesz użyć polecenia takiego jakwhile read i; do echo $i; done < /proc/self/maps
.Powodem jest to, że warstwa nazewnictwa plików (to, co widzisz
ls
) jest naprawdę dla Twojej wygody. Sterownik systemu plików i jądro dbają tylko o to, czym jest i-węzeł. Gdy do pliku odwołuje się nazwa, jest on natychmiast tłumaczony na i-węzeł, który zawiera wszystkie metadane, w tym uprawnienia, bloki danych na dysku, identyfikator właściciela, identyfikator grupy i liczbę łączy.Liczba linków jest tutaj naprawdę ważna. Gdy usuwasz plik w systemie UNIX, faktyczne wywołanie systemowe to
unlink
. To, co dzieje się pod maską, polega na tym, że liczba linków (liczba nazw plików w warstwie nazewnictwa plików) wskazująca na ten i-węzeł jest zmniejszana. System plików wie, że plik jest usuwany, gdy liczba linków osiągnie zero.Usunięcie pliku
rm
spowoduje również edycję pliku katalogu (tak, to tylko plik zawierający nazwę pliku i i-węzeł oprócz kilku innych bitów, które nie są ważne dla tej odpowiedzi). Jednak to rozłączenie faktycznie uwalnia zasoby dysku.To prowadzi do innych interesujących efektów. Po pierwsze, możliwe jest otwarcie pliku, którego liczba linków wynosi zero. Dzieje się tak, gdy
rm -rf /
usuwa wpis dla/bin/rm
. Plik jest otwarty (jest do niego uchwyt pliku), ale i-węzeł jest oznaczony jako usunięty (liczba linków = 0). Zasoby dyskowe nie zostaną zwolnione i ponownie użyte, dopóki uchwyt pliku nie zostanie zamknięty.Innym interesującym efektem jest to, co dzieje się, gdy masz i-węzeł z liczbą linków większą niż zero, ale nic w warstwie nazewnictwa plików, która na to wskazuje. To w pewnym sensie bardzo dobrze ukryty plik :). Aby uzyskać do niego dostęp, musisz użyć czegoś niskiego poziomu, aby odwołać się do niego za pomocą numeru i-węzła, a nie według nazwy (ponieważ nie istnieje) lub edytować wpis katalogu, aby wskazywał na i-węzeł za pomocą edytora szesnastkowego.
Trzecim interesującym efektem jest zmniejszenie liczby linków do zera, ale i tak skierowanie wpisu katalogu na i-węzeł. Zostawię to tobie do eksperymentowania, jeśli chcesz. Oczywiście oba te dwa ostatnie prowadzą do niespójności systemu plików.
źródło
Poprzednie odpowiedzi są dobre, ale chcę wyjaśnić jeden szczegół:
rm
to nie tylko polecenie. Jest to program, który można znaleźć wPATH
.Dlatego to, co dzieje się podczas wykonywania, jest następujące:
rm -rf /
rm
jest ładowane do pamięci z argumentami-rf
i/
rm
rozpoczyna działanie (przeglądając wszystko w zamontowanym / partycji i rekurencyjnie usuwając do niego odwołania [przepraszam za techniczność;)])rm
programu jest rozładowywanaAby zrozumieć, jak to działa, spróbuj zainstalować LAMP na Ubuntu (w Virtualbox), trochę skryptów i pamięci podręcznej kodu PHP, a następnie wywołaj to złe polecenie. Zaskakujące (jeśli masz szczęście, a pamięć podręczna opcode nie zauważy usunięcia pliku php), nadal możesz uzyskiwać dostęp do skryptów php z zewnątrz za pośrednictwem serwera Apache!
PS: to złe polecenie działało nawet jako root nie usuwa
everything
, nie może usuwać niektórych uprzywilejowanych procesów jądra/proc
i nie może usuwać niektórych rzeczy z/dev
urządzeń, które pojawiają się w twoim systemie jako pliki. W rzeczywistości root nie jest tak wszechmocny, jak nam się wydaje, z drugiej strony jądro.PPS: Również jako druga myśl nadal będziesz mieć pliki, które były
locked
w innym procesie w chwili próby usunięcia.źródło
/proc
ponieważ jest to system plików tylko do odczytu. Podobnie dla/sys
. Uważam, że nie można również usunąć punktów montowania.cd
, wywołuje to wbudowaną powłokę o tej nazwie - to polecenie jest wbudowane w powłokę, a nie w jądro). oznacza „polecenia” Alt + SysRq?/dev/pts
ponieważ jest to punkt montowania. (I także system plików tylko do odczytu.)Po wyczyszczeniu wszystkiego z dysków twardych jądro nadal działa, ale utknęło, ponieważ nie ma już żadnych urządzeń i programów, poleceń itp.
System operacyjny nie będzie już działać.
I to prawda, co mówi Oli, polecenie zostaje załadowane / wykonane do pamięci i nic go nie zatrzyma, chyba że zabijesz ten proces (oczywiście, jeśli polecenie zabicia jest nadal obecne ^^).
źródło
Należy pamiętać, że jeśli system ma selinux i selinux jest w trybie wymuszania, a zasady selinux są skonfigurowane poprawnie; wtedy nic się nie wydarzy.
Selinux jest obowiązkową kontrolą dostępu, co oznacza między innymi, że użytkownik root naprawdę nie ma dużo więcej mocy do zniszczenia systemu niż jakikolwiek inny użytkownik w systemie.
Selinux jest wymuszony w jądrze; musiałbyś skompromitować jądro, aby się obejść.
W dobrze zaprojektowanym systemie z dobrymi zasadami Selinuksa root nie byłby w stanie wiele zrobić w systemie.
Późniejsze wersje Androida wprowadzają Selinux z tego właśnie powodu.
źródło