Dieser Artikel gehört zur Serie Mein eigener Server.
Linux ist ein Unix
Jetzt habt Ihr Euren Server und sitzt vielleicht zum ersten mal vor Linux. Sehen wir uns also mal gemeinsam an, womit wir es hier zu tun haben. Dies ist ein Unix, eins aus einem langen Stammbaum miteinander verwandter Systeme, zu dem auch der erste Webserver und das iPhone gehören.
Linux selbst ist eigentlich „nur“ eine Neuimplementation des Kernels (also der Gerätetreiber, Netzwerktreiber, Prozessverwaltung und ähnlichem), die Linus Torvalds 1991 begonnen hat, und die seitdem von einer unvorstellbaren Anzahl an Entwicklern ständig weiterentwickelt wurde. Den Rest zum Unix-Erlebnis ergänzen die GNU-Tools, die eigentlich in einem ehrgeizigen Projekt entstanden, das Unix durch ein neues Betriebssystem ersetzen wollte (GNU ist eine rekursive Abkürzung und steht für GNU is not Unix). Während dieses Projekt also seine Tools (Befehle, die wir später noch sehen werden, einen C-Compiler,…) ziemlich weit fertiggestellt hatte, wurde der Betriebssystemkern „Hurd“ nicht fertig. Diese Lücke füllte Linux so gut aus, dass ich bezweifle, dass der Hurd-Kern jemals richtig fertig wird. Aufgrund dieser Geschichte bestehen auch einige Leute darauf, das komplette System für Arbeitsplatzrechner und Server „GNU/Linux“ zu nennen — schließlich besteht es ja nicht nur aus dem Kern (und es gibt tatsächlich jede Menge andere Einsatzmöglichkeiten für Linux ohne die komplette GNU-Umgebung).
Da Linux also nicht von einem einzelnen Hersteller stammt, müssen alle Teile des Systems aus verschiedenen Quellen zusammengestellt und erstmal kompiliert werden. Diese Arbeit übernehmen sogenannte Distributoren, von denen es auch eine unüberschaubare Anzahl für die verschiedensten Einsatzzwecke gibt. Für Server ist Debian GNU/Linux (da! da ist es wieder) gut geeignet, weil die Betreuer dieser Distribution großen Wert auf stabile Programmversionen legen.
Das Unix-Gefühl
Die Unix-Philosophie basiert auf nur wenigen Objekttypen. Der wichtigste davon ist die Datei. In Unix ist praktisch alles eine Datei (sogar die Interaktion mit Geräten wird darüber abgebildet). Dateien sind in einer Baumstruktur hierarchisch in Verzeichnissen angeordnet. Laufwerksbuchstaben wie unter Windows gibt es nicht, alle Dateisysteme hängen in einem gemeinsamen Baum, der Wurzelknoten heißt /
und /
ist auch der Trenner zwischen den Hierarchieebenen des Baums.
Der zweite wichtige Objekttyp ist der Prozess — also das laufende Programm. Prozesse können weitere Prozesse starten. Sowohl Dateien als auch Prozesse haben einen Besitzer. Die daraus entstehende Rechtestruktur sehen wir uns später noch an.
Ein weiterer wichtiger Teil der Unix-Philosophie lautet „Nur ein Zweck für ein Werkzeug“. Auch das wird erst später Sinn ergeben.
Als Beispiel dafür, wie sich das auf die Architektur auswirkt: auch Ihr redet mit Linux über einen Prozess, die sogenannte Shell. Wie von so vielen anderen Dingen gibt es auch davon mehrere zur Auswahl (niemand hat gesagt, dass es nicht mehrere Werkzeuge für den gleichen Zweck geben soll), aber für uns reicht erstmal die Betrachtung der üblichen Linux-Standardshell bash.
Die Shell liest Eure Eingaben aus einer Pseudodatei („Standard Input“), interpretiert sie als Programmtext und startet weitere Prozesse für Euch. Das klingt jetzt auch erstmal abgehoben, aber auch darauf werden wir später wieder zurückkommen. Die Kommandos, die in der Shell zur Verfügung stehen, sind (praktisch) alle einzelne Programme, die als Dateien an bestimmten Stellen des Dateisystems liegen.
Wichtige Kommandos
Jetzt sehen wir uns mal die wichtigsten Unix-Kommandos an:
Das allerwichtigste Kommando ist man
. Es zeigt die Manual Pages des Systems an. Darin sind die Befehle, Dateiformate und sogar Programmierschnittstellen dokumentiert. Der Stil ist für Anfänger nicht leicht zu verstehen, aber nach einiger Eingewöhnung bieten sie eine wichtige Referenz. Seht Euch zur Einstimmung mal man man
an.
Bevor wir uns an die Liste machen noch eine Anmerkung zu Programmoptionen: durch die bereits erwähnte Verzweigung des Unix-Stammbaums haben sich für einige grundlegende Kommandos zwei Sätze von gängigen Optionen herausgebildet. Die meisten Linux-Distributionen sind im Laufe ihrer Entwicklung zwischen den beiden größten Lagern („BSD“ und „System V“) gependelt, und so beherrschen die mit Linux gelieferten Varianten oft beide Sätze. Die aus der BSD-Ecke stammenden werden dabei häufig ohne, die aus der System-V-Ecke stammenden mit vorangestelltem – angegeben. Weil das noch nicht verwirrend genug war, hat das GNU-Projekt dann noch einen dritten Satz Optionen mit langen Namen und — (also zwei Strichen) eingeführt.
Navigieren durch den Verzeichnisbaum
Da wie gesagt alles im Verzeichnisbaum liegt, müssen wir uns durch den bewegen können. Jeder Prozess hat immer ein Arbeitsverzeichnis. Das gerade aktuelle Arbeitsverzeichnis gibt pwd
(print working directory) aus. Mit cd [Verzeichnisname]
(change directory) können wir in ein tieferes, mit cd ..
wieder eine Ebene nach oben gehen. cd
ohne Argumente wechselt in Deine digitale Heimat, das sogenannte Homeverzeichnis.
Übung:
root@Debian-60-squeeze-64-minimal ~ # pwd
/root
root@Debian-60-squeeze-64-minimal ~ # cd ..
root@Debian-60-squeeze-64-minimal / # cd root
root@Debian-60-squeeze-64-minimal ~ #
Ansehen der Inhalte der aktuellen Ebene
Um zu erfahren, was denn im aktuellen Verzeichnis so rumliegt (und wohin wir überhaupt wechseln könnten) gibt es das Kommando ls
, mit der Option -l
generiert es seine Liste mit ausführlichen Zusatzinformationen.
Übung:
root@Debian-60-squeeze-64-minimal /tmp # ls
a.txt b c
root@Debian-60-squeeze-64-minimal /tmp # ls -l
total 4.0K
-rw-r--r-- 1 root root 0 Apr 18 22:11 a.txt
-rw-r--r-- 1 root root 0 Apr 18 22:11 b
drwxr-xr-x 2 root root 4.0K Apr 18 22:11 c
root@Debian-60-squeeze-64-minimal /tmp #
Die Spalten des langen Listings müssen wir uns jetzt mal ansehen. Von Links nach rechts: Berechtigungen, Linkzahl, Benutzer, Gruppe, Größe, Datum, Name. Die erklärungsbedürftigen Felder im Einzelnen:
Eigentum
Dateien gehören immer einem Benutzer und einer Gruppe. Es ist nicht erforderlich, dass der Benutzer, dem eine Datei gehört, Mitglied der Gruppe ist, der die Datei gehört.
Berechtigungen
Benutzer und Gruppe bilden die Basis für ein einfaches aber effektives Berechtigungskonzept. Jeweils für den Eigentümer, die Gruppe und den Rest der Welt lassen sich die drei Operationen „lesen“ (r), „schreiben“ (w) und „ausführen“ (x, diese Dateien können als „Programme“ benutzt werden) bzw. „betreten“ (auch x, für Verzeichnisse) erlauben oder verbieten:
-rwxrwxrwx
^^^^^^^^^^
|||||||||| Rechte für alle Benutzer ("Welt"):
|||||||||+--- ausführen / betreten
||||||||+---- schreiben
|||||||+----- lesen
||||||| Rechte für die Gruppe:
||||||+------ ausführen / betreten
|||||+------- schreiben
||||+-------- lesen
|||| Rechte für den Eigentümer:
|||+--------- ausführen / betreten
||+---------- schreiben
|+----------- lesen
+---------- Typmarkierung:
- = normale Datei, d = Verzeichnis, l = Link
Das werden wir später noch öfter in der praktischen Anwendung sehen.
Linkzahl
Eine Datei kann in Unix an mehreren Stellen im Verzeichnisbaum eingehängt sein (bitte versucht nicht, Euch das bildlich vorzustellen). Die werden hier gezählt. Erst, wenn die Datei nirgendwo mehr referenziert wird (der Linkcounter also 0 ist), verschwindet sie von der Festplatte. In der täglichen Benutzung könnt Ihr das fast immer ignorieren.
Dateien ansehen und editieren
Um den Inhalt einer Textdatei anzuzeigen können wir less
benutzen (scrollen mit den Cursortasten, verlassen mit q), zur Bearbeitung gibt es einen bunten Strauß an Editoren (Vorsicht! Die dazugehörigen Religionskriege sind schlimmer als jede Windows-oder-Mac-Diskussion.), von denen ich zum Einstieg nano
empfehle, weil der die gerade möglichen Befehle immer anzeigt. Mit rm
werden wir unliebsame Dateien wieder los.
Übung:
root@Debian-60-squeeze-64-minimal ~ # less test.txt
Hallo Wult!
root@Debian-60-squeeze-64-minimal ~ # nano test.txt
root@Debian-60-squeeze-64-minimal ~ # less test.txt
Hallo Welt!
root@Debian-60-squeeze-64-minimal ~ # rm test.txt
root@Debian-60-squeeze-64-minimal ~ #
Prozesse
ps
zeigt die gerade laufenden Prozesse an, ps x
nimmt in die Liste auch die Prozesse auf, die gerade nicht mit einem Terminal verbunden sind (hier haben wir jetzt ein Programm, das aus historischen Gründen mit BSD-Style-Optionen gestartet wird). Die erste Spalte dieser Liste ist die Prozess-Id. Wenn wir später mit kill
Prozesse abschießen werden, dann brauchen wir die.
Übung:
root@Debian-60-squeeze-64-minimal ~ # ps
PID TTY TIME CMD
3067 pts/0 00:00:00 bash
3102 pts/0 00:00:00 ps
root@Debian-60-squeeze-64-minimal ~ #
So, das war jetzt eine grobe Übersicht über das Wichtigste — aber alles noch sehr theoretisch. Auf vieles müssen wir deshalb später noch einmal vertiefend in der praktischen Anwendung zurückkommen. In der nächsten Folge reden wir über Netzwerke und fangen tatsächlich mal mit der Serverkonfiguration an.