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 /bin
gelöscht wird? Wie wird rm
ein Laufzeitstapel verwaltet? Wie gelingt rm
es, mit dem Dateisystem zu kommunizieren und das Löschen abzuschließen? Wie kommuniziert es mit Hardware?
kernel
filesystem
rm
Muye
quelle
quelle
rm -rf /
löscht nichts ohne--no-preserve-root
.Antworten:
Es ist egal, dass
/bin/rm
gelö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 bleibenrm
(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
rm
Datenträ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
rm
nur einmal aufgerufen wird. Folgendes würde nach dem/bin/rm
Tod fehlschlagen, da es einmal für jeden Dateinamen aufgerufen wird:Das heißt,
find / -exec rm -rf {} +
undfind / -print0 | xargs -0 rm -rf
beide 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/rm
kö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.quelle
/bin/rm
es 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.Ich tat.
rm -rf / --no-preserve-root
wurde in einer Root-Sitzung ausgeführt, die direkt auf dem Computer geöffnet wurde, während ich auch über einenssh
anderen Computer mit dem Root-Konto verbunden war.Was passiert, ist, dass Sie eine Menge Nachrichten erhalten, wie:
oder:
Überraschenderweise
ssh
blieb 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: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önnencd
in verschiedenen Verzeichnissen und auchecho
Sachen, aber Befehle wiecat
sind nicht mehr verfügbar.Es gibt auch keine
sudo
.shutdown -h now
undreboot
verschwand 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
rm
Ihr System möglicherweise etwas Schlechtes angerichtet hat.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
rm
Sie 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?rm
Hebt 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.
quelle
rm
nicht 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 (zextundelete
. 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.rm
abershred
es ist ziemlich viel Spiel vorbei, obwohl Sie wahrscheinlich Zeit , um Ihre Fehler und Abbruch , da Schreddern mehr haben werde zu realisieren braucht.ls
es weg ist,for i in /*; do echo $i; done
sollte es funktionieren. Und zum Ersetzen könnencat
Sie einen Befehl wie verwendenwhile read i; do echo $i; done < /proc/self/maps
.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.
quelle
Die vorherigen Antworten sind gut, aber ich möchte ein Detail klarstellen:
rm
ist nicht nur ein Befehl. Es ist ein Programm, das in gefunden wirdPATH
.Wenn Sie also ausführen, geschieht Folgendes:
rm -rf /
rm
wird mit Argumenten-rf
und in den Speicher geladen/
rm
startet das Programm seine Operationen (durchläuft alles in Mounted / Partition und entfernt rekursiv Verweise darauf [Entschuldigung für die technische Umsetzung;)])rm
Programminstanz entladenNur 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/proc
von/dev
Gerä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
locked
zum Zeitpunkt des Löschversuchs von einem anderen Prozess stammen.quelle
/proc
da es sich um ein schreibgeschütztes Dateisystem handelt. Ebenso für/sys
. Ich glaube, Sie können Mount-Punkte auch nicht löschen.cd
diesen 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"?/dev/pts
da es sich um einen Einhängepunkt handelt. (Und ein schreibgeschütztes Dateisystem auch.)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 ^^).
quelle
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.
quelle