Unix ist ein echtes IT-Urgestein – und dennoch topmodern. Was in den 1970er Jahren als Multiuser- und Multitasking-System begann, erfüllt auch heute höchste Anforderungen an Cloud, KI und IoT. Dank kontinuierlicher Weiterentwicklung bleiben die bewährten Konzepte aktuell und leistungsfähig. In diesem Beitrag erhalten Sie einen Einblick in die Grundlagen, die Arbeit mit der Kommandozeile sowie essenzielle Werkzeuge für Linux, macOS und BSD.
Offenheit, transparente Schnittstellen und gut dokumentierter Quellcode machen Unix auch nach über 50 Jahren zu einer verlässlichen Basis für innovative IT-Lösungen. Unixoide Systeme folgen alle dem gleichen Prinzip: Um auf Linux-, macOS- oder BSD-Systemen effizient zu arbeiten, werden die Shell und Kommandos benutzt.
Unixioide Systeme – speziell Linux, BSD, OpenSolaris – werden von einer eingeschworenen Community weiterentwickelt, welche eine Kultur pflegt. Einersetit geht es dabei darum, wie die Software entwickelt und betrieben wird und andererseits wie miteinander kommuniziert und zusammengearbeitet wird. Proprietäres Gärtlidenken ist Unix-Fachpersonen fremd.
Unix wurde als reines Multiuser/Multitasking-System entwickelt. Somit ist Security, gegenseitiger Ausschluss, von allem Anfang an integriert. Benutzer A kann nicht per se auf die Dateien von Benutzer B zugreifen. Prozess A kann nicht auf die Ressourcen von Prozess B oder des Systems zugreifen. Dieses Prinzip wurde seit über 50 Jahren stetig weiterentwickelt.
Die meisten unixoiden Systeme sind komplett im Source-Code verfügbar. Alles kann einfach nachvollzogen werden, um die Fehleranfälligkeit minimal zu halten, sogar binäre Programme können einfach debuggt werden. Log- oder Konfigurationsdateien sind Textdateien, welche mit gängigen Werkzeugen durchsucht und bearbeitet werden können. Netzwerkverbindungen lassen sich mit Werkzeugen wie tcpdump oder wireshark analysieren.
Beim Start eines Unix-Systems lädt ein Bootloader den Kernel, also den Kern des Betriebssystems. Der Kernel erkennt die vorhandene Hardware (z. B. Prozessor, Speicher, Festplatten) und lädt die nötigen Module, damit diese Komponenten verwendet werden können.
Der Kern arbeitet in zwei Betriebsmodi:
Dieses Prinzip gewährleistet die Stabilität und Sicherheit des Systems.
Während der GNU/Linux-Kern fast alles über Module einbindet (Kernelspace), gehen macOS und BSD einen anderen Weg mit einem schlanken Kernel mit weniger Modulen. Dafür werden verschiedene Komponenten im Userspace behandelt.
Am Ende startet der Kern einen Service der das System weiter «hochfährt» oder initialisiert
Da der Zugang zu den Komponenten nun verfügbar ist, werden Dienste gestartet um:
Zum Einsatz kommen hier verschiedene INIT-Systeme:
Als Workstation kann die Benutzerschnittstelle graphisch sein, bei Server, IoT, embedded Systemen, Containern oder VMs ist diese jedoch textbasiert. Ein unixoides System kann immer mindestens auf der Konsole erreicht werden. Falls gewünscht, können die Systeme diese Benutzerschnittstelle auch über eine Netzwerkverbindung oder andere Schnittstellen und immer mit Authentifizierung anbieten.
Bei textbasierten Zugängen wird nach erfolgreicher Authentifizierung eine Shell gestartet. Die Shell ist ein «hochpotenter» Kommandointerpreter, dem eine Fülle von «hochpotenten» Kommandos zur Verfügung steht.
In Kombination mit der Shell können Kommandos eigentlich so ziemlich alles was es braucht, um unixoide Systeme zu:
rat@khamsin <UX-Konzepte> $ ls -l /tmp
Dieses Prinzip funktioniert für alle Kommandos auf allen unixoiden Systemen.
Das Prinzip der Unix-Kommandos
Kommandos sind kleine Programme (meist in C programmiert), die genau «ein Ding tun». Sie schreiben Output auf STDOUT (default Terminal), Fehlermeldungen auf STDERR (default ebenfalls Terminal) und lesen von STDINPUT (default Keyboard). Halten sich Kommandos an diese Regeln, können sie in der Shell beliebig kombiniert werden.
Verbinden wir in der Shell Kommandos mittels der Pipe (Zeichen |), verbindet die Shell den STDOUT des linken Kommandos mit dem STDIN des rechten:
rat@khamsin <UX-Konzepte> $ ls -a /tmp | wc -l
Der Output von «ls -a /tmp» wird als Input für «wc -l» verwendet. «wc -l» zählt in dieser Anwendung einfach wieviele Zeilen «ls -a tmp» produziert hat. Die resultierende Zahl bedeutet die Anzahl der Dateien und Verzeichnisse in «/tmp».
Neben Kommandos steht dem Anwender eine riesige Auswahl an sehr mächtigen Werkzeugen zur Verfügung. Diese Werkzeuge arbeiten mit den gleichen Standard- Kanälen (STDIN, STDOUT und STDERR) wie die Kommandos.
Die Wurzeln vieler dieser Werkzeuge liegen in den 1970er Jahren auf den ersten UNIX-Versionen.
Mit Werkzeugen können Streams und Datenströme bearbeitet werden. Ein Stream kann eine Datei sein oder der Output eines Kommandos.
Beispiel:
rat@khamsin <UX-Konzepte> $ grep '^rat:' /etc/passwd
rat:x:1000:1000:Renato Testa:/home/rat:/bin/bash
Im obigen Beispiel durchsucht «grep» die Datei «/etc/passwd» nach Zeilen, welche mit «rat:» beginnen.
rat@khamsin <UX-Konzepte> $ ps aux | grep 'bash$'
rat 261791 0.0 0.0 224376 5600 pts/2 Ss+ Jan07 0:00 bash
rat 262430 0.0 0.0 224376 5280 pts/4 Ss Jan07 0:00 bash
rat 1721126 0.0 0.0 224228 5440 pts/1 Ss 10:47 0:00 -bash
In diesem Beispiel durchsucht «grep» den von «ps aux» erzeugten Stream nach Zeilen, die mit «bash» enden.
Mit «grep» haben wir aber nur eines von vielen Werkzeugen erwähnt, aber immerhin eines, welches wir sehr häufig anwenden.
Mittels Shell-Scripten lassen sich mit wenig Aufwand eigene Werkzeuge erstellen, um unsere spezifischen oder immer wiederkehrenden Jobs zuverlässig und effizient zu erledigen.
Ein ebenfalls wichtiges Prinzip ist Spass bei der Arbeit. Wenn wir den Anspruch haben, dass uns die Arbeit auch Spass machen soll, brauchen wir die passenden Werkzeuge dazu. Mit einem unixoiden System haben wir eine komplett eingerichtete Werkstatt und können unserer Kreativität freien Lauf lassen.
Kommentar