Auffinden von Systemdateien und Platzieren von Dateien am richtigen Ort

Wichtung: 5

Beschreibung: Die Kandidaten sollen mit dem Filesystem Hierarchy Standard (FHS) genau vertraut sein, einschließlich der typischen Speicherorte von Dateien
und der Einteilung von Verzeichnissen.

Wichtigste Wissensgebiete:
Kenntnisse der richtigen Speicherorte von Dateien nach Maßgabe des FHS.
Auffinden von Dateien und Befehlen in einem Linux-System.
Wissen um Speicherort und Aufgabe wichtiger Dateien und Verzeichnisse gemäß FHS.

Liste wichtiger Dateien, Verzeichnisse und Anwendungen:
find
locate
slocate
updatedb
whereis
which
/etc/updatedb.conf

Linux Verzeichnis-Struktur: Filesystem Hierarchy Standard (FHS)

Um auf allen Linux-Distributionen einen Standard für die Verzeichnis-Struktur festzulegen, wurde der Filesystem Hierarchy Standard (FHS) eingeführt. Somit ist die Struktur der Verzeichnisse und Dateien vorgeschrieben und auf allen Linux-Distributionen wie Suse, Debian oder Gentoo nahezu identisch. Administratoren finden sich schnell auf allen Linux-Systemen zurecht und können zügig durch die Dateistrukturen navigieren.

Der FHS gruppiert Dateien in zwei „Dateiarten“: die erste Gruppe sind die „shareable files“, also Dateien, die auch anderen Anwendern im Netzwerk zur Verfügung stehen können, in der Regel nicht verändert werden und daher nur lesend zur Verfügung gestellt werden. Daher werden diese Dateien auch statische Dateien genannt. Zu diesen Dateien gehören Binärdateien, Bibliotheken oder Dokumentationen. Diese Dateien werden normalerweise in den Verzeichnissen /usr, /etc, /opt, /boot usw. abgelegt. Auf die statischen Dateien reicht in der Regel ein Nur-Lese-Zugriff.

„Unshareable Files“ werden anderen Anwendern und Programmen nicht zur Verfügung gestellt. Variable Dateien werden regelmäßig geändert. Beispiele für variable Dateien sind Log-, E-Mail- oder Drucker-Dateien.

Wurzelverzeichnis: /

Damit das System booten und administrative Aufgaben erledigen kann, muss es auf bestimmte Verzeichnisse und Dateien im Wurzelverzeichnis, also direkt unter / vorfinden. Somit ist das System bzw. der Administrator in der Lage, Reperaturen, Diagnosen und Wiederherstellungsversuche durchzuführen. Folgende Verzeichnisse (oder symbolische Links auf Verzeichnisse) müssen in einem FHS-kompatiblen Dateisystem im Wurzelverzeichnis vorhanden sein:

Dateien auf einer Partition

Es ist möglich, Linux-Verzeichnisse auf verschiedene Partitionen und Laufwerke zu verteilen. So macht es zum Beispiel Sinn, das /home Laufwerk auf einer separaten Partition zu legen, damit Anwender das komplette Linux-System nicht „voll laufen lassen“ können. Außerdem ist es möglich, Verzeichnisse beispielsweise auf einer anderen Festplatte im System oder gar auf einem Netzlaufwerk zu legen.

Man kann aber nicht alle Verzeichnisse beliebig auf andere Partitionen, Festplatten oder Laufwerke legen. Einige Verzeichnisse müssen zwingend auf einer gemeinsamen Partition befinden, da sie Dateien und Programme enthalten, welche beim Booten bzw. Systemstart benötigt werden. Dies sind die Verzeichnisse /bin, /sbin, /etc, /dev, /lib und, falls vorhanden, auch /root. Die anderen Verzeichnisse können sich auf anderen Partitionen befinden und werden dann beim Booten gemountet.

Das /bin Verzeichnis: grundlegende Systembefehle (für alle Benutzer)

/bin enthält alle Befehle, die sowohl vom Administrator als auch vom Benutzer aufgerufen werden können und auch dann benötigt werden, wenn keine anderen Dateisysteme eingehängt sind (z.B. im Single User Mode). Darüber hinaus können auch Skripte, die solche Befehle verwenden, dort abgelegt werden.

Das Verzeichnis /bin darf keine Unterverzeichnisse enthalten! Folgende Programme oder symbolische Links auf die Unix-Kommandos werden in /bin mindestens benötigt:

/boot: Daten zum Booten

In diesem Verzeichnis werden alle Dateien abgelegt, welcher der Bootloader wie Grub oder Lilo benötigt.

/dev: Gerätedateien

In dem Verzeichnis /dev befinden sich Spezial-Dateien (special file) oder Gerätedateien (device file). So findet man in diesem Verzeichnis die Gerätedateien von Festplatten (hda, hdb, etc), von CD-Laufwerken, Modems, usw.

/etc : Konfigurationsdateien

In dem /etc Verzeichnis findet man Konfigurationsdateien zu vielen wichtigen Anwendungen und Programmen. Hier die wichtigsten Beispiele:

/home: Benutzerverzeichnisse

Das Homeverzeichnis ist laut FHS optional, also auf einem FHS kompatiblen System nicht zwingend erforderlich. Trotzdem findet man auf nahezu jedem Linux-System das /home Verzeichnis, in denen benutzerspezifische Konfigurationsdateien und Daten Platz finden.

/lib: Kernel-Module / Bibliotheken

Das Verzeichnis /lib steht für library und beinhaltet die installierten dynamischen Bibliotheken und Kernel-Module, die zum Starten des Systems und für die Programme in /bin und /sbin benötigt werden. Das Unterverzeichnis modules beinhaltet die oben genannten Kernel-Module, falls diese installiert sind.

/mnt: temporärer Einhängepunkt für Dateisysteme

Das Verzeichnis dient zum kurzzeitigen Einhängen von Dateisystemen.

/media: Einhängepunkt für Wechseldatenträger

Dieses Verzeichnis wird dazu genutzt, um portable Wechsel-Datenträger wie externe USB-Festplatten, USB-Sticks, usw. einzuhängen.

/opt: zusätzliche Softwarepakete

Dies ist ein Verzeichnis für zusätzliche Software. Oftmals werden Spiele in diesem Verzeichnis gespeichert.

/sbin: Systembefehle des Administrators

Das Verzeichnis /bin wurde bereits erläutert. Auf Programme in /bin dürfen auch Benutzer zugreifen. Programme, die sich aber in /sbin aufhalten, dürfen nur vom Systemadministrator durchgeführt werden. Beispiele: shutdown, fastboot, fasthalt, fdisk, fsck,, getty, halt, ifconfig, init, mkfs, reboot, route, swapon, swapoff, update

/srv : Daten, die von Diensten angeboten werden

In /srv sollen Daten von Diensten abgelegt werden, die von dem System angeboten werden. Darunter fallen beispielsweise die Daten vom Webserver (bsp. Apache), E-Mail-, FTP- oder File-Server.

/tmp : temporäre Dateien

Verzeichnis für temporäre Dateien.

Das Verzeichnis /usr

/usr steht für unix system resources und nicht wie einige Linux-Anwender meinen für „User“ oder ähnliches. Dieses Verzeichis kann von mehreren Rechnern gemeinsam verwendet werden und ist somit „shareable“. Hier einige wichtige Verzeichnisse in /usr:

/usr/bin : Benutzerbefehle

In diesem Verzeichnis befinden sich die meisten Programme, welche die Benutzer ausführen dürfen. Hier findet man auch die ausführbaren Dateien der installierten Anwenderprogramme wie Firefox, GIMP, vim, usw.

/usr/include : Header-Dateien

Die Header-Dateien enthalten die verschiedenen Include-Dateien mit Prototypdefinitionen.

/usr/lib : Bibliotheken

Modularer Programmcode, welcher von verschiedenen Programmen geteilt wird.

/usr/local : lokal installierte Programme

Diese Hierarchie ist nach der grundlegenden Installation leer und dient als Platz für weitere Programme. Die meisten Installationsprogramme von zusätzlicher Software verwenden dieses Verzeichnis.

/usr/local/<programmname> enthält die Dateien des Programms, während in /usr/local/bin und /usr/local/lib meistens Links zu den Binärpaketen und Bibliotheken zu finden sind.

/usr/sbin : weitere Systembefehle

Weitere Systembefehle für den Administrator. Diese werden aber nicht für den Boot-Vorgang gebraucht.

Das Verzeichnis /var

Das /var-Verzeichnis steht für variable Daten, die sich während des Betriebs regelmäßig ändern oder die neu angelegt bzw. gelöscht werden

Programme finden mit which, whereis und type

Die Programme which, whereis und type werden dazu genutzt, um Programme ausfindig zu machen. Dabei werden aber nur die Pfade durchsucht, die in der Umgebungsvariablen $PATH zu finden sind. Diese werden also ohnehin von der Shell erkannt.

which = Gibt den vollen Pfad des gefundenen Programms zurück
type = Zeigt etwas mehr Informationen als which
which = Findet neben den Programmdateien auch Handbuchseiten und den Quellcode.

updatedb - Zentrale "Such"-Datenbank

Der Befehl updatedb scannt das gesamte System und schreibt die Pfade sämtlicher Dateien in eine Datenbank. Mit dem Program locate ist es dann möglich, nach Dateien zu suchen. Da das Scannen durch updatedb ziemlich viele Ressourcen in Anspruch nimmt, sollte man updatedb nachts bei wenig Traffic laufen lassen.

find - Dateien unter Linux finden

find ist das universelle Tool, um Dateien und Verzeichnisse auf einem Linux-System zu finden. Wird find ohne Parameter aufgerufen, so werden alle Dateien und Verzeichnisse aus dem aktuellen Verzeichnis durchsucht. Doch find ist ein sehr mächtiges Tool.


find durchsucht Verzeichnisse nach Dateien, indem bestimmte Suchmuster festgelegt werden. Die Dateien werden dann anhand bestimmter Eigenschaften (Dateiname, Erstellungsdatum, usw.) gefunden. Anschließend führt find bestimmte Aktionen aus.

Syntax: find [Verzeichnis] [-Option ...] [-Test ...] [-Aktion ...]

find arbeitet nun nach folgendem Prinzip: Die Optionen, Tests und Aktionen werden bei jeder Datei angewandt. Sofern das Ergebnis wahr ist, also alles zutrifft, so wird die Aktion bei dieser Datei angewandt (und wenn es nur die Anzeige des Pfades auf dem Monitor ist. Dieses entspricht quasi dem Suchtreffer).

Optionen bzw. Tests werden immer mit einem einem `-', einer Klammer `(', `)', einem Komma `,' oder einem Ausrufezeichen `!' eingeleitet. Darauffolgend kommt die Aktion, die auf die gefundene Datei angewandt werden soll.

find benutzt standardmäßig das aktuelle Verzeichnis, sofern kein anderes Verzeichnis angegeben wurde

p>Beispiele:
find / -name "*auer" = Findet alle Dateien, die auf auer enden (Bauer, Mauer, etc)
find /bios -size 256k = Findet alle Dateien, die genau 256 KB groß sind
find . -size +256k -name "Award*" -exec cp {} /AwardBios \; = Findet alle Dateien, die genau 256 KB groß und mit Award beginnen. Anschließend werden diese nach /AwardBios kopiert
find / -nouser -exec rm {} \; = Löschen aller Dateien, dessen Anwender nicht mehr existieren

Optionen:
-daystart = Eigenschaften vom Beginn des aktuellen Tages anstelle der letzten 24 Stunden
-depth = bearbeitet den Inhalt jedes Verzeichnisses vor dem Verzeichnis selbst
-follow = symbolische Links werden miteingeschlossen
-maxdepth Ebenen = maximale Verzeichnistiefe
-mindepth Ebenen = minimale Verzeichnistiefe
-noleaf = erzwingt die Bearbeitung aller Verzeichniseinträge, auch Hardlinks, etc.
-version = Anzeige der Version
-xdev = durchsucht keine Verzeichnisse in anderen Dateisystemen bzw Partitionen

Tests:
+N = steht für alle Zahlen größer als N
-N = steht für alle Zahlen kleiner als N
N = steht für genau N

-amin 5 = Letzter Zugriff vor 5 Minuten
-anewer Referenzdatei = auf die Datei ist vor weniger Zeit zugegriffen worden, als seit der letzten Veränderung der Referenzdatei vergangen ist
-atime 5 = Letzter Zugriff vor 5 Tagen
-cmin 5 = Ändern des Status einer Datei vor 5 Minuten
-cnewer Referenzdatei = der Status der Datei wurde vor weniger Zeit verändert, als seit der letzten Veränderung der Referenzdatei vergangen ist
-ctime N = Ändern des Status einer Datei vor 5 Tagen
-empty = die reguläre Datei oder das Verzeichnis ist leer
-false = ist immer falsch
-fstype Typ = Dateisystem
-gid N = Angehörigkeit der Gruppe mit der Kennzahl N
-group Name = Angehörigkeit der Gruppe "Name"
-inum N = die Datei belegt die Inode mit der Nummer N
-links N = die Datei hat N (harte) Links
-lname Muster = die Datei ist ein symbolischer Link
-mmin 5 = der Inhalt der Datei wurde vor 5 Minuten verändert
-mtime 5 = der Inhalt der Datei wurde vor 5 Tagen verändert
-name xyz = der Name der Datei ist xyz
-newer Referenzdatei = die Datei ist später verändert worden als die Referenzdatei
-nouser = die Datei gehört keinem im System eingetragenen Benutzer
-nogroup = die Datei gehört keiner im System angemeldeten Gruppe
-path xyz = der Pfadname der Datei xyz
-regex Muster = Dateien mittels reguläre Ausdrücke finden
size N[{c,k}] = Datei nach Größe suchen
-true = ist immer wahr
-type xyz = die Datei ist vom Typ xyz

Es gibt folgende Typen:
   b = blockorientiertes Gerät
   c = zeichenorientiertes Gerät
   d = Verzeichnis
   p = Pipeline
   f = normale Datei
   l = symbolischer Link
   s = Socket

-uid 132 = UID des Eigentümers
-used 5 = auf die Datei ist 5 Tage nach der letzten Änderung zugegriffen worden
-user hans = die Datei gehört dem Anwender hans

Aktionen:
-exec Kommando ; = führt das Kommando aus; die Aktion ist wahr, wenn das Kommando einen Status von Null liefert;
-fprint test.txt = schreibt den Pfadnamen der getesteten Datei in test.txt
-fprint0 test.txt = schreibt den Namen der getesteten Datei in test.txt
-ok Kommando ; = wie `-exec', vor der Ausführung des Kommandos wird aber noch eine Bestätigung erwartet
-print = Anzeige des vollständigen Pfadnamen
-prune = wahr, wenn die Option `-depth' gesetzt ist; sonst falsch
-ls = zeigt die gefundene Datei im Format von `ls -dils' an

Operatoren:
(Ausdruck) = Zusammenfassung der Ausdruck zu einer Operation
! Ausdruck = ist wahr, wenn der Ausdruck falsch ist
-not Ausdruck = ist wahr, wenn der Ausdruck falsch ist
Ausdruck1 Ausdruck2 = UND Verknüpfung
Ausdruck1 -a Ausdruck2 = UND Verknüpfung
Ausdruck1 -and Ausdruck2 = UND Verknüpfung
Ausdruck1 -o Ausdruck2 = ODER Verknüpfung
Ausdruck1 -or Ausdruck2 = ODER Verknüpfung