UNIX - Aufbau und Geschichte

Entwicklung von UNIX

Unix ist eines der ältesten Betriebssystem. Seine Wurzeln gehen auf das Jahr 1969 zurück, als Ken Thompson in den Bell Laboratories damit begonnen hat, eine Alternative zu den in der damaligen Zeit üblichen Batch-Systemen zu entwickeln.
Zunächst entwickelte er UNIX speziell für die PDP-7 der Firma DEC (Digital Equipment Corporation) in der Maschinensprache dieser ganz besonderen Plattform.
Später entwickelte er dann die Programmiersprache B, die einen Ersatz für die Maschinensprache darstellte und einer wesentlich besseren Protierbarkeit des Betriebssystems diente. Dennis Ritche nahm die Idee auf und machte aus der Sprache B die Programmiersprache C die immer noch in Verwendung ist. 1971 wurde UNIX vollständig in C umgeschrieben und so auf die PDP-11 (einem Nachfolgemodell der PDP-7) portiert.
Die Mischung aus dem Betriebssystem UNIX und der Programmiersprache C erzeugte unter denen die sie verwenden durften (im Gegensatz zu den damals sonst vorherrschenden Mainframes bzw. den Batchsystemen) eine gewisse Euphorie: Die Usergemeinde entwickelte kleine Tools, die die Arbeit erleichterten und stellten sie anderen Benutzern zur Verfügung. Zu diesem Zeitpunkt war UNIX noch kein wirklich kommerzielles Projekt. Man kann darin den Beginn der Open Source Bewegung - wie wir sie heute kennen - sehen.
Über die Jahre wurde UNIX immer weiter entwickelt und kommerzialisiert. AT&T Bell Laboratories begannen, ihr UNIX zu verkaufen; die Universität von Berkley pflegte getrennt davon ihr eigenes UNIX-Derivat BSD. Andere Hersteller traten auf den Plan und entwickelten ihre eigenen UNIXe. Später wurden Standardisierungsgremien gegründet, um eine zu weite Entfremdung der UNIXe voneinander zu verhindern. So wurde der POSIX-Standard zur "Common Base" der UNIXe: eine allgemeine Beschreibung dessen, was ein UNIX-artiges System mitbringen muss, damit es sich so nennen darf. Dieser Standardisierungsprozess (der bis heute noch abgeschlossen ist) war es letztlich, der UNIX vor dem vorprogrammierten Ende bewahrt hat.
Aktuelle Ereignisse zeigen, dass UNIX kein antiquiertes System ist, sondern ganz im Gegenteil, ein modernes Betriebssystem ist, das portabel ist, dezentral entwickelt wird und offensichtlich sehr krisensicher ist. Noch bevor Apple seine Strategie ein UNIX-basiertes Betriebsystem zu auf den Markt zu bringen veröffentlichte, konnte ein anderes UNIX-Derivat von sich reden machen: Linux. Mit Linux ist Leben in die GNU/Open Source Gemeinde gekommen; ein Umstand, von dem nicht nur Systemadministratoren profitieren, sondern eigentlich jeder, der den Tools und Anwendungen der Community eine Chance gibt. Dazu gehört auch Apple selbst. (siehe JavaScript, Webmin, Apache, etc.)

Aufbau des Betriebssystems

UNIX ist ein Multiuser und Multitasking Betriebssystem. Das bedeutet, daß sowohl mehrere Benutzer gleichzeitig an einem Computer arbeiten können, als auch, daß jeder Benutzer mehrer Tasks oder Programme gleichzeitig starten kann.
Die Aufgabe des Betriebssystems ist es nun, die vorhandernen Hardwareressourcen möglichst gerecht auf alle laufenden Prozesse (jedes UNIX-Programm ist, sobald es gestartet wurde zumindest ein Prozess, der aus mehreren Threads bestehen kann.) aufzuteilen. Diese an und für sich trivial klingende Aufgabe unterteilt sich in mehrere Bereiche: Bei näherer Betrachtung der oben genannten Aufgaben fällt auf, daß hier noch mit keinem Wort die Interaktion zwischen Benutzer und System behandelt wurde. In klassischen UNIX-Systemen war die einzige Möglichkeit eines Benutzers mit seinem System zu arbeiten die, eine sogenannte Shell (oder Terminal) zu verwenden; im wesentlichen ein schwarzer Textbildschirm, der die Eingabe von Befehlen ermöglichte und eventuelle Resultate oder Meldungen ausgab. Aus historischer Sicht (vgl. Lochkarten-Batchsysteme) revolutionär, aus heutiger Sicht kryptisch und mühevoll - nein, nicht ganz! Doch dazu später!
UNIX selbst ist lediglich der Betriebssystemkern, das was ein Betriebssystem ausmacht; graphische Oberflächen zählen da auch heute noch nicht dazu. Mittlerweile gibt es auch für UNIX graphische Oberflächen - eigentlich ja schon seit den frühen 1980er Jahren, als am MIT (Massachusets Institute of Technologies) XWindows standardisiert wurde. Die jüngste graphische Oberfläche für UNIX-Systeme stammt von Apple ;-). Jedenfalls zählen graphische Oberflächen nicht direkt zum Betriebssystem.
Für den nun folgenden Teil werden standard UNIX Befehle verwendet, die in der Command Line Reference dokumentiert und erklärt sind.

Benutzer und Gruppen

In UNIX-basierten Systemen ist Benutzerabhängige Sicherheit Standard. Konkret bedeutet das, dass Zugriffsberechtigungen anhand von Benutzernamen beziehungsweise von Gruppenzugehörigkeiten vergeben werden.
Mit dem Befehl "ls -l" kann man sich weitere Informationen zu den Dateien in einem Verzeichnis anzeigen lassen. Zu diesen gehören unter anderem auch Besitzverhältnisse und Gruppenzugehörigkeiten. Am besten läßt sich das anhand eines Beispiels erklären:
[equinox:~] adi% ls -l
drwxr-xr-x    9 adi      users        4096 2002-10-15 16:25 Documents
drwx------   10 adi      users        4096 2002-10-24 18:52 Mail
-rw-r--r--    1 adi      users      135570 2002-10-08 20:01 Command_Reference_v0.2.pdf
[...]
Auf den ersten Blick sieht man ganz rechts den Dateinamen stehen. Direkt davor - Datum und Uhrzeit; diese Angabe bezieht sich auf die letzte Änderung der Datei oder des Verzeichnisses. Weiter links findet sich eine Zahl, die die Grösse der Datei in Byte angibt. Dann folgen auch schon Gruppe und Besitzer - in diesem Fall die Gruppe "users" und der Besitzer "adi", der Mitglied der Gruppe "users" ist. Der Buchstabensalat am linken Rand repräsentiert die Zugriffsrechte auf die Datei oder das Verzeichnis. Die Zahl zwischen den Permissions und dem Owner (Besitzer) ist der sogenannte "Link Count" - 1 für Dateien und bei Verzeichnissen abhängig von der Zahl der Unterverzeichnisse.
Da die meisten Felder der Ausgabe von "ls -l" selbsterklärend sind, wollen wir uns speziell auf den Teil mit den Zugriffsberechtigungen oder engl. Permissions konzentrieren: Der 10-stellige Code (z.B.: drwxr-xr-x) laäßt sich in 4 Teile teilen: Die Küzel anders aufgeschlüsselt:
rRead - die Berechtigung zu lesen
wWrite - Berechtigung zu schreiben bzw. zu ver&aeuml;ndern
xeXecute - Ausfüren der Datei oder bei einem Verzeichnis das wechseln in selbiges
dDirectory - Typ der Datei: Verzeichnis
lLink - Typ der Datei: Symlink auf eine andere Datei
bBlock-Device - Typ der Datei: Block-Gerät
cCharacter-Device - Typ der Datei: Zeichen(Buchstaben)-Gerät
-nicht gesetzt (bei Dateityp: normale Datei)
Mit Hilfe dieser 10-stelligen Codes kann man sofort erkennen, un welche Art von Datei es sich handelt und wer wie darauf zugreifen darf. Mit einem Tool namens "chmod" kann man die Berechtigungen verändern; mit "chown" kann man den Eigentüer wechseln und mit "chgrp" auch noch die Gruppe, der die Datei gehört. Selbstverständlich gibt es unter Mac OS X auch die Möglichkeit, von der graphischen Benutzeroberfläche aus diese Änderungen durchzuführen (Dateieigenschaften).

Dateien und Gerätetreiber

Jedes Gerät unter UNIX ist eine Datei. Ein sehr pragmatischer Ansatz, der die Verwendung von Geräten unter UNIX allerdings massiv vereinfacht: Egal, ob man auf eine Festplatte oder auf den Speicher der Graphikkarte, die USB-Floppy oder den Drucker zugreift, auf Betriebssystemebene geschieht das mit Hilfe von Dateien.
Wie oben schon erwähnt gibt es spezielle Dateien, die entweder vom Typ Blockdevice oder vom Typ Characterdevice sind. Je nach Gerät kann es sich nur um eines der beiden handeln. Grundsätzlich gilt, daß alle Geräte, die man blockweise anspricht (wie zum Beispiel Festplatten) Block-Gräte sind, die anderen Buchstaben bzw. Zeichen-Geräte sind oder engl. Characterdevices. (Von Characterdevices liest oder schreibt man Zeichen für Zeichen. Beispiele: Druckeranschlüsse, Modems, Soundkarten oder auch Terminals)
Der Vorteil dieses Systems liegt ganz klar auf der Hand: Komplizierte Spezialschnittstellen für die Ansteuerung von Geräten entfallen, da ja jedes Gerät einheitlich behandelt werden kann und die Diagnosemöglichkeiten für den Systemadministrator steigen, da er ebenfalls einfach diese Gerätedateien verwenden kann, um auf zu testen, ob es ein Gerät gibt bzw. ob dieses Gerät funktioniert.
Ein weiteres Feature der meisten UNIXe am Markt sind ladbare Kernelmodule: Wärend das Betriebssystem läft, können dynamisch neue Gerätetreiber eingebunden (und natürlich auch entfernt) werden. Im wesentlichen bringt das ein robustes Plug- and Play-System, bei dem lästiges Neustarten nach der Installation von Gerätetreibern eigentlich völlig flach fällt. Die so eingebunden Geräte werden natürlich wieder als Dateien verwendet. Alle Gerätetreiberdateien befinden sich normalerweise im Verzeichnis "/dev" (Abkürzung für "Devices")

Dateisystem - Struktur und Organisation

UNIX-Systeme gehorchen im Allgemeinen dem POSIX Standard. Darüberhinaus gibt es auch den sogenannten "Filesystem Hirachy Standard" kurz FHS, der die Organisation der Verzeichnisstruktur eines UNIX-Systems beschreibt. Das ist ganz besonders wichtig, damit Hersteller von Software diese nicht auf jede einzelne Plattform anpassen müssen, sondern ihre Anwendungen einfach FHS-konform halten und damit die Portierbarkeit bewahren. Der nun folgende Abschnitt soll kurz den FHS erklären und dann zeigen, was Apple anders gemacht hat und wieso. (Der FHS beschreibt darüberhinaus auch noch welche grundlegenden Tools man in jedem UNIX-System zu finden hat. z.B.: /bin/sh)
Grundsätzlich werden im Dateisystem einmal zwei Kriterien unterschieden: Aus diesen beiden Kriterien ergibt sich eine Matrix, an der man ablesen kann, welche Verzeichnisteile beispielsweise im Netzwerk zentral verfügbar gemacht werden können ("Thin Clients"), welche Bereiche im Dateisystem permanenten Änderungen unterworfen sind bzw. wo individuell für einen Rechner zugeschnittene Einstellungen oder Programme gespeichert sind:
shareable unshareable
static /usr
/opt
/etc
/boot
variable /var/mail
/var/spool/news
/var/run
/var/lock
Aus dieser einfachen Tabelle kann man als Systemadministrator viel gewinnen; ein Beispiel dazu: Eine große Gefahr droht heute aus dem Internet: Hacker, Viren, Trojaner oder Würmer. Um beispielsweise ein System sehr einfach gegen einige der Auswirkungen von Virenbefall oder einem Hackerangriff zu schützen, kann man alle Teile des Systems, die sich nicht verändern nur lesbar in den Verzeichnisbaum einbinden. Das hat den Effekt, daß Angreifer keine Systemtools (die sich [siehe weiter unten] speziell in /usr befinden) oder Konfigurationsdateien (die sich meist in /etc befinden) verändern kann.
Ein grösseres Problem mit UNIX-Systemen ist, daß sie ihren Administratoren die "große Freiheit" geben: Man kann Dinge tun, von denen man sonst nicht einmal trämen würde. Die Kehrseite der Medaillie ist allerdings, daß man sich selbst über die Möglichkeiten informieren muss, da es kein graphisches Tool gibt, das jener Vielfalt gewachsen ist. Die wirkliche Stärke kommt dann erst mit der Möglichkeit der Kombination der einzelnen Möglichkeiten. Ein Umstand mit dem viele Leute, die das erste Mal mit UNIX zu tun haben, kämpfen.
Aber weiter im Text: Die Organisation von Dateien unter UNIX. Anders als bei anderen Betriebssystemen gibt es unter UNIX eigentlich keine Programm-Verzeichnisse. Jedes Programm besteht aus mehreren Teilen, die getrennt voneinander im Verzeichnisbaum zu finden sind:
Bibliotheken in irgendeinem der lib-Verzeichnisse
Binaries, also der ausführbare Teil des Programm in einem Verzeichnis namens bin
Plattformunabhängige Daten in man - Handbücher, Logos, Graphiken, Übersetzungen udgl.
Konfigurationen in etc - alle Konfigurationsdateien sind Plain Text.