Wie kann 'rm -rf /' alle Dateien im System löschen?

81

Ich habe diesen Befehl unter Ubuntu nicht aus offensichtlichen Gründen ausprobiert, daher bin ich mir nicht sicher, ob Ubuntu die Ausführung zulässt. Aber es ist berühmt dafür, alles zu löschen. Was passiert aus Neugier, wenn der Kernel /bingelöscht wird? Wie wird rmein Laufzeitstapel verwaltet? Wie gelingt rmes, mit dem Dateisystem zu kommunizieren und das Löschen abzuschließen? Wie kommuniziert es mit Hardware?

Muye
quelle
18
rm -rf /löscht nichts ohne --no-preserve-root.
muru
47
Meine allererste Erfahrung mit Linux bestand darin, ein Ubuntu-VM zu erstellen, damit ich es "rm -rf /" schreiben konnte. Ich empfehle Ihnen dies zu versuchen. Die Einrichtung ist schnell erledigt, der Host ist sicher und es ist sehr unterhaltsam zu beobachten, wie die verschiedenen Teile des Betriebssystems vor Ihren Augen zusammenbrechen. Sehr zufriedenstellend.
DJMcMayhem
22
Erinnert mich an meinen Lieblings-Understated-Fehlerbericht: bugzilla.redhat.com/show_bug.cgi?id=1202858 "Erwartete Ergebnisse: Squid wird neu gestartet. Tatsächliche Ergebnisse: Alle Dateien werden auf dem Computer gelöscht."
9
Sie sollten Unix Recovery Legend lesen . Solange Sie noch in einer Shell eingeloggt sind, ist das System nicht vollständig tot!
200_success
2
@ Gerrit habe ich . :)
muru

Antworten:

79

Es ist egal, dass /bin/rmgelöscht wird. Es wird nur einmal ausgeführt und zu diesem Zeitpunkt wird alles in den Speicher geladen, ebenso wie alles andere, was erforderlich ist, um weiterhin Löschvorgänge an das Dateisystem und die Festplatte zu senden.


Sidebar / Update: Per David Hoelzers Antwort (und in den Kommentaren erwähnt) würde die Inode, auf die der Hardlink zeigte /bin/rm, bis zum Abschluss bestehen bleiben rm(da Linux in einem offenen Zustand ist), aber diese Tatsache ist irrelevant; Der Zustand der Festplatte spielt keine Rolle.

Die Binärdatei wird vor dem Ausführen in den Speicher geladen. Selbst wenn Sie die rmDatenträgerdaten manuell zerstören könnten , würde dies den Abschluss des Löschvorgangs nicht beeinträchtigen oder verhindern (vorausgesetzt, Sie machen den Datenträger nicht anderweitig nicht verfügbar).

Keine Ahnung was ein Inode oder Hardlink ist? Dies ist die Antwort, wo ich es ausgearbeitet habe.


Dies ist auch der Grund, warum Sie das Paket für den aktuellen Kernel löschen können, ohne dass der Computer implodiert. Solange Sie eine andere Version installieren, kann diese gestartet werden.

Auch dies funktioniert, weil rmnur einmal aufgerufen wird. Folgendes würde nach dem /bin/rmTod fehlschlagen, da es einmal für jeden Dateinamen aufgerufen wird:

find / -exec rm {} \;

Das heißt, find / -exec rm -rf {} +und find / -print0 | xargs -0 rm -rfbeide würden wahrscheinlich auch scheitern, weil beide Argumentbegrenzungen haben, was bedeutet, dass sie nur eine Reihe von Dateien löschen würden, bevor sie erneut aufgerufen werden. Irgendwann auf der Reise /bin/rmkönnte ablaufen ( und freigegeben werden), bevor der Rest der Dateien gelöscht wurde. Es ist jedoch nicht garantiert. Wenn /bin/das letzte Verzeichnis eingegeben würde, könnten diese Methoden funktionieren.

Oli
quelle
7
Wie @DavidHoelzer erklärt, müssen sich nicht verknüpfte Dateien nicht bereits im Speicher befinden, um weiterarbeiten zu können. Der Kernel weiß, dass ein Datei-Handle geöffnet ist. Daher werden die Dateidaten beibehalten, um alle Anforderungen (einschließlich Page-Ins) zu erfüllen, bis das letzte Handle geschlossen wird.
Andrew Medico
4
@Desty, nein, das würde nicht gelingen, solange /bin/rmes nicht nah genug ist, um das Ende der allerletzten Partie zu sein. -exec ... {} +(Der Backslash-Escape-Befehl ist nicht erforderlich) führt immer noch zu mehreren Ausführungen. Nicht eine pro Datei, sondern eine pro Stapel, basierend auf der Anzahl der Argumente, die in ARG_MAX passen.
Charles Duffy
6
@Oli, es geht nicht um Paging; Referenzzähler sind mit dem Inode verknüpft, nicht mit dem Verzeichniseintrag, und ein offenes Dateihandle wird als Referenz gezählt (wie bei einer festen Verknüpfung), wodurch verhindert wird, dass die Zuordnung des Inodes aufgehoben wird. Die Dateigröße spielt keine Rolle, und dies ist auch dann der Fall, wenn überhaupt kein Auslagerungsspeicher (also kein Paging) vorhanden ist.
Charles Duffy
2
@CharlesDuffy Unabhängig davon, ob Sie über Swap Space verfügen oder nicht, wird Paging für alle Speicherzuordnungsdateien verwendet. Das schließt alle ausführbaren Dateien und Bibliotheken ein. In der Tat kann ein Mangel an Swap-Speicherplatz tatsächlich bedeuten, dass mehr Paging für Dateien mit Speicherzuordnung stattfindet.
Kasperd
2
@CharlesDuffy Ja, die Größe spielt in der Tat keine Rolle. Durch die Speicherzuordnung einer Datei wird der Inhalt der Datei erst geladen, wenn auf sie zugegriffen wird. Der zum Laden der aufgerufenen Teile der Datei verwendete Speicher kann bei Bedarf wieder freigegeben werden. Anschließend wird er bei erneutem Zugriff aus der Datei geladen. Die Datei muss also tatsächlich so lange im Dateisystem verbleiben, wie sie zugeordnet ist, und dies verhält sich für eine Datei mit einer Seite genauso wie für eine Datei, die groß genug ist, um den gesamten Adressraum zu überspannen. (Die Details sind etwas komplizierter für Zuordnungen beim Kopieren beim Schreiben, die für das dynamische Verknüpfen erforderlich sind.)
Kasperd
57

Ich habe diesen Befehl unter Ubuntu nicht aus offensichtlichen Gründen ausprobiert, daher bin ich mir nicht sicher, ob Ubuntu die Ausführung zulässt.

Ich tat. rm -rf / --no-preserve-rootwurde in einer Root-Sitzung ausgeführt, die direkt auf dem Computer geöffnet wurde, während ich auch über einen sshanderen Computer mit dem Root-Konto verbunden war.

Was passiert, ist, dass Sie eine Menge Nachrichten erhalten, wie:

rm: kann '/ ...' nicht entfernen: Operation nicht erlaubt

oder:

rm: kann '/ ...' nicht entfernen: Gerät oder Ressource belegt

Bildbeschreibung hier eingeben

Überraschenderweise sshblieb die Verbindung bis zum Ende der Operation geöffnet. Erst als ich die Verbindung geschlossen und versucht habe, sie wieder zu öffnen, ist ein Fehler aufgetreten:

Lesen vom Socket fehlgeschlagen: Verbindung vom Peer zurückgesetzt

Auf dem Computer verbleiben vier Verzeichnisse:

  • /dev. Hier werden Gerätedateien gespeichert.
  • /proc- Vom Kernel erstelltes speicherinternes Dateisystem.
  • /run, ein standardisierter Dateisystemspeicherort für Daemons.
  • /sys. Auf diese Weise erhalten Sie Informationen über das System und seine Komponenten.

Das bedeutet, dass dort nicht mehr viel übrig ist und nicht mehr viel zu tun ist. Sie können nicht ls(obwohl bei der Verwendung Tabdie Namen der Verzeichnisse und Dateien immer noch angezeigt werden). Sie können cdin verschiedenen Verzeichnissen und auch echoSachen, aber Befehle wie catsind nicht mehr verfügbar.

Es gibt auch keine sudo.

shutdown -h nowund rebootverschwand auch, so dass Ihre einzige Option scheint, die Maschine manuell herunterzufahren. Logout ( exit) funktioniert nicht, auch wenn ein schöner "Logout" -Text angezeigt wird.

Sobald Sie versuchen, den Computer neu zu starten, wird Ihnen ein netter GRUB-Fehler 15 angezeigt, und dann passiert nichts. An diesem Punkt können Sie anfangen zu denken, dass rmIhr System möglicherweise etwas Schlechtes angerichtet hat.

Bildbeschreibung hier eingeben

Du kannst es auch tun

Nein, warte, mach das nicht auf deiner Maschine!

Sie können stattdessen eine virtuelle Maschine ausführen . VMs haben den Vorteil, dass das Experimentieren sehr einfach ist. Da Sie Ubuntu verwenden, könnte Sie vmbuilder interessieren . Dies ist ein Tool, mit dem Sie virtuelle Maschinen in wenigen Minuten bereitstellen können (die offizielle Dokumentation besagt, dass dies "in ungefähr einer Minute" erledigt werden kann, aber die tatsächliche Zeit selbst auf schneller Hardware beträgt ungefähr zwei bis drei Minuten .

Sobald die Bereitstellung abgeschlossen ist, haben Sie eine Umgebung, mit der Sie spielen können. Wenn Sie es am Ende zerstören, spielt es keine Rolle: Sie stellen den Computer erneut bereit und zwei Minuten später können Sie fortfahren.

Wenn Sie Software wie VMWare verwenden, sind Sie möglicherweise auch an Snapshots interessiert (beachten Sie, dass der kostenlose VMWare Player diese Funktion nicht bietet; Sie müssen VMware Workstation erwerben). Beachten Sie, dass Hyper-V kostenlos ist und Snapshots unterstützt (Sie müssen jedoch Windows ausführen).

Schnappschüsse haben den Vorteil, dass Sie einen in wenigen Millisekunden erstellen können. Das Zurücksetzen auf einen Snapshot dauert länger, ist jedoch häufig eine Frage von Sekunden. Dies macht das Experimentieren noch einfacher und schneller.

Dieses Experimentieren ist nicht auf das Betriebssystem selbst beschränkt. Sie können alle möglichen Dinge mit Software erledigen. Hast du eine verdächtige Bewerbung? Testen Sie es in einer virtuellen Maschine. Wenn es sich um einen Virus handelt, kann dies keinen Schaden anrichten. Möchten Sie einen Vorgang in einer Datenbank testen, da dies die Umgebung beeinträchtigen könnte? Testen Sie es in einer VM.

Was wäre, wenn Sie das auf einer realen Maschine ohne Test machen würden?

Schlimme Dinge passieren. Beachten Sie, dass rmSie vor sich selbst schützt: rm -rf /funktioniert nicht: Sie müssen verwenden --no-preserve-root. Was wäre, wenn Sie tatsächlich versehentlich alles entfernen könnten?

rmHebt nur die Verknüpfung von Dateien auf , aber die Daten befinden sich immer noch auf Ihrer Festplatte. Dies ermöglicht eine spätere Wiederherstellung (weshalb Sie Ihre Festplatten mit vertraulichen Daten nicht einfach wegwerfen sollten, wenn sie nicht mehr funktionieren).

Dies bedeutet, dass Sie nur einen Ersatz-PC mit einem Festplattengehäuse benötigen, um praktisch alle Dateien wiederherstellen zu können. Wichtig ist, dass Sie nichts auf die Festplatte schreiben, um es wiederherzustellen: Die Daten, die Sie schreiben, überschreiben die nicht verknüpften Dateien.

Wie in dem Artikel in 200_successs Kommentar erwähnt , können Sie die Maschine auch ohne Ersatz-PC zurückerhalten , wenn Sie klug handeln. Wenn es Ihnen nur um Daten geht, würde ich mich nicht darum kümmern - die Wiederherstellung mit einem Ersatz-PC ist viel einfacher.

Arseni Mourzenko
quelle
VirtualBox unterstützt Festplatten-Snapshots.
Nathan Osman
1
Beachten Sie, dass Viren häufig zur Erkennung von VMs entwickelt wurden. Daher würde ich diesen Virenerkennungsprozess nicht empfehlen. Eine kleine Frage: Die restlichen vier Verzeichnisse sind keine "echten" Verzeichnisse, oder? Sie sind nicht wirklich auf der Festplatte? Was bleibt auf der Festplatte, nachdem dieser Befehl ausgeführt wurde?
Raptortech97
2
@ raptortech97 löscht rmnicht wirklich Daten von der Festplatte, sondern "löst" lediglich die Verknüpfung (Trennung) der tatsächlichen Daten auf der Festplatte vom Dateisystembaum und markiert sie als frei (so dass sie möglicherweise bei normaler Computernutzung überschrieben werden). Wenn Sie also sagen, rm -rf ~ist nicht alles verloren, solange Sie schnell handeln (z extundelete. B. mit ). Sie können es sich als eine noch unzuverlässigere Version des "gelöschten" Ordners in Ihrer Mailbox vorstellen. Sie können Dinge zurückbekommen, wenn Sie nicht zu lange warten, aber irgendwann wird es gelöscht.
Thomas
@ raptortech97 Auf der anderen Seite, wenn Sie aus irgendeinem Grund nicht verwendet haben , rmaber shredes ist ziemlich viel Spiel vorbei, obwohl Sie wahrscheinlich Zeit , um Ihre Fehler und Abbruch , da Schreddern mehr haben werde zu realisieren braucht.
Thomas
5
Die Verzeichnisse, die geführt werden, sind höchstwahrscheinlich Mount-Punkte in irgendeiner Form. Und die Befehle, die weiterhin funktionieren, sind eingebaute Bash-Befehle, keine separaten Binärdateien. Also solange lses weg ist, for i in /*; do echo $i; donesollte es funktionieren. Und zum Ersetzen können catSie einen Befehl wie verwenden while read i; do echo $i; done < /proc/self/maps.
MVG
25

Der Grund dafür ist, dass die Dateibenennungsebene (was Sie sehen ls) nur zu Ihrer Bequemlichkeit dient. Der Dateisystemtreiber und der Kernel kümmern sich nur darum, was der Inode ist. Wenn eine Datei namentlich referenziert wird, wird sie sofort in den Inode übersetzt, der alle Metadaten enthält, einschließlich der Berechtigungen, der Datenblöcke auf der Festplatte, der Eigentümer-ID, der Gruppen-ID und der Anzahl der Verknüpfungen.

Die Anzahl der Links ist hier wirklich wichtig. Wenn Sie eine Datei auf einem UNIX-System löschen, ist der eigentliche Systemaufruf ein unlink. Was unter der Haube passiert, ist, dass die Anzahl der Links (die Anzahl der Dateinamen in der Dateinamenebene), die auf diesen Inode zeigen, verringert wird. Das Dateisystem weiß, dass eine Datei gelöscht wird, wenn die Anzahl der Verknüpfungen Null erreicht.

Wenn eine Datei dadurch gelöscht wird rm, wird auch die Verzeichnisdatei bearbeitet (ja, es handelt sich nur um eine Datei, die den Dateinamen und den Inode sowie einige andere Bits enthält, die für diese Antwort nicht wichtig sind). Es ist jedoch die Aufhebung der Verknüpfung, die die Festplattenressourcen tatsächlich freigibt.

Dies führt zu einigen anderen interessanten Effekten. Erstens ist es möglich, eine Datei zu öffnen, deren Linkanzahl Null ist. Dies passiert, wenn rm -rf /der Eintrag für gelöscht wird /bin/rm. Die Datei ist geöffnet (es gibt ein Datei-Handle), aber der Inode ist als gelöscht markiert (Linkanzahl = 0). Die Datenträgerressourcen werden erst freigegeben und wiederverwendet, wenn das Dateihandle geschlossen wird.

Ein weiterer interessanter Effekt ist, was passiert, wenn Sie einen Inode mit einer Linkanzahl von mehr als Null haben, aber nichts in der Dateibenennungsebene, das darauf verweist. Dies ist in gewissem Sinne eine sehr gut versteckte Datei :). Um darauf zuzugreifen, müssten Sie eine niedrigere Ebene verwenden, um auf die Inode-Nummer anstatt auf den Namen zu verweisen (da es keine gibt), oder einen Verzeichniseintrag bearbeiten, um mit einem Hex-Editor auf die Inode zu verweisen.

Ein dritter interessanter Effekt ist, was passiert, wenn Sie die Anzahl der Links auf Null reduzieren, aber trotzdem einen Verzeichniseintrag auf den Inode verweisen. Ich überlasse es Ihnen, damit zu experimentieren, wenn Sie möchten. Es ist jedoch klar, dass die letzten beiden zu einem inkonsistenten Zustand des Dateisystems führen.

David Hoelzer
quelle
Anders ausgedrückt, die Anzahl der Links ist nicht Null, da beim Öffnen einer Datei ein Link in / proc eingefügt wird.
OrangeDog
@OrangeDog, dieses Verhalten existiert immer noch, auch wenn procfs nicht gemountet ist.
Charles Duffy
1
@OrangeDog Charles Duffy ist richtig. Die Datei - Handles in / proc Sie nicht die Inodes ändern, die Anpassung der Linkzähler.
David Hoelzer
/ proc und / sys spiegeln den aktuellen Systemstatus (Kernel) wider. Nur die Auswahl von Aktionen für Dateien und Verzeichnisse ändert den Systemstatus.
ein CVn
18

Die vorherigen Antworten sind gut, aber ich möchte ein Detail klarstellen:

rmist nicht nur ein Befehl. Es ist ein Programm, das in gefunden wird PATH.

Wenn Sie also ausführen, geschieht Folgendes:

  • du rufst (als root) rm -rf /
  • Die Programminstanz rmwird mit Argumenten -rfund in den Speicher geladen/
  • basierend auf diesen Argumenten rmstartet das Programm seine Operationen (durchläuft alles in Mounted / Partition und entfernt rekursiv Verweise darauf [Entschuldigung für die technische Umsetzung;)])
  • Sobald es abgeschlossen ist, wird die rmProgramminstanz entladen
  • Zu diesem Zeitpunkt befinden sich nur die Programme im Speicher, die zuvor dort geladen wurden (z. B. Bash, wenn Sie ein Terminal in Ubuntu, einer Desktop-Umgebung, einem Kernel, Treibern usw. geöffnet haben).
  • Wenn Sie versuchen, einen anderen Befehl aufzurufen (was Linux zu einem eigenständigen Programm macht), schlägt dies fehl, da in PATH-Speicherorten kein solches Programm mehr gefunden wird (und PATH-Speicherorte nicht mehr vorhanden sind). Jedoch läuft alles, was einmal geladen wurde, weiter

Nur um zu verstehen, wie es funktioniert, installieren Sie LAMP auf Ubuntu (in Virtualbox), einige Skripte und PHP-Opcode-Cache und rufen Sie dann diesen bösen Befehl auf. Überraschenderweise können Sie (wenn Sie Glück haben und Ihr Opcode-Cache das Löschen von PHP-Dateien nicht bemerkt) immer noch von außen über den Apache-Webserver auf PHP-Skripte zugreifen!

PS: Dieser böse Befehl wurde sogar als root ausgeführt und löscht nicht everything. Er kann nicht einige kernelprivilegierte Prozesse /procvon /devGeräten löschen , die auf Ihrem System als Dateien angezeigt werden. In der Tat ist root nicht so allmächtig wie wir denken, Kernel dagegen schon.

PPS: Auch als zweiter Gedanke haben Sie noch Dateien, die lockedzum Zeitpunkt des Löschversuchs von einem anderen Prozess stammen.

Alexey Kamenskiy
quelle
Unter Linux können Sie Geräteknoten entfernen, wenn Sie als Root ausgeführt werden. Aber ja, Sie können nichts löschen, /procda es sich um ein schreibgeschütztes Dateisystem handelt. Ebenso für /sys. Ich glaube, Sie können Mount-Punkte auch nicht löschen.
Brian
@AlexKey Ich empfehle die Bearbeitung, um zu verdeutlichen, was Sie unter "Nicht-Kernel-Embedded-Befehl" verstehen (oder um diesen Ausdruck insgesamt zu vermeiden). Es hört sich so an, als ob Sie sagen, dass es Befehle gibt, die Sie über eine Shell ausführen können , die direkt im Kernel implementiert sind, sodass sie immer funktionieren, egal was passiert. (Das ist, wie Sie wahrscheinlich wissen, aber viele Leser vielleicht nicht der Fall: Wenn Sie einen Befehl wie cddiesen ausführen, wird die unter diesem Namen eingebaute Shell aufgerufen - dieser Befehl ist in die Shell integriert, nicht in den Kernel.) meine Alt + SysRq "Befehle"?
Eliah Kagan
@Brian hängt es von der Distribution ab? Ich habe in verschiedenen Distributionen gearbeitet und so lustig es klingt, hat dieser Fehler mehrmals gemacht. Wie ich mich erinnerte, befand sich nach der Überprüfung der Überreste von / noch etwas in / dev, aber es könnten Dinge wie CD-ROM oder Diskette sein ...
Alexey Kamenskiy
@EliahKagan Da ich versucht habe, unabhängig von der Distribution zu bleiben, habe ich diesen Begriff verwendet. Dies bedeutet, dass nicht auf allen Systemen der Befehl cli ein externes Programm bedeutet. Aber danke, dass Sie darauf hingewiesen haben, ich werde den Punkt klarstellen.
Alexey Kamenskiy
@AlexKey Ich glaube, Sie könnten es nicht entfernen, /dev/ptsda es sich um einen Einhängepunkt handelt. (Und ein schreibgeschütztes Dateisystem auch.)
Brian
1

Sobald alles von den Festplatten gelöscht wurde, funktioniert der Kernel immer noch, steckt jedoch fest, da keine Geräte und Programme, Befehle usw. mehr vorhanden sind.

Das Betriebssystem funktioniert nicht mehr.

Und es ist wahr, was Oli sagt, der Befehl wird in den Speicher geladen / ausgeführt und nichts wird ihn stoppen, es sei denn, Sie beenden diesen Prozess (natürlich, wenn der Befehl kill noch vorhanden ist ^^).

s1mmel
quelle
4
Warum sollte der Kernel stecken bleiben? Die Antwort von MainMa schlägt etwas anderes vor und unterstützt das, was ich erwartet hätte.
MVG
4
Programme werden aus dem Speicher ausgeführt, nicht von der Festplatte. Der Kernel würde erst nach einem Neustart wissen, dass etwas nicht stimmt.
Phyrfox
Vielleicht muss ich die Wörter ändern, die ich verwendet habe, der Kernel ist mehr oder weniger ohne Geräte, Programme usw. "hängen geblieben" und wenn Sie nicht vor der Root-Konsole stehen, können Sie keine schlechten Sachen machen, was auch immer Konsole kann man keine schlechten Sachen machen. Aber ich werde meine Formulierung in meiner Antwort ändern, da es irreführend ist, stimme ich zu.
s1mmel
0

Bitte beachten Sie, dass wenn das System über Selinux verfügt und sich Selinux im Erzwingungsmodus befindet und die Richtlinien von Selinux ordnungsgemäß eingerichtet sind. dann wird nicht viel passieren.

Selinux ist eine obligatorische Zugriffskontrolle, was unter anderem bedeutet, dass der Root-Benutzer nicht viel mehr Macht hat, das System zu zerstören als jeder andere Benutzer im System.

Selinux wird im Kernel erzwungen; Sie müssten den Kernel kompromittieren, um ihn zu umgehen.

Auf einem gut konzipierten System mit guten Selinux-Richtlinien kann root nicht viel auf dem System tun.

Die späteren Versionen von Android haben Selinux gerade aus diesem Grund durchgesetzt.

Mark Allyn
quelle