Auch wenn oft schlicht von “einstampfen”, “in die Tonne treten” oder “kopieren nach /dev/null” gesprochen wird, steckt hinter dem Löschen von Daten durchaus mehr als nur ein Mausklick.
Dr. Linux
Komplizierte Organismen, wie Linux-Systeme es nun einmal sind, haben so ihre ganz eigenen Wehwehchen. Dr. Linux beobachtet die Patienten in den Linux-Newsgruppen, stellt an dieser Stelle Rezepte für aktuelle Probleme aus und alternative Heilmethoden vor.
Ich möchte, dass der Befehl rm vor dem Löschen von Dateien immer eine Sicherheitsabfrage der Art “Datei wirklich löschen?” stellt. Wie kann ich das einstellen?
Dr. Linux: Um den Befehl rm dazu zu zwingen, setzen Sie ihn mit der Option -i ab:
perle@maxi:~> rm -i test.txt rm: »test.txt« entfernen?
Vor dem Löschen müssen Sie die Nachfrage je nach System-Einstellungen mit y (für “yes”) oder j ( für “ja”) bestätigen. Antworten Sie hingegen mit n (für “no” oder “nein”), bleibt Ihnen die Datei erhalten.
Ein bestimmter Befehl, der ausschließlich mit einer festgelegten Option ausgeführt werden soll, ist ein klassischer Fall für das Anlegen eines Aliases. Damit machen Sie ein Kommando mit festen, oft benötigten Flags oder lange, einzeilige Befehlseingaben unter einem eigenen Namen verfügbar. Wenn Sie diesen statt des eigentlichen Kommandos aufrufen, sparen Sie vielleicht nicht im Fall von rm -i, aber sonst oft eine Menge Tipparbeit.
Über die in Ihrem System vordefinierten Alias-Befehle informieren Sie sich, indem Sie den Befehl alias auf einer Kommandozeile absetzen. Unter Umständen werden Sie überrascht sein, wie viele Aliase es gibt (das Beispiel stammt von einem Rechner mit SuSE 7.3):
perle@maxi:~> alias […] alias l='ls -alF' alias la='ls -la' alias ll='ls -l' alias ls='ls $LS_OPTIONS' alias ls-l='ls -l' alias md='mkdir -p' alias mem='echo '\''Error: Try the command: free'\''' alias move='echo '\''Error: Try the command: mv -iv'\''' alias o='less' alias rd='rmdir' alias rehash='hash -r' […]
Dass Sie mit dieser Einstellung ll statt ls -l sagen können, erfährt die Shell beim Einloggen aus der Datei /etc/profile. Diese definiert die für alle Benutzer gültigen Einstellungen. Sie sollten sie als Systemverwalter nur editieren, wenn Sie genau im Bilde sind, was Sie dort gerade tun. Eigene (eventuell die Voreinstellungen überschreibende) Alias-Definitionen kann jeder User in den Start-Dateien der Shell im eigenen Home-Verzeichnis festlegen.
So, wie alias die Alias-Kommandos auflistet, können sie auch gesetzt werden: Zunächst kommt der Befehl alias, gefolgt vom Kürzel Ihrer Wahl; ein = verbindet schließlich den in Hochkommata gefassten Befehl, für den das Kurzkommando gelten soll:
perle@maxi:~> alias rm='rm -i'
Dieser Alias-Befehl bleibt in der aktuellen Shell bis zum Ende Ihrer Sitzung erhalten, wird aber nicht gespeichert. Wenn Sie nun rm datei aufrufen, fragt Sie das Kommando höflich, ob es Ihnen mit dieser Löschaktion Ernst sei.
Erscheint Ihnen die hartnäckige Nachfragerei einmal unangemessen, überstimmt ein rm -f (für englisch: “force”, “erzwingen”) temporär die im Alias eingebettete Option -i. Die als Argument angegebene Datei wird damit trotz anders definierter Alias-Vorgabe rücksichtslos ohne Rückfragen und Fehlermeldungen gelöscht.
Kommen Sie mit dem “neuen” rm gar nicht klar, werden Sie den unerwünschten Alias in der aktuellen Shell mit
perle@maxi:~> unalias rm
wieder los. Das ist im gezeigten Fall auch sehr sinnvoll: Eine Umdefinition eines vorhandenen Befehls (wie hier von rm) birgt nämlich die große Gefahr, sich an den neuen Befehl zu gewöhnen. Bei einem Wechsel auf eine andere Distribution oder ein fremdes System werden Sie ihn meist vermissen – mit fatalen Folgen: Da rm dort weiterhin das System-rm ist, würde die gewählte Datei ohne die angewöhnte Rückfrage gelöscht.
Doch was müssen Sie tun, um die bessere Alternative alias del='rm -i' dauerhaft festzuschreiben? Wenn Sie die Bash als Login-Shell benutzen, liest diese nach der systemweit gültigen /etc/profile (bei manchen Distributionen zusätzlich /etc/profile.local) die persönlichen Initialisierungsdateien im Home-Verzeichnis ein. Das sind die richtigen Stellen, um Alias-Befehle zu speichern. Mindestens eine dieser Dateien finden Sie mit Sicherheit auch in Ihrem Home-Verzeichnis: .profile, oder – bash-spezifisch – .bash_profile sowie .bashrc.
Diese persönlichen Initialisierungsdateien sind Skripte, die sich mit einem Editor bearbeiten lassen. Hierin können Sie systemweite Einstellungen überstimmen und zusätzliche persönliche Einstellungen vornehmen. Elegant und übersichtlich, besonders wenn Sie mehrere Alias-Befehle anlegen möchten, ist es, eine spezielle .alias-Datei anzulegen und deren Einlesen beim Login mit dem Eintrag
test -e ~/.alias && . ~/.alias
in der gewünschten Startdatei zu veranlassen. Dieser Befehl prüft (test), ob die Datei .alias im Home-Verzeichnis (~) existiert. Wenn ja (&&) wird diese mit dem Punkt-Operator in der aktuellen Shell ausgeführt.
Wegputzen
Ich habe hier ein Programm, das in meinem Home-Verzeichnis eine .log-Datei anlegt, die langsam vor sich hin wächst. Diese wird nicht regelmäßig durch Systemprogramme gewartet und damit auch nie gekürzt. Sie einfach mit rm zu löschen traue ich mich nicht, weil ich nicht weiß, ob dann nicht das Programm anfängt zu spinnen. Gibt es vielleicht eine sichere Methode, ihren Inhalt zu entsorgen?
Dr. Linux: Schnell und einfach lässt sich der Inhalt einer Datei beispiel.log mit dem Befehl
perle@maxi:~> cat /dev/null > beispiel.log
wegwerfen, ohne dass die Datei selbst aufhört zu existieren. Das Gerät /dev/null wird häufig als “schwarzes Loch” oder “Mülleimer” des Systems bezeichnet. Alle Ausgaben, die dort hinein gelenkt werden, sind verloren, verschwinden quasi im Nichts. Gleiches gilt für den Inhalt von Dateien, wenn sie mit dem Inhalt von /dev/null überschrieben werden. Für das Umlenken der Ausgabe eines Programms in eine Datei benutzt man das Zeichen >. Der Befehl cat tut nichts anderes, als den Inhalt von Dateien auf der Standardausgabe auszugeben, mithin sie anzuzeigen. In Worte gefasst bedeutet die obige Befehlszeile also: “Zeige den Inhalt von /dev/null an und lenke diese Ausgabe auf die Datei beispiel.log.”
Das folgende Vorher-Nachher-Szenario zeigt recht deutlich, was passiert:
perle@maxi:~/tmp> ls -l […] -rw-r--r-- 1 perle users 2097 Mai 7 13:16 beispiel.log […] perle@maxi:~/tmp> cat /dev/null > beispiel.log perle@maxi:~/tmp> ls -l […] -rw-r--r-- 1 perle users 0 Mai 7 13:18 beispiel.log […]
Da, wo vorher eine Datei von 2097 Bytes Größe zu finden war, sieht man nachher nur noch ein leeres File.
Wenn Sie mit der bash arbeiten, geht diese Aktion übrigens noch schneller mit dem Befehl
perle@maxi:~> > beispiel.log
Möchten Sie vor dem Löschen eine Archivkopie der Datei ziehen, achten Sie darauf, dass Sie die Originaldatei dabei nicht verändern: Statt die Datei mit mv umzubenennen legen Sie besser mit cp eine Kopie an; statt sie mit gzip beispiel.log destruktiv zu komprimieren, verwenden Sie besser das Kommando gzip -c beispiel.log > beispiel.log.gz, bei dem das Original erhalten bleibt. Greift das schreibende Programm während der Zeit auf die Log-Datei zu, während der sie durch mv, rm oder gzip gelöscht wird, kann dies nicht nur zu Störungen führen, sondern u. U. sogar verhindern, dass es weiterhin in die .log-Datei schreibt.
Räumungsklage
Ich wollte mein System von überflüssigen Dateien befreien, die sich im temporären Verzeichnis angesammelt haben. Nun habe ich festgestellt, dass ich in /tmp nicht alle Dateien löschen kann. Darf das etwa nur root?
Dr. Linux: Betrachten Sie /tmp einmal etwas genauer, insbesondere die Zugriffsrechte auf dieses Verzeichnis. Sie werden dabei in aller Regel feststellen, dass sich neben dem Schreibrecht für alle anstelle der Kennzeichnung x, die bei Verzeichnissen besagt, wer in sie wechseln darf, im dritten Rechte-Tripel ein t befindet:
perle@maxi:~> ls -ald /tmp drwxrwxrwt 9 root root 4096 Mai 7 15:15 /tmp
Dieses kleine t wird Sticky-Bit (“sticky” = “klebrig”) genannt und bedeutet für ein Verzeichnis, dass man zum Löschen einer darin befindlichen Datei der Besitzer derselben (oder root) sein muss.
So wird verhindert, dass temporäre Dateien, zum Beispiel von Druckaufträgen oder anderen aktuellen Prozessen, durch nichtberechtigte Benutzer gelöscht werden.
Ein Sticky-Bit für Programme, in einer Auflistung durch ein T gekennzeichnet, wird unter Linux schlicht ignoriert.
Aus neu mach alt
Wie kann ich den Bootloader Lilo aus dem Bootsektor (MBR) der Festplatte entfernen?
Dr. Linux: Wenn Lilo bei der Erstinstallation einen Boot-Sektor überschreibt, wird eine Sicherungskopie desselben erstellt und als /boot/boot.yyzz gesichert. Statt yyzz stehen die Major- und Minor-Nummern des Gerätes, dessen Boot-Sektor-Inhalt ersetzt wird, in hexadezimaler Schreibweise.
Nachvollziehen, welcher Boot-Sektor ursprünglich zur Sicherungskopie herangezogen wurde, können Sie durch einen Vergleich mit den Gerätenummern im Verzeichnis /dev. In der Auflistung (Listing 1) finden Sie statt der “üblichen” Größenangabe einer Datei die Major- und Minor-Nummern der Geräte.
Listing 1
Major- und Minor-Nummern der Gerätedateien
perle@maxi:~> ls -al /dev | less […] brw-rw—- 1 root disk 2, 0 Nov 26 18:56 fd0 […] brw-rw—- 1 root disk 3, 0 Sep 24 2001 hda […] brw-rw—- 1 root disk 3, 6 Sep 24 2001 hda6 […] brw-rw—- 1 root disk 8, 0 Sep 24 2001 sda […]
Hat Lilo beispielsweise den ersten Sektor des ersten IDE-Master-Geräts /dev/hda (Major 3, Minor 0) überschrieben, lautet der Name der Sicherungskopie /boot/boot.0300. Wurde der Bootloader auf dem ersten SCSI-Gerät /dev/sda installiert, wird /boot/boot.0800 angelegt. Eine Lilo-Installation auf /dev/hda6 (Major 3, Minor 6) erstellt die Kopie /boot/boot.0360.
Die Manpage zum lilo-Kommando, das den Bootloader schreibt, verrät zwei Befehle zum Zurückschreiben des gesicherten Bootsektors auf das entsprechende Gerät. Die Ausführung eines solch drastischen Befehls ist natürlich root vorbehalten. Mit
/sbin/lilo -u Gerätename
wird vor dem Rückschreiben zur Sicherheit die Zeitmarke der Sicherungsdatei überprüft. Will root auf diesen Check verzichten, verwendet der Superuser den Befehl
/sbin/lilo -U Gerätename
Der alte MBR kann auch mit dem Befehl dd auf seinen alten Platz zurückgeschrieben werden:
dd if=/boot/boot.yyzz of=/dev/??? bs=512 count=1
Anstelle der drei Fragezeichen muss der richtige Gerätename eingetragen werden, für den ersten IDE-Master /dev/hda, für die erste SCSI-Platte /dev/sda usw. Kürzer, aber genauso wirkungsvoll ist der Befehl
cat /boot/boot.yyzz > /dev/???
Auch von DOS, Windows oder OS/2 aus hat man die Möglichkeit, den MBR von Einträgen zu säubern: fdisk /mbr (MS-DOS oder Windows-98-Startdiskette) oder fdisk /newmbr (OS/2) lautet der entsprechende Befehl, der auf der dortigen Kommandozeile einzugeben ist. In der Windows-XP-Hilfe finden Sie eine genaue Beschreibung, wie fixmbr zu handhaben ist. Bei Windows 2000 arbeiten Sie sich nach dem Booten der Installations-CD über Installation reparieren zu den Befehlen fixmbr und fixboot vor.
Glossar
-
Flags
-
Die mit einem einfachen Minus eingeleiteten Optionen zu einem Unix-Befehl werden auch als “Flags” bezeichnet.
-
Shell
-
Das “Mittlerprogramm”, das Ihre Kommandos entgegen nimmt, bearbeitet und schließlich an den Kernel zur Ausführung weiterleitet. Unter Unix-Betriebssystemen haben Sie die Wahl zwischen diversen Shells unterschiedlicher Funktionalität und Bedienphilosophie. Linux-Systeme setzen als Standard-Shell in der Regel die Bash (“born again shell”) ein.
-
Login-Shell
-
Die Shell, die beim Einloggen (auf der Textkonsole) gestartet wird. Von ihren anderen interaktiven Kolleginnen unterscheidet sich eine Bash-Login-Shell darin, dass sie die Dateien /etc/profile, ~/.bash_profile, ~/.bash_login und ~/.profile (in dieser Reihenfolge) einliest, während jene lediglich die Datei ~/.bashrc auswerten. Prinzipiell lässt sich aber jede Bash (auch die aus dem K-Menü aufgerufene) als Login-Shell starten. Zu diesem Zweck dient die Option -login.
-
temporären Verzeichnis
-
Im Verzeichnisbaum als /tmp eingehängt, ist dies der Ort, wo Daten von Programmen und Anwendern abgelegt werden, die zur Ausführung eines Programms oder anderen Auftrags zeitweise benötigt werden. Danach können sie gelöscht werden.
-
Zugriffsrechte
-
Der Befehl ls -l gibt an der zweiten bis zehnten Position von links an, was der Besitzer der Datei (erstes Tripel), die Mitglieder der Gruppe, der die Datei zugewiesen ist (zweites Tripel), und alle übrigen Benutzer des Systems (Position acht bis zehn) mit der Datei tun dürfen: Ein r vergibt dabei das Leserecht, w das Schreibrecht und x das Ausführbarkeitsrecht (bei Verzeichnissen Hineinwechselrecht) für die jeweilige User-Kategorie.
-
ls -d
-
Die Option d (“directory”) beschränkt die Auflistung auf das aktuelle bzw. das Argumentverzeichnis selbst und verhindert Angaben zu darin enthaltenen Dateien.
-
Bootsektor
-
Bei Datenträgern wie Disketten oder Partitionen einer Festplatte bezeichnet man deren ersten Sektor als Bootsektor. Bei Festplatten benutzt man für den ersten Sektor den Begriff “Master Boot Record” (kurz MBR).
-
Major- und Minor-Nummern
-
Greift ein Programm auf eine Gerätedatei zu, wird dem Kernel diese Anforderung in Form der beiden Gerätenummern übergeben. Der Major-Wert bezieht sich im Allgemeinen auf einen bestimmten Treiber des Kernels, der Minor-Wert auf das Gerät, auf das der Treiber nun zugreifen soll. Deshalb haben zum Beispiel alle Gerätedateien für die serielle Schnittstelle den gleichen Major-Wert, aber unterschiedliche Minor-Nummern. Kurz gefasst benutzt der Kernel die Major-Nummer, um die Anforderung dem zuständigen Treiber zu übergeben, dieser wiederum braucht die Minor-Nummer, um festzustellen, welches Gerät er benutzen soll. Es gibt ein paar Ausnahmen, aber über die stolpert man als normalsterblicher Linux-Nutzer im Allgemeinen nicht.
Infos
[1] Das Lilo-Mini-Howto (deutsche Fassung): http://www.tu-harburg.de/dlhp/HOWTO/mini/DE-LILO-HOWTO.html





