Unix ist ein Multi-User und Multi-Tasking Betriebssystem. Das heißt, es können sowohl mehrere Prozesse (Programme) gleichzeitig ablaufen, als auch verschiedene Benutzer gleichzeitig an der Maschine arbeiten. Um das letztere zu verwirklichen, müssen Sie entweder mehrere Terminals am System angeschlossen haben, oder einen TELNET Eingang freigeschaltet haben.

Beide Eigenschaften stellen gewisse Anforderungen an ein Betriebssystem. Die wesentliche Aufgabe eines solchen Systems besteht also daraus, Konflikte zu verwalten, die aus den folgenden Gründen auftauchen:

  • Gleichzeitiger Zugriff auf eine Datei
  • Gleichzeitiger Zugriff auf ein Gerät
  • Gleichzeitiger Zugriff auf den Arbeitsspeicher
  • Gleichzeitiger Zugriff auf die Rechenleistung des Prozessors

Weitere Probleme kommen noch hinzu, wenn es darum geht, verschiedene Benutzer zu verwalten. Es muß möglich sein, genau zu bestimmen, was ein User darf und was nicht.

Um all diese Aufgaben stabil zu lösen, muß das System zwangsläufig sehr komplex sein. Um diese Komplexität darzustellen, wird im folgenden versucht, das Unix-System aus mehreren Perspektiven kurz zu beleuchten. Natürlich wird später zu den einzelnen Themen noch mehr zu sagen sein, aber zum grundlegenden Verständnis ist ein kleiner Generalüberblick sehr hilfreich.

1. Die Systemarchitektur

Das zentrale Kernstück des Betriebssystems (im folgenden Kernel genannt) bildet eine Trennschicht zwischen Hardware und Anwenderprogramm, die für das Programm undurchdringlich ist. Das heißt, wenn ein Programm auf ein Stück Hardware zugreifen will, so kann es unter keinen Umständen direkt darauf zugreifen, sondern nur über das Betriebssystem.

1.1 Die Systemaufrufe und Gerätetreiber

Dazu bedient sich das Programm der Systemaufrufe. Ein Systemaufruf ist eine Schnittstelle, die es dem Anwenderprogramm ermöglicht, dem Betriebssystem mitzuteilen, dass es etwas von ihm will. Will etwa ein Programm eine Zeile Text auf dem Bildschirm ausgeben, so wird ein Systemaufruf gestartet, dem der Text übergeben wird. Das System erst schreibt ihn auf den Bildschirm.

Der Kernel muß aber auf der anderen Seite genau wissen, wie einzelne Hardware angesprochen werden muß. Dazu bedient er sich einer Treiberschnittstelle, über die er wiederum an den speziellen Treiber für das jeweilige Gerät herankommt. Erst die Treiber sprechen dann das Gerät an.

Ein sehr spezielles Anwenderprogramm ist die Shell, die als „Benutzeroberfläche“ dient. Sie entspricht in der Arbeitsweise dem COMMAND.COM von DOS, ist aber sowohl in ihrer Anwendbarkeit, als auch in ihrer Programmierbarkeit wesentlich mächtiger. Es existieren verschiedene Shells, wir arbeiten hier z.B. mit der BASH (Bourne Again SHell). Alle diese Shells stellen dem Benutzer eine Eingabeaufforderung zur Verfügung, mit der Programme gestartet werden können oder Befehle eingegeben werden.

Wenn ein Benutzer ein Programm startet, stellt der Kernel einen Speicherabschnitt zur Verfügung, in den das Programm geladen wird. Zusätzlich werden verschiedene Verwaltungsdaten zu diesem Programm in einer Tabelle gespeichert. Ab dem Moment, in dem all das erledigt ist, das Programm also läuft, spricht man nicht mehr von einem Programm, sondern von einem Prozess. Das Programm ist das, was von der Platte in den Speicher geladen wird. Ein laufendes Programm ist ein Prozess.

Benötigt ein Prozess Zugriff auf irgendeine Form von Hardware, so wendet er sich an den Kernel und gibt ihm diese Aufgabe weiter. Dazu bedient er sich eines Sytemaufrufs. Nach dem Systemaufruf wird der aufrufende Prozess gestoppt, der Kernel analysiert die Anfrage. Dann ruft er seinerseits das entsprechende Kernel-Modul (meist ein Gerätetreiber) auf um die Anfrage zu erledigen. Falls Daten zwischen Programm und Hardware ausgetauscht werden (ist meistens der Fall) dann übernimmt auch hier der Kernel die Weitergabe in die jeweilige Richtung. Nach der Abarbeitung all dieser Aufgaben wird der gestoppte Prozess wieder als aktiv markiert und bekommt dann wieder regelmäßig Zeitscheiben vom Scheduler zugewiesen.

1.2 Das Multitasking

Damit mehrere Prozesse gleichzeitig laufen können, muß das Betriebssystem natürlich etwas zaubern. Wir haben (gewöhnlicherweise) nur einen Prozessor im Rechner, also kann auch immer nur ein Prozess gleichzeitig bearbeitet werden. Das bedingt, dass das System alle verfügbare Rechenzeit des Prozessors in kleine Zeitscheiben aufteilt (im Millisekundenbereich), die dann den jeweiligen Prozessen zur Verfügung stehen. Das erledigt eben der oben schon genannte Scheduler. Dieses Modell einer Zeitscheibenverwaltung wird präemtives Multitasking genannt. Der wesentliche Unterschied zu anderen Multitasking-Formen ist, dass hier eine übergeordnete Instanz die Kontrolle über die Rechenzeit übernimmt – eben der Scheduler.

Zum Vergleich: Das Multitasking-System von Windows erlaubt es einem Prozess, die gesamte Rechenleistung eines Systems zu übernehmen und sie erst wieder durch das Ende des Programms oder eine freiwillige Herausgabe freizugeben. Das ist zwar für ein Single-User System vertretbar, in einem System, in dem viele User gleichzeitig arbeiten können müssen, ist so etwas aber undenkbar.

2. Das Usersystem von Unix

Weil Unix ein Mehrbenutzersystem ist, ist es natürlich notwendig, dass jeder User sich beim System mit einem Namen anmeldet und (gegebenenfalls) mit einem Passwort legitimiert. Das Betriebssystem ist sich also immer im Klaren, wer gerade an welcher Konsole arbeitet.

User werden zwar mit ihren Namen verwaltet, intern arbeitet Unix aber mit Usernummern. Jeder User hat also eine UserID, kurz oft UID genannt. Sein Name ist nur Beiwerk, das jederzeit verändert werden kann. Jeder User ist Mitglied mindestens einer Gruppe. Es kann beliebig viele Gruppen in einem System geben, auch sie haben intern Nummern (GroupID oder GID). Im Prinzip sind Gruppen nur eine Möglichkeit, noch detailiertere Einstellungsmöglichkeiten zu haben, wer was darf.

Das System von Usernamen und Passwort ist auch von Windows her bekannt, aber bei Unix spielt es eine völlig andere Rolle. Jede einzelne Datei im System hat einen Eigentümer (einen User, gewöhnlicherweise der, der die Datei angelegt hat) und gehört zu einer Gruppe. Jede Datei hat aber auch eine Einstellung, wer sie lesen, überschreiben (verändern) oder ausführen darf. (Richtet sich nach Eigentümer, Gruppenzugehörigkeit und „Rest der Welt“) Es ist also möglich, genauestens festzulegen, wer welche Dateien bearbeiten darf, wer sie lesen darf und wer nicht.

Ein System, das solche Einschränkungen erlaubt braucht zwingend jemand, der diese Einsellungen erledigt und daher außerhalb ihrer Wirkung steht. Kurz gesagt einen Superuser, der Systemverwalter. Bei Unix heißt der Superuser gewöhnlich root, er hat immer die UserID (UID) 0.

Root steht außerhalb aller Sicherheitseinrichtungen des Systems – kurz – er darf alles. Er kann mit einem Befehl das ganze System zerstören, er kann die Arbeit von Wochen löschen usw. Aus diesem Grund ist es auch immer angesagt, dass der Systemverwalter im Normalfall auch noch einen „Normal-Login“ besitzt – als root sollte er nur arbeiten, wenn er Systemverwaltungsarbeiten abwickelt, die diese Identität benötigen.

3. Das Dateisystem von Unix

Unix verwaltet seine Dateien ganz ähnlich wie DOS. Das kommt schlicht daher, dass DOS in diesem Bereich viel bei Unix abgeschaut hat. Immerhin gibt es noch ein paar wirklich wesentliche Unterschiede. Im Folgenden seien sie kurz dargestellt:

3.1 Ein Dateibaum

Unter DOS/Windows hat jedes (logische und physikalische) Laufwerk seinen eigenen Dateibaum. Jedes Laufwerk hat ein Wurzelverzeichnis und evt. Unterverzeichnisse. Jedes Laufwerk hat einen Laufwerksbuchstaben, der bekannt sein muß, um auf das Laufwerk zuzugreifen.

Unix geht hier einen anderen Weg. Es existiert nur ein Dateibaum, nur ein Wurzelverzeichnis. Alle anderen Laufwerke (logische oder physikalische) werden an beliebigen Stellen des Systems gemountet.

So entsteht ein einheitlicher Dateibaum, der ohne Laufwerksbuchstaben auskommt. Für einen normalen User ist kaum festzustellen, auf welchem physikalischen Medium eine Datei gespeichert ist, für ihn steht sie nur an einer bestimmten Stelle im Dateibaum. Das System ist also transparent.

3.2 Datei- und Verzeichnisnamen

Datei- und Verzeichnisnamen können bis zu 256 Zeichen lang sein. Dabei wird in jedem Fall zwischen Groß- und Kleinschreibung unterschieden. Die Dateinamen

README
readme
ReadMe

bezeichnen drei unterschiedliche Dateien. Ein Dateiname darf beliebig viele Punkte enthalten, also auch Datei.1.alt.txt oder Text1.txt.zip sind möglich. Ein Punkt gilt als normales Zeichen in einem Dateinamen. Das Zeichen zum Trennen von Verzeichnis- und Dateinamen ist der Slash („/“) statt dem Backslash („\“) bei DOS.

3.3 Dateiarten

Unix unterscheidet zwischen verschiedenen Dateiarten, von denen nur eine dem entspricht, was wir bisher unter dem Namen Datei verstanden haben. So gibt es in allen Unixen z.B. folgende Dateiarten:

  • Normale Dateien (-)
  • Unterverzeichnisse (d)
  • Symbolische Links (l)
  • Blockorientierte Geräte (b)
  • Zeichenorientierte Geräte (c)
  • Named Pipes (p)

Die Buchstaben in Klammern geben die offizielle Darstellung wieder, die überall in Unix benutzt wird. Die einzelnen Dateiarten werden später noch genauer erklärt.

3.4 Eigentumsrechte

In einem Unix-Dateisystem hat jede einzelne Datei jeweils einen Eigentümer und eine Gruppenzugehörigkeit. Neben diesen beiden Angaben besitzt jede Datei noch einen Satz Attribute, die bestimmen, wer die Datei wie benutzen darf. Diese Attribute werden dargestellt als „rwx“. Dabei steht „r“ für lesen (read), „w“ für schreiben (write) und „x“ für ausführen (execute). Ein solches rwx Konstrukt existiert für jede Datei drei mal, einmal beschreibt es die Rechte des Eigentümers, das zweite bestimmt die Rechte eines Gruppenmitglieds der Gruppe, der die Datei angehört, das dritte regelt die Rechte für den Rest der Welt. Das folgende Beispiel zeigt es etwas genauer:

-rw-r—– 1 hans user 2340 Jun 11 17:45 Datei1

Diese Zeile (die Ausgabe des ls -l Befehls) beschreibt also eine Datei mit dem Namen Datei1, die am 11. Juni dieses Jahres zum letzten Mal verändert wurde. Sie ist 2340 Byte groß, gehört dem User hans und der Gruppe user.

Die auf den ersten Blick etwas seltsame Kombination -rw-r—– hat folgende Bedeutung:

DateiartEigentümerGruppeRest
rw-r–
Normale DateiDarf lesen und schreibenDarf lesenDarf nichts

Die Datei darf also von ihrem Eigentümer (hans) gelesen und verändert (beschrieben) werden. Gruppenmitglieder der Gruppe user dürfen die Datei lesen aber nicht verändern, der Rest der Welt hat auf diese Datei keinerlei Zugriff.