Dies ist der erste Beitrag der OS-Internals Reihe. Ich versuche unter diesem Begriff sehr technische Aspekte von Linux zu beleuchten und verständlich zu erklären.

Die meisten, die Linux benutzen, sollten das Gerät /dev/null kennen, welches auch Null-Gerät genannt wird. Hierbei handelt es sich um ein spezielles Gerät, das alle Eingehenden Daten sofort löscht und gar nicht erst persistiert. Es wird daher auch oft scherzhaft als schwarzes Loch oder Nirvana bezeichnet.

Technisch ist /dev/null – genau wie alles andere bei Linux – eine Datei, jedoch eine spezielle, die output streams bereit stellt und input streams entgegen nehmen kann (doch zu Dateien in Linux in einem späteren Teil mehr). Wenn man schauen möchte was es ist, kann man auch einfach folgendes machen und sich die Ausgabe anschauen:

Eigenschaften $ ls -alh /dev/null

crw-rw-rw- 1 root root 1, 3 Nov 10 19:06 /dev/null



Es ist also eine spezielle Datei (das c bedeutet char device), jeder hat Zugriff darauf, es gehört root und es werden weitere, für uns momentan nicht wichtige, Informationen angezeigt.

Nutzen von /dev/null

Man kann es einsetzen um z.B. einen gewissen output-Stream (z.B. stderr ) aus der Ausgabe von einem Programm zu entfernen. Hierfür benutzt man einfach den Umleitungs-Operator (redirection operator, also das > Zeichen) kombiniert mit der file descriptor number für stderr (sprich 2):

Ausgaben weg schmeißen $ find /etc/ -iname apt 2> /dev/null



Wir suchen hier nach allen Dateien und Ordnern unter /etc/ in deren Namen der string apt vorkommt. Alle Ausgaben auf den stream stderr werden ins Nirvana geschickt.

Gefahren von /dev/null

Es ist sehr praktisch einfach Ausgaben ins Jenseits zu schicken, aber es gibt eine Wichtigkeit zu beachten: /dev/null ist eine Datei, es ist also möglich dort etwas hinein zu schreiben aber nicht hin zu verschieben. Man sagt zwar immer „Dann tust du das in dev-null rein …“ aber solche Sätze sind gefährlich, wie das folgende Beispiel zeigt:

Als erstes leiten wir normale Ausgaben um:



Schritt 1: /dev/null ausprobieren $ echo test123 > /dev/null

$ cat /dev/null



Der cat Befehl gibt nichts aus, der string test123 ist also verschwunden. Super!

Folgende Befehle können das System tatsächlich beschädigen.

Man sollte sie also nicht leichtfertig ausprobieren!

Jetzt kommt das, was viele Leute unwissentlich falsch machen, obwohl es sehr gefährlich sein kann:



Schritt 2: /dev/null kaputt machen $ echo test123 > test.txt

$ sudo mv test.txt /dev/null

$ ll /dev/null

-rw-r--r-- 1 hauke hauke 8 Nov 10 21:05 /dev/null

$ cat /dev/null

test123



Wir erstellen also eine Datei mit test123 als Inhalt und verschieben sie nach /dev/null . Aber was ist denn da passiert!? Auf ein mal enthält unser schwarzes Loch ja einen Inhalt und ist eine ganz normale Datei!

Das wirklich gefährliche ist dabei, dass – wie man auch hier sehen kann – die Rechte nicht die gleichen sind wie vorher. In diesem Beispiel kann nur der Besitzer in die Datei schreiben. Viele Prozesse benutzen aber /dev/null , daher kann es hier zu ernsten Problemen bis hin zum Absturz von Anwendungen kommen.

Auch benutzen einige Programme den Inhalt von /dev/null (also nämlich nichts), was jetzt auch gehörig schief gehen kann.

Wir sehen also, dass man Dateien nicht nach /dev/null verschieben kann um diese zu löschen, denn das geht immer noch am sichersten mi rm my.file . Jetzt haben wir unser schwarzes Loch ganz einfach mir unserer Textdatei überschrieben. Oops.

Man kann aber den Fehler mit folgenden Befehlen beheben um den ursprünglichen Zustand wiederherzustellen:



/dev/null reparieren $ sudo rm /dev/null

$ sudo mknod /dev/null c 1 3

$ sudo chmod 666 /dev/null



WTF: /dev/null unter Windows o.O

Ja, auch unter Windows (schon seit DOS Zeiten) gibt es ebenfalls ein /dev/null unter dem Namen NUL (in der PowerShell ist es $null ). Genau wie bei Linux kann man dort Ausgaben, löschen: echo 123 > NUL. Bei Windows kann man gar keine Dateien oder Verzeichnisse nach NUL schieben, da der move Befehl Argumente ungleich null erwartet und NUL eben als null gilt (einfach mal in der PowerShell versuchen move datei.txt $null auszuführen).

Trivia zu /dev/null