Bourne Again Shell

Grundlagen der Bash-Programmierung
Kommentare

Die enge Bindung der Shell an das Betriebssystem setzt eine gewisse Vertrautheit des Benutzers mit Linux voraus. Um effektiv mit der Shell zu arbeiten, sind einige Grundkenntnisse wichtig, die hier kurz erklärt werden sollen. Leser, die bereits ausreichend Erfahrung unter Linux gesammelt haben, können diesen Teil des Kapitels überspringen, in dem es u.a. um das Linux-Dateisystem sowie Partionierung und Dateisysteme geht.

2.1 Linux

Linux ist ein Mehrbenutzer- und Multitasking-System. Es gestattet das Arbeiten von mehreren Benutzern gleichzeitig. Die Voraussetzung hierfür ist, dass jeder Benutzer sein eigenes „Terminal“ besitzt. Ein Terminal besteht dabei aus einer Tastatur und einem Bildschirm, die entweder direkt, über ein Netzwerk oder über ein Modem mit dem Computer verbunden sind, auf dem gearbeitet wird. Die direkte Verbindung wird auch „Konsole“ genannt. Über ein Terminal kann sich ein Benutzer unter seinem Benutzernamen (Login) mit einem Passwort einloggen. Nach dem Login-Vorgang stellt ihm das System die Standard-Shell zum Arbeiten zur Verfügung. Unter grafischen Oberflächen wie Gnome oder KDE lassen sich Shells in Terminal-Fenstern starten. Hierzu stellt das Fenstersystem Programme wie xterm, gnome-terminal (Gnome) oder konsole (KDE) bereitDamit mehrere Benutzer gleichzeitig unter Linux arbeiten können (Multiuser), muss das System dafür Sorge tragen, dass viele Programme und Anwendungen zur gleichen Zeit laufen (Multitasking). Eben diese Fähigkeiten zeichnet Linux- und Unix-Systeme gegenüber anderen Betriebssystemen aus.

Der Preis dafür ist die Komplexität des Systems: Es muss die verschiedenen gleichzeitig laufenden Programme koordinieren und verhindern, dass Benutzer zur gleichen Zeit auf die gleiche Datei zugreifen oder versehentlich Daten anderer Benutzer löschen. Nicht
umsonst wird Linux als Expertensystem bezeichnet.

2.1.1 Benutzer, Gruppen und Rechte

Die Komplexität des Systems spiegelt sich unter anderem in der Verwaltung von Benutzern wider:

Da das System viele Benutzer mit Logins/Accounts verwaltet, muss es gewährleisten, dass Benutzer untereinander nicht auf private Dateien zugreifen können. Für jeden Benutzer existiert ein Verzeichnis, dessen Dateiname mit dem Login-Namen übereinstimmt, das so genannte Heimatverzeichnis. In diesem kann er seine Dateien ablegen, ändern und verwalten. Die Rechte, die der Benutzer in seinem Heimatverzeichnis hat, sind generell unbegrenzt. Operiert der Benutzer auf Dateien in anderen Verzeichnissen, unterliegt er jedoch bestimmten Rechten.

Neben dem Schutz persönlicher Daten muss das Betriebssystem darüber hinaus gewährleisten, dass Benutzer nicht systemwichtige Daten manipulieren können. Aus Sicherheitsgründen stehen einem Benutzer nicht alle Zugriffe auf Dateien oder Programme zur Verfügung, er ist eingeschränkt durch gewisse Rechte. Der einzige Benutzer, der uneingeschränkt auf dem System operieren darf, ist der Systemadministrator (oder Superuser) root. Er alleine hat das Recht, neue Benutzer und Gruppen anzulegen, das Dateisystem oder die Partitionierung von Festplatten zu verändern und neue Software zu installieren.

Zugriffsrechte

Wer welche Rechte an welchen Daten hat, ist durch eine dreiteilige Zugriffsvergabe auf Dateien bzw. Verzeichnisse geregelt. Die Vergabe teilt sich auf in:
1. Besitzer (owner)
2. Gruppe (group) und
3. alle anderen (other).

Jeder Datei und jedem Verzeichnis wird exakt eine dieser drei Parteien zugeordnet.

Besitzer einer Datei oder eines Verzeichnisses ist üblicherweise derjenige, der die Datei bzw. das Verzeichnis erzeugt hat. Ihm obliegt das Recht, die Rechte der Datei neu zu vergeben
und zu ändern.

Eine Gruppe fasst mehrere Benutzer zusammen (ebenso kann ein Benutzer Mitglied in mehreren Gruppen sein). Die Gruppenrechte ermöglichen somit die Zugriffskontrolle für eine bestimmte Anzahl an Benutzern auf eine Datei oder ein Verzeichnis. Welcher Benutzer in welcher Gruppe ist, wird vom Systemadministrator festgelegt.

Die Rechtegruppe other dient zur Gewährleistung des Zugriffs aller Benutzer des Systems auf eine Datei bzw. ein Verzeichnis.

Rechtevergabe

Die Rechte, die ein Besitzer, eine Gruppe oder Andere an einer Datei haben, splitten sich wiederum in drei Teile auf: Besitzer, Gruppen und Andere haben jeweils das Recht, um eine Datei

  1. zu lesen (read)
  2. zu schreiben (write) und
  3. auszuführen (execute).

Leserechte werden benötigt, um überhaupt auf Dateien und Verzeichnisse zugreifen zu können. Durch Schreibrechte ist es Benutzern möglich, Dateien bzw. Verzeichnisse zu manipulieren oder zu löschen. Ausführungsrechte werden benötigt, um Dateien bzw. Programme ausführen zu können oder um in Verzeichnisse zu wechseln.

Leserechte bilden die stärkste Form der Rechtevergabe. Ohne ein Leserecht auf eine Datei zu besitzen, ist das Schreibrecht sinnlos. Mit dieser Konstellation an Rechten wäre eine Datei allenfalls löschbar, ihr Inhalt könnte aber nicht geändert werden, wenn das Leserecht fehlt. Ausführrechte bilden die schwächste Form. Analog zu Schreibrechten machen sie alleinstehend ohne Leserechte wenig Sinn.

Standardmäßig werden einem Benutzer beim Anlegen einer Datei automatisch die Rechte read und write vergeben und die Datei einer vordefinierten Gruppe zugeordnet. Die Gruppe und Andere erhalten in der Regel das Recht read. Beim Anlegen eines Verzeichnisses erhält der Besitzer üblicherweise die Rechte read, write und execute, die Gruppe und alle Anderen ebenso zusätzlich das Recht execute.

Welche vordefinierte Gruppe einer Datei beim Erzeugen zugeordnet wird, hängt ab von der Gruppenzuordnung des übergeordneten Verzeichnisses. In den Heimatverzeichnissen war es lange Zeit üblich, die Gruppe users zu vergeben, in der alle Benutzer mit Login-Account zusammengefasst waren. Dieser Gruppe wurde das Verzeichnis /home zugeordnet, um den Benutzern gegenseitig den Zugriff auf ihre jeweiligen Heimatverzeichnisse zu ermöglichen. Inzwischen ist der restriktive Ansatz üblich, dass beim Anlegen eines neuen Benutzers dieser auch eine gleichnamige Gruppe erhält, die (ausschließlich) für sein Heimatverzeichnis gilt und in der er der einzige Benutzer ist. Dieses Prinzip gilt seit jeher für den Systemadministrator root. Generell sind Dateien, deren Besitzer root ist, auch im Besitz der Gruppe root.

Aufmacherbild: Shell von Shutterstock / Urheberrecht: skyhyun

[header = 2.1.2 Das Linux-Dateisystem]

2.1.2 Das Linux-Dateisystem

Im Gegensatz zu Windows, unter dem jeder Partition der Festplatte ein fester Laufwerksbuchstabe zugeordnet wird, verwaltet Linux seine Dateien in einer Baumstruktur. (Der Begriff Baumstruktur lehnt sich an den Fachbegriff Baum aus der Informatik an, der eine bestimmte Datenstruktur beschreibt: Elemente in einem Baum werden als Knoten bezeichnet, jedes Element kann wiederum Knoten enthalten. Den Knoten, der kein Elternelement besitzt, nennt man Wurzel, die Blätter eines Baums bilden die Knoten, die keine Unterelemente besitzen.)

Abbildung 2.1 zeigt einen Auschnitt des Verzeichnisbaums unter Linux.


Abbildung 2.1: Linux-Verzeichnisbaum

Das Wurzelverzeichnis bildet /. Da es die Wurzel ist, existiert kein übergeordnetes Verzeichnis. Von hier aus verzweigt sich das Dateisystem über einzelne Verzeichnisse. Jedes Verzeichnis bildet einen Knoten im Verzeichnisbaum, die Blätter des Baums sind Dateien oder leere Verzeichnisse.

/bin/bash

In den Verzeichnissen bin und sbin unterhalb des Wurzelverzeichnisses finden sich die Programme, die für die Lauffähigkeit des Systems wichtig sind. So liegt zum Beispiel das Programm bash im Verzeichnis bin. Der Weg vom Wurzelverzeichnis bishin zum Programm bash oder anderen Knoten wird auch als Pfadname oder einfach Pfad bezeichnet, notiert wird ein Pfad durch seine einzelnen Knoten, getrennt durch den Slash:

Die Programme unter /bin stehen in der Regel den Benutzern nur eingeschränkt zur Verfügung, die unter /sbin sind alleine dem Systemadministrator root vorbehalten.  Das Verzeichnis /lib beherbergt die nötigen Bibliotheken zu den Programmen in /bin. Jedes Programm kann mehrere Bibliotheken verwenden, umgekehrt können mehrere Programme ein- und dieselbe Bibliothek verwenden (Bausteinprinzip).

/usr:

Dieselbe Struktur findet sich im Verzeichnis /usr und /usr/local wieder: Unter /usr/bin liegen die Programme, die in der Regel alle Benutzer ausführen dürfen. Die zugehörigen Bibliotheken sind in /usr/lib untergebracht, unter /usr/include die so genannten Headerdateien einzelner (C-)Programme, die zum kompilieren von Software benötigt werden, d.h. dem Übersetzung von Quelltexten eines Programm in Maschinencode.

Für eigens kompilierte Software ist das Verzeichnis /usr/local vorgesehen. In der Regel ist die Übersetzung von einzelnen Programmen unter den meisten Linux-Distributionen nicht mehr nötig, einzelne Programmteile werden in Form von Paketen als Maschinencode fertig bereitgestellt und lassen sich über einen Paketmanager herunterladen und installieren.

Im Verzeichnis /usr/share finden sich die Dateien, die von verschiedenen Programmen als Ressourcen verwendet werden, beispielsweise Grafiken und Icons für verschiedene Benutzeroberflächen oder Hintergrundbilder für das Desktopsystem.

Das Verzeichnis /usr/src ist für die Quelltexte und die Dokumentation des Linux-Kernels vorgesehen, ebenso für die Quellen einzelner Module, die vom Kernel verwendet werden. Der Kernel selbst und alle erforderlichen Dateien zum Booten des Betriebssystems befinden sich im Verzeichnis /boot, die Kernelmodule in /lib/modules.

/etc:

Unter /etc finden sich alle Konfigurationsdateien für einzelne Programme, Bibliotheken, Dienste und für das Betriebssystem selbst. Hier kann der Systemadministrator Einstellungen vornehmen, die das Verhalten von Programmen oder des Betriebssystems beeinflussen. Generell werden die Konfigurationsdateien in /etc in ein Unterverzeichnis abgelegt, dass den gleichen Namen trägt, wie das Programm, für das eine Konfiguration gilt oder in eine Datei gleichen Namens mit der Endung .conf. Wichtige Konfigurationsdateien sind unter anderem:

  • /etc/hostname und /etc/hosts, die den Rechnernamen und seinen Namen im (lokalen) Netz angeben,
  • die Datei interfaces unter /etc/network, die die Netzwerkkarten des Rechners konfiguriert und die nötigen Skripten zur Aktivierung der Karten,
  • die Konfiguration der grafischen Benutzeroberfläche X unter /etc/X11, mit den Einstellungen der einzelnen Desktopmanager,
  • die Datei /etc/modules zum Laden bestimmter Kernelmodule beim Starten des Betriebssystems, die Verzeichnisse /etc/modutils und /etc/modprobe.d für die Feinkonfiguration einzelner Module,
  • das Verzeichnis /etc/init.d, das sämtliche Skripte zum Starten und Stoppen von Diensten enthält, beispielsweise Mailserver, Webserver und Desktopmanager,
  • die Verwaltung von Benutzern (/etc/passwd) und Gruppen (/etc/group),
  • die Partitionierung der Festplatte(n) in der Datei /etc/fstab,
  • die systemweite Einstellung für Sprache und Zeichensatz unter /etc/environment (für Debian-Distributionen und -Derivate)
  • die Startup-Dateien /etc/profile und /etc/bash.bashrc für die Ausführung von Bash-Shells.

/home:

Unter /home liegen die Heimatverzeichnisse der Benutzer. Das Verzeichnis /root ist das Heimatverzeichnis des Systemadministrators root.

/opt:

Das Verzeichnis /opt ist für die Installation von (optionaler) Software vorgesehen, die nicht im Standardumfang der verwendeten Linux-Distribution enthalten ist. Im Allgemeinen ist /opt auch für Softwarepakete vorgesehen, die unter die GNU Public License fallen.

/var:

Kurzlebige Daten und solche, die sich permanent ändern, sind im Verzeichnis /var untergebracht (die Bezeichnung des Verzeichnisnamens steht kurz für „variable“). Darunter fallen beispielsweise die Log-Dateien des Systems unter /var/log, Website-Dateien unter /var/www oder die Spool-Verzeichnisse für Mailserver und Drucker.

/tmp:

Für temporäre Dateien steht der Ordner /tmp zur Verfügung. Auf ihn dürfen alle Benutzer uneingeschränkt zugreifen. Die meisten Programme legen unter /tmp lock-Dateien ab und Daten, die vorübergehend gespeichert werden. Abgelegte Dateien eines Programms können mit Ausnahme des Systemadministrators nur von den Benutzern geändert und teils gelesen werden, die das Programm gegenwärtig ausführen. Auf keinen Fall sollten temporäre Dateien manuell gelöscht werden. Dies könnte die Ausführung bestimmter Programme stark beeinflussen oder diese zum Absturz bringen. In der Regel wird das /tmp-Verzeichnis beim Herunterfahren des Systems oder beim Booten geleert.

/mnt:

Das Verzeichnis /mnt (abgeleitet von mount) ist zum Einhängen verschiedener Geräte und Dateisysteme vorgesehen. Den Prozess des Einhängens bezeichnet man aus Mounten, er  stellt dem System das Dateisystem des eingebundenen Geräts zur Verfügung. Unter /mnt finden sich in einigen (älteren) Distributionen bestimmte Unterverzeichnisse, die als so genannte Mount Points für CD/DVD-, Floppy- und USB-Laufwerken dienen. Die Standard-Mountpunkte /mnt/cdrom für Cds/DVDs und /mnt/floppy.    

Im Linux Hierarchie Filesystem Standard (FSSTND) Version 2.3, an den sich jüngere Linux-Systeme orientieren, wurde der Zweck von /mnt geändert: Die Funktion von /mnt liegt darin, es dem Systemadministrator zu ermöglichen, Dateisysteme bei Bedarf temporär zu mounten. Der Inhalt des gemounteten Dateisystems sollte dabei nicht von Dateipfaden außerhalb von /mnt referenziert werden und Prozesse oder Programme in irgendeiner Art beeinflussen.

Die ursprüngliche Funktionalität von /mnt zum Einhängen von Wechseldatenträgern wurde dem Verzeichnis /media übertragen. Die Motivation für die offizielle Einführung dieses Verzeichnisses war historisch bedingt, da die Mountpoints für Wechsellaufwerke trotz /mnt von Distribution zu Distribution unterschiedlich behandelt wurden. Manche Hersteller verwendeten /cdrom, manche /mnt/cdrom oder einfach nur /mnt. Zudem wollte man vermeiden, dass mehrere Laufwerke, die direkt in ein Unterverzeichnis von  / eingebunden werden zu einer „Übervölkerung“ des Wurzelverzeichnisses betragen.

/media:

Unter /media ist für alle Wechseldatenträger, die an einen Rechner angeschlossen sind, eine festgelegte Ordnerstruktur an optionalen Verzeichnissen vorgesehen:

  • floppy (Floppy-Laufwerk)
  • cdrom (CD-ROM- oder DVD-Laufwerk)
  • cdrecorder (CD/DVD-Brenner)
  • zip ( Zip-Laufwerk)

Für Systeme, die mehr als ein Laufwerk gleichen Typs haben, ist vorgesehen, die entsprechenden Verzeichnisnamen durch das Anhängen einer Ziffer zu erweitern, wobei der ursprüngliche Name erhalten werden muss. Für einen Rechner, der mit zwei CD-ROM-Laufwerken bestückt ist, wird dann beispielsweise folgende Ordnerstruktur vorgeschrieben:

    1. /media/cdrom0 für das erste Laufwerk,
    2. /media/cdrom1 für das zweite Laufwerk,
    3. /media/cdrom als symbolischer Link auf eines der beiden oberen Ordner (meist /media/cdrom0).

Spezielle Verzeichnisse

/proc:

Das spezielle Verzeichnis /proc bildet  Informations- und Kontrollzentrale des Kernels. Es ist als eine Art virtuelles Dateisystem oder Pseudo-Dateisystem anzusehen. /proc steht für processing information, es enhält keine echten Dateien, sondern Laufzeitinformationen des Betriebssystems: Systemspeicher, gemountete Festplatten und Geräte, die Konfiguration der Hardware, Informationen über die Prozessoren und vieles mehr.

Viele Systemprogramme beziehen aus /proc ihre Informationen, indem sie den Inhalt einer Datei direkt auslesen und auf die Konsole ausgeben (wie der Befehl cat): So ist zum Beispiel der Befehl lsmod zur Anzeige der geladenen Kernelmodule identisch mit der Anweisung:

$ cat /proc/modules

Änderungen im Verzeichnis /proc können sogar eine Änderung der Einstellungen für Kernelparameter im laufenden System bewirken. Damit ist es möglich, Konfigurationen vorzunehmen, ohne das System neu starten zu müssen. Aus diesem Grund ist das Ändern von Dateien unter /proc ausschließlich dem Benutzer root vorbehalten. Andere Benutzer besitzen allenfalls Leserechte.

Dass es sich um ein Pseudo-Dateisystem handelt, wenn man durch die Auflistung aller Dateien inklusive Dateiattribute mit dem Befehl ls:

$ ls -l /proc 

Mit Ausnahme der Dateien kcore, mttr, und self haben alle Dateien die Dateigröße 0. Die Ausgabe von ls wird Ihnen eine ganze Reihe an Verzeichnissen anzeigen, die eine Zahl als Dateinamen tragen. Jede Zahl steht für die ID eines Prozesses, der gerade auf dem System abläuft. Die Dateien in einem dieser Verzeichnisse sind nach einen bestimmten Muster angelegt und geben Auskuft über den Zustand des Prozesses.

Ein Beispiel: Mit der Anweisung grep filtert der Systemadministrator root die Ausgabe der laufenden Prozesse (ps) nach einer laufenden Bash-Shell.

# ps ax | grep bash
16598 pts/0    Ss     0:00 bash
# ls /proc/16598
attr        cpuset   fd      mounts      root     statm
auxv        cwd      fdinfo  mountstats  seccomp  status 
clear_refs  environ  maps    oom_adj     smaps    task 
cmdline     exe      mem     oom_score   stat     wchan 

Er findet die Prozess-ID 16598 und damit die ensprechenden Dateien im Verzeichnis /proc/16598. Die einzelnen Dateien bzw. deren Inhalte liefern dabei folgende Auskünfte über den laufenden Prozess:

  • cmdline: Kommandozeilenargumente mit denen der Prozess aufgerufen wurde,
  • cwd: Verweis auf das aktelle Arbeitsverzeichnis , in dem sich der Benutzer befindet,
  • environ: die aktuelle Wertebelegung aller Umgebungsvariablen,
  • exe: ein Verweis auf den Dateipfad des ausgeführten Befehls,
  • fd: Verzeichnis, das alle Dateideskriptoren aufzeigt, die den Zugriff auf die Datei bzw. der Befehl beschreiben. Filedeskriptoren beschreiben die elementaren Operationen, die auf eine Datei anwendbar sind: read, write, open und close.
  • maps: Speicherverweise auf ausführbare Dateien und verwendete Bibliotheken,
  • mem: Speicherbelegung des Prozesses
  • root: Verweis auf das Wurzelverzeichnis des Prozesses,
  • stat: Status des Prozesses selbt,
  • statm: Status Informationen über den Prozessspeicher
  • status: Statusinformationen in menschlich lesbarer Form.

Der Befehl /usr/bin/procinfo fasst die wichtigsten Systeminformationen aus /proc zusammen. Er ist auch von normalen Benutzern ausführbar. procinfo beinhaltet unter anderem die Informationen aus den Dateien

  • /proc/version (Abgaben über den Linuxkernel und die verwendete Distribution, verwendet vom Befehl uname)
  • /proc/meminfo (Speicherauslastung)
  • /proc/uptime (Länge der Laufzeit seit dem letzten Booten, verwendet vom Befehl uptime)
  • /proc/loadavg (Systemauslastung).

/dev:

Gerätedateien sind im Verzeichnis /dev (devices) untergebracht. Unter /dev liegt die gesamte Hardware Ihres Rechners in Form von (speziellen) Dateien. Gerätedateien sind kategorisiert in zwei Gruppen: Zeichenorientierte Geräte (character devices) und  blockorientierte Geräte (block devices). Blockorientierte Geräte sind solche, deren Blöcke sich über Adressen ansprechen lassen, z.B. Festplatten oder Wechseldatenträger. Sie dienen zum Speichern von Daten. Zeichenorientierte Geräte dienen zur Übertragung von Daten. Typische Character Devices sind serielle und parallele Ports, USB- oder Maus-Ports.

Neben Gerätedateien dürfen auch reguläre Dateien unter /dev auftreten und erzeugt werden. Das Verzeichnis ist eines der interessantesten, da es den Charakter von Linux/Unix-Dateisystemen hervorhebt: Alles ist entweder eine Datei oder ein Verzeichnis.

Auf den ersten Blick erscheint das ein wenig ungewöhnlich und beunruhigend. Die Gemeinsamkeit zwischen einer Datei und einer Hardware liegt aber im Wesentlichen: von beiden kann man lesen, auf beide kann geschrieben werden.

Die Datei /dev/lp0 beispielsweise ist nichts anderes als der Druckerport. Alles was sie auf diese Datei schreiben, geht an den Drucker und wird ausgedruckt. Ist die Soundkarte richtig konfiguriert, geht jeder Schreibzugriff auf /dev/dsp direkt an den Lautsprecher. Sie können beispielsweise den Zufallsgenerator /dev/random aktivieren (d.h. von ihm lesen) und dessen Ausgabe direkt an die Soundkarte weiterzuleiten:

$ cat /dev/random >/dev/dsp

Auch wenn es sich wahrscheinlich grauenvoll anhört, immerhin haben Sie danach erst  einmal Ruhe vor eventuell nervigen Kollegen am Arbeitsplatz.

Die Einträge unter /dev sind nach bestimmten Mustern angelegt, das typisch für ein bestimmtes Gerät ist. Die Festplatte heißt /dev/hda bzw. /dev/sda, das „h“ bezeichnet eine IDE-Festplatte, „s“ eine SCSI- oder (Serial-) ATA-Festplatte. Das „a“ in sda kennzeichnet, dass es sich um die erste Festplatte handelt. Weitere Platten oder Laufwerke werden mit /dev/sdb, /dev/sdc usw. referenziert. Einzelne Partitionen einer Festplatte sind numeriert. So steht zum Beispiel /dev/sda1 für die erste Partition der Platte. Primäre Partitionen sind numeriert von sda1 bis sda3, logische Partitionen beginnen ab sda5.

[header=2.1.3 Partitionierung und Dateisysteme]

2.1.3 Partitionierung und Dateisysteme

Der Verzeichnisbaum kann sich über mehrere Partitionen einer Festplatte oder mehrerer Festplatten erstrecken. Wie bereits erwähnt, dient das Verzeichnis /mnt dazu, Dateisysteme oder Partitionen temporär für Wartungsarbeiten oder andere Zwecke einzubinden, also als Mountpoint.

Über fest definierte Mointpoints werden Partitionen permanent in den Verzeichnisbaum eingehängt. Dazu dient die Datei /etc/fstab, die beim Installieren des Betriebssystems angelegt wird. In ihr sind die unterschiedlichen Dateisysteme in eimem bestimmten Muster zusammengefasst, etwa:

#/etc/fstab: static file system information. 
#<file system> <mount point> <type> <options> <dump> <pass> 
proc      /proc          proc   defaults                   0 0 
/dev/sda1 /              ext3   defaults,errors=remount-ro 0 1
/dev/sda5 none           swap   sw                         0 0 
/dev/scd0 /media/cdrom0  udf,iso9660 user,noauto,exec      0 0
/dev/fd0  /media/floppy0 auto rw,user,noauto,exec          0 0

Programme, die fstab verwenden, haben allenfalls Leseberechtigung, beschrieben wird die Datei nur bei der Grundinstallation. Änderungen an fstab bleiben dem Systemadministrator vorbehalten. Er ist für die formelle Korrektheit der Einträge in fstab verantwortlich. Auch muss der Administrator die Reihenfolge beachten, in der bestimmte Einträge angelegt sind, da diese Einfluss auf die Programme mount, umount und fsck hat. Sie iterieren sequentiell über die einzelnen Einträge in der angegebenen Reihenfolge und führen entsprechend ihre Aufgaben aus.

Jedes Dateisystem wird in einer Zeile der Datei beschrieben. Leerzeichen oder Tabulatorzeichen in einer Zeile dienen als Spaltentrenner. Jede Spalte beschreibt eine spezielle Eigenschaft. Zeilen, die mit einem #-Zeichen beginnnen, werden als Kommentare interpretiert.

Die erste Spalter eines Eintrags (fs spec) spezifiziert das Dateisystem, dass gemountet werden soll:

  • den Dateinamen des blockorientierten Geräts, der mit mknod erzeugt wurde, z.B. /dev/sda1,
  • proc für das spezielle Verzeichnis /proc oder
  • ein entferntes Dateisystem unter Angabe des Zielrechners und des entfernten Verzeichnisses, bespielsweise example.com:/home/user im Format host:directory für NFS-Mounts oder //example.com/user im Format //host/sharename für das Mounten von Samba-Shares.

Alternativ kann im Falle von ext2- oder xfs-Dateisystemen anstelle des Dateinamens der zu mounten Partition oder des Geräts die UUID des Geräts oder das Label der Partition angegeben werden. Die UUID wird im Format UUID=uuid angegeben, beispielsweise für /dev/sda1:

UUID=6d8e8a4c-939e-498e-a10e-9133975a06a3  / ext3   
defaults,errors=remount-ro 0

Die UUID ist ein eindeutiger hexydezimaler Wert, der jeder verfügbaren Partition vom Linux-Kernel zugeordnet wird. Die Zuordnung findet sich im Verzeichnis /dev/disks/by-uuid:

$ ls -l /dev/disk/by-uuid/ 
insgesamt 0 
lrwxrwxrwx 1 root root 10 2007-02-12 19:18 
6d8e8a4c-939e-498e-a10e-9133975a06a3 -> ../../sda1 
lrwxrwxrwx 1 root root 10 2007-02-12 19:18 
fc02b7aa-20b6-46b0-b404-e01d51136782 -> ../../sda5 

Eine Referenzierung über das Partitions-Label erfolgt analog über das Format LABEL=label, etwa LABEL=boot. Die alternative Angabe über Label macht die Einträge in fstab robuster gegenüber Änderungen an der Hardware. Durch das Hinzufügen oder Entfernen von Festplatten ändert sich der unter Umständen der Dateiname des Geräts, wohingegen ein Label gleich bleibt. Welches Label eine Partition trägt, gibt der Befehl e2label aus (für ext2-Filesysteme):

# e2label /dev/sda1
ubuntu

In der zweiten Spalte (fs file) wird der Mountpoint angegeben. Für Swap-Partitionen muss hier none eingetragen werden. Falls der Verzeichnisname des Mountpoints Leerzeichen enthält, müssen diese mit durch 40 ersetzt werden.

Die dritte Spalte (fs_vfstype) beschreibt den Typ des Dateisystems. Unter Linux werden über 30 Dateisystemtypen unterstützt. Neben den Linux/Unix-nativen Filesystemen ext2, ext3 und reiserfs sind dies unter anderem ntfs und vfat für die Windows-Dateisysteme NTFS und FAT32 (bzw. FAT16) oder die Typen nfs und smbfs zum Mounten entfernter NFS- und Samba-Dateisystemen. Welche Typen genau von Ihrem Betriebssystem unterstützt werden, finden sie in der speziellen Datei /proc/filesystems.

Neben konkreten Filesystemtypen können unter fs_vfstype noch die Einträge swap und ignore vorgenommen werden. Der Eintrag swap addressiert eine Swap-Partition, Einträge mit ignore führen dazu, dass Programme die komplette Zeile beim Einlesen von fstab ignorieren. Die Angabe ignore ist somit sehr nützlich, um Mountpoints zu kennzeichnen, die gegenwärtig nicht genutzt werden.

In der vierten Spalte (fs_mntops) werden die Optionen angegeben, die beim Mounten verwendet werden. Die Angabe der Optionen erfolgt als Komma-separierte Liste und ist teils abhängig vom verwendeten Filesystem-Typ. Es muss mindestens ein Eintrag in der Liste stattfinden, der die Art des Mountens und eine spezifische Option für den jeweiligen Dateisystem-Typ beschreibt.

Allen Filesystemen gemeinsam sind die folgenden Optionen:

  • noauto: Das Filesystem wird nicht beim Aufruf von mount -a gemountet, z.B. beim Hochfahren des Betriebssystems.
  • user: Erlaubt es einem Benutzer außer dem Systemadministrator, das Dateilsystem zu mounten.
  • owner: Beschreibt, wem die Benutzerrechte über die Dateien im gemounteten Verzeichnis zugeordnet werden.
  • comment: Ein Kommentar, der bespielsweise für die (programmatische) Verwaltung von fstab verwendet werden kann.

Für Linuxdateisysteme fasst der Eintrag defaults die Standardoptionen für das Mounten an:

  • rw: Erlaubt den Lese- und Schreibzugriff auf Dateien im Filessystem.
  • suid: Erlaubt das Setzen von set-user– und set-group-Identifiern zum Festlegen von spezifischen Benutzerrechten für die Dateien im gemounteten Verzeichnis.
  • dev: Zeichen- und blockorientierte Geräte werden im angegebenen Dateisystem interpretiert.
  • exec: Erlaubt das Ausführen von Binärdateien (etwa Programmen)
  • auto: Das Filesystem wird automatisch beim Ausführen von mount -a gemountet.
  • nouser: Verbietet es regulären Benutzern, das Filsystem zu mounten.
  • async: Alle Ein- und Ausgabeoperationen auf dem Dateisystem erfolgen asynchron.

Die fünfte Spalte (fs_freq) wird für das Programm dump zum Anlegen von Backups verwendet. Falls der Wert 0 ist oder der Eintrag fehlt, wird die Ausführung von dump unterbunden.

Partitionen auf der Festplatte werden in regelmäßigen Anständen durch das Programm fsck überprüft. In der letzten Spalte (fs_passno) dient der Eintrag dem Programm zur Bestimmung, in welcher Reihenfolge Filesystem-Checks beim Booten des Systems erfolgen sollen. In der Zeile von fstab, die das Dateisystems des Wurzelverzeichnisses beschreibt, sollte hier der Wert 1 stehen. Anderen Filesystemen sollte der Wert 2 zugeordnet werden. Bei einem fälligen Dateisystem-Check wird dann das Wurzelverzeichnis zuerst überprüft. Falls der Eintrag in der Spalte fs_passno fehlt oder auf den Wert 0 gesetzt ist, nimmt fsck an, dass keine Überprüfung stattfinden soll.

2.1.4 Inodes

Dateien werden unter Linux, wie auf jedem anderen Unix-basiertem System, über so genannte Inodes („index nodes“) verwaltet (im Deutschen auch manchmal als Indexeintrag oder Informationsknoten bezeichnet). Ein Inode lässt sich über eine eindeutige ID für genau die Datei, die er verwaltet, identifizieren. Jede abgespeicherte Datei lässt sich also über Inodes erreichen.

Ein Inode speichert alle Basisinformationen über eine Datei in Form von Dateiattributen. Name und Inhalt der Datei selbst werden nicht gespeichert. Diese Dateiattribute sind im Einzelnen:

  1. Der Dateityp,
  2. die Zugriffsrechte,
  3. die Anzahl der Hardlinks (Referenzen) auf die Datei,
  4. der Besitzer,
  5. die besitzende Gruppe,
  6. die Größe der Datei in Bytes,
  7. die Datumsangaben ctime, atime und mtime und
  8. Verweise auf die Cluster der Datei, also den Speicherort der Datei auf der Festplatte.

Ein Inode ist damit selbst eine Art Datei, die alle wichtigen Informationen über die eigentlich adressierte Datei zusammenfasst.

Der Dateityp gibt an, ob es sich um eine gewöhnliche Datei, ein Verzeichnis, einen Link oder eine spezielle Datei (z.B. ein zeichen- oder blockorientiertes Gerät) handelt.

Die Zugriffsrechte der Datei sind, wie bereits erwähnt, für drei Rollen Besitzer, berechtigte Gruppe und Andere festgelegt. Jedes Zugriffsrecht definiert sich dabei durch die Operationen Lesen, Schreiben und Ausführen.

Die Anzahl der Hardlinks entspricht der Zahl der Verweise aus den Verzeichnissen auf die Datei (ein Hardlink ist der Dateiname). Da nicht der Dateiname, sondern die Anzahl der Hardlinks im Inode gespeichert sind, können mehrere Dateinamen auf einen Inode verweisen (Links). Jede Datei hat also einen Inode und in einem Inode können zugleich mehrere Verweise auf die Datei gespeichert sein. Zum Beispiel verweist ein leeres Verzeichnis immer auf dich selbst und auf das übergeordnete Verzeichnis.

Die Datumsangaben ctime, atime und mtime beschreiben jeweils das folgende Datum:

  • Datum der letzten Inode-Änderung (ctime, auch change time)
  • Datum des letzten Zugriffs auf die Datei (atime, auch access time) und
  • Datum der letzten Modifikation der Datei (mtime, auch modification time).

Links

Unter Linux bzw. Unix gibt es zwei Arten von Links: symbolische Links, so genannte Softlinks und harte Links (Hardlinks). Beide Varianten verweisen auf den Pfad einer anderen Datei.

Ein symbolischer Link ähnelt einer Verknüpfung unter Windows. Da referenziert lediglich die Zieldatei und kann deswegen auch auf Dateien oder Verzeichnisse verweisen, die auf einer anderen Partition liegen, als der Link selbst. Beim Anlegen eines Softlinks wird ein neuer Inode erstellt. Durch das Löschen der Zieldatei entsteht ein so genannter dangling link, ein Link, der ins Leere zeigt. Das Löschen eines Links führt nicht zum Löschen der Zieldatei.

Bei harten Links werden für Link und Zieldatei derselbe Inode verwendet, lediglich die  Pfadnamen unterscheidet sich. Da es sich um den gleichen Inode handelt, bleibt ein Hardlink gültig, wenn die Zieldatei gelöscht wird; jedoch können Hardlinks nicht partitionsübergreifend gesetzt werden. Wird ein Hardlink gelöscht, bleibt die Zieldatei bestehen.

Harte Links sind beschränkt auf Dateien. Nur dem Administrator root oder Benutzern mit administrativen Rechten ist es vorbehalten, Hardlinks auf Verzeichnisse zu setzen.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -