rm (Unix)
rm (Abkürzung für englisch remove ‚entfernen‘) ist in der Unix-Welt der übliche Befehl, Datei- und Verzeichniseinträge zu entfernen/löschen. Der Befehl ist im POSIX-Standard definiert. Es handelt sich dabei um ein eigenständiges Programm, nicht um einen Unix-Shell-Befehl.
Beim Einsatz von rm ist Vorsicht geboten, da standardmäßig keine Rückfrage zur Bestätigung des Befehls erfolgt; versehentlich können daher systemrelevante Dateien entfernt werden.[1]
Dateien bei Unix- und abgeleiteten Dateisystemen bestehen einerseits aus dem eigentlichen Datenbestand, dem Datenobjekt (der Dateiinhalt), dem ein eindeutiger Datenknoten, ein sogenannter Inode, zugeordnet ist, und andererseits aus mindestens einem Verweis (englisch link) auf jenen Inode, der als „voller“ Dateiname (d. h. inkl. Pfad) repräsentiert wird. Ein Inode kann dabei mehrere Dateinamen – also Dateiobjektverweise (englisch hard link) – haben.
Tatsächlich löscht der Befehl rm ./pfad/dateiname
nicht das Datenobjekt (die Dateiinhalte) selbst, sondern entfernt nur den Verweis (Hard-Link) auf dessen Inode aus dem Verzeichnisbaum des Dateisystems.
Wenn der letzte (Hard-)Link auf einen Inode entfernt wird (und kein Prozess mehr auf die Daten zugreift), gilt eine Datei als gelöscht. Tatsächlich werden nur die entsprechenden Datenblöcke zum Überschreiben freigegeben. Solange diese Datenblöcke nicht überschrieben wurden, kann eine gelöschte Datei daher wiederhergestellt werden.
Das Programm rm kann problemlos auch bereits aufgerufen werden, wenn noch ein Prozess auf die Daten zugreift. Jener kann die Daten ohne Störung bis zu seinem Beenden weiterhin lesen; erst danach werden die Blöcke freigegeben.
rm und unlink
Während der Befehl rm
durch POSIX standardisiert ist, ist unlink
durch die zweite Version der Single UNIX Specification (SUSv2) festgelegt und hat einen geringeren Funktionsumfang.
Die konkrete Funktionsweise, also ob etwa der Systemaufruf unlink verwendet wird, hängt von der eingesetzten Implementierung ab (bei der ursprünglichen Unix-Variante war dies bei unlink
der Fall). In der Regel werden heute beide Befehle, rm
und unlink
, vom Programm rm verarbeitet.
Sicheres Löschen
Das Betriebssystem gibt nach rm nur die Datenblöcke frei, die Daten bleiben aber unter Umständen noch einige Zeit physikalisch gespeichert. Sensible Daten (z. B. Passwörter oder Kreditkartennummern) sollten aber nicht mehr gelesen werden können. Zum sicheren Löschen muss man daher die Datei öffnen und alle Blöcke überschreiben. Auch manche Dateisysteme bieten die Option, frei gewordene Blöcke sofort zu überschreiben. Dies kostet jedoch Zeit und wird daher nur in Ausnahmefällen angewendet.
Die weit verbreitete Meinung, dass sich die Daten nach einmaligem Überschreiben noch mit großem Aufwand, etwa durch Messungen mit Elektronenmikroskopen, wiederherstellen lassen ist jedoch falsch; ein einmaliges Überschreiben ist vollkommen ausreichend; wichtiger ist es, alle Kopien, auch etwa bei der Datensicherung automatisch erstellte, zu beseitigen.[2]
Dateiwiederherstellung
Unix unterstützt normalerweise nicht die Wiederherstellung von Dateien. Frei gewordene Datenblöcke werden unter Umständen sofort von neuen Daten anderer Prozesse belegt.
Es existieren jedoch Dateisysteme, die eine Wiederherstellung unterstützen. Obwohl es bereits seit einigen Jahren entsprechende Entwicklungen gibt, hat sich das „undelete“ noch nicht durchgesetzt.
Syntax
rm [Optionen] Dateiname
Beispiel:
rm test.txt
Dieses Beispiel löscht die Datei „test.txt“ aus dem Verzeichnis, in dem man sich aktuell befindet.
Optionen:
Drei Optionen von rm
sind durch POSIX festgelegt:[3]
-f
- Force (Erzwingen): Keine Rückfrage bei fehlendem Schreibrecht und keine Fehlermeldungen bei nicht existierenden Dateinamen, somit auch keine Änderung des Exit-Status.[3]
-i
- Interaktiv: Fordert den Benutzer bei jeder einzelnen Datei auf, das Löschen zu bestätigen.[3]
-r
- Rekursives Löschen: löscht ein Verzeichnis selbst und alle Inhalte dessen einschließlich aller Unterverzeichnisse und deren Inhalte.[3]
Einige Implementierungen von rm
bieten darüber hinaus verschiedene zusätzliche Optionen.[4][5]
rm -rf /
rm -rf /
Das rm -rf /
-Kommando wird wegen seiner katastrophalen Wirkung bereits von der Netzkultur metaphorisch verwendet, ähnlich wie /dev/null. Der Aufruf von rm
mit den Parametern r
und f
auf das Wurzelverzeichnis (Root-Verzeichnis) bewirkt, wie man der Syntaxbeschreibung bereits entnehmen kann, das rekursive Löschen aller Dateien auf dem ausführenden Gerät (genauer: auf allen eingebundenen Datenträgern) ohne Rückfrage. Führt man dieses Kommando als Administrator (root) aus, führt das prinzipiell zur unwiderruflichen Löschung des gesamten Systems; als normaler Benutzer löscht dies in der Regel nur alle diejenigen Dateien, die dem ausführenden Benutzer gehören (siehe Unix-Dateirechte für Details zur Rechtehandhabung und dem Eigentum von Dateien).
Sun Microsystems führte einen „rm -rf /
“-Schutz mit Solaris 10 ein (erste Version von 2005). Beim Aufruf des besagten Unix-Kommandos bricht das Programm mit der Fehlermeldung ab, dass das Löschen von /
nicht erlaubt sei.[6] Kurz darauf wurde die gleiche Funktion in FreeBSD eingeführt.
Wie durch die POSIX-Spezifikation[7] gefordert, bricht auch die GNU-Version von rm
mit einer Fehlermeldung ab, solange nicht die Option --no-preserve-root
angegeben wird. Diese GNU-spezifische Option und ihr Pendant --preserve-root
wurden schon 2003 mit der Veröffentlichung der Version 5.1.0[8] der GNU Core Utilities eingeführt, und mit Version 6.2[9] (2006 veröffentlicht) wurde letztere Option Standard.
Einzelnachweise
- Nikolai Bezroukov: Creative uses of rm. Abgerufen am 14. Februar 2012.
- Sicheres Löschen: Einmal überschreiben genügt. heise online, 16. Januar 2009
- rm. In: IEEE Std 1003.1-2008. Open Group. Abgerufen am 14. Februar 2012.
- rm. In: FreeBSD Man Pages. FreeBSD Foundation. Abgerufen am 14. Februar 2012.
- rm invocation. In: GNU Coreutils. Free Software Foundation. Abgerufen am 14. Februar 2012.
- Meddling in the Affairs of Wizards (Memento des Originals vom 16. März 2011 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis. (englisch)
- The Open Group Base Specifications Issue 7 - rm (englisch)
- Git commit Support new options: --preserve-root and --no-preserve-root (englisch)
- Git commit ...--preserve-root is now the default (englisch)