\documentclass{lxarticle}
\usepackage{german}
\usepackage[utf8]{inputenc}
\usepackage{lxheaders}
\usepackage{lxextras}

\begin{document}

\section*{Struktur eines Linux-Dateisystems}

\subsection*{Root-Filesystem}

Der Aufbau eines Linux-Systems wird im Wesentlichen durch die
\emph{Linux Standard Base (LSB)} bestimmt. Diese Vorgabe wurde Anfang 2004
von einer Arbeitsgruppe der Linux Foundation vorgelegt und Ende 2004 von der
ISO als Norm ISO/IEC 23360 akzeptiert.

Bei der Struktur des Dateisystems bezieht sich LSB auf den allgemeineren
\emph{Filesystem Hierarchy Standard (FHS)}, der auch für andere Unix-Systeme
gilt. Die meisten heutigen Linux-Distributionen halten sich an diese Vorgaben.
Auf Embedded Devices werden gelegentlich Vereinfachungen und Abänderungen
vorgenommen. Das ist legitim, sollte aber nur gemacht werden, wenn es gute
Gründe dafür gibt. Denn der Grund für diese Standards ist, dass sich ein
Unix-erfahrener Benutzer möglichst schnell auf jedem System zurechtfindet.
Es ist lästig, wenn man Konfigurationsdateien erst lange suchen muss, weil
sie sich nicht im üblichen Verzeichnis befinden.

\begin{figure}[h]
\centering
\includegraphics[height=0.5\textwidth]{images/ordnerbaum-600px.png}
\caption{Verzeichnisstruktur eines Linux-Systems}
\label{img:rootfs}
\end{figure}

Abbildung \ref{img:rootfs} zeigt einen möglichen Verzeichnisbaum für ein
Linux-System. Das oberste Verzeichnis hat als Name nur einen Schrägstrich
(\cmd{/}). Es wird als Wurzel- oder root-Verzeichnis bezeichnet. Vorsicht,
nicht mit dem Benutzer \cmd{root} oder seinem Homeverzeichnis \cmd{/root}
verwechseln!

Die gängigsten Verzeichnisse haben folgende Inhalte:

\begin{itemize}
\item \cmd{/boot}: Dateien des Bootloaders, evtl. Kernel
\item \cmd{/bin}: grundlegende ausführbare Dateien
\item \cmd{/dev}: Gerätedateien
\item \cmd{/etc}: Konfigurationsdateien
\item \cmd{/home}: Benutzerverzeichnisse
\item \cmd{/lib}: Kernel-Module und dynamische Bibliotheken
\item \cmd{/mnt}: optional, temporärer Einhängepunkt für Dateisysteme
\item \cmd{/opt}: zusätzliche Softwarepakete
\item \cmd{/root}: Home-Verzeichnis des Benutzers root
\item \cmd{/sbin}: wichtige Systembefehle, vorwiegend zur Benutzung durch root
\item \cmd{/tmp}: temporäre Dateien)
\item \cmd{/usr}: 2. Verzeichnisebene, nicht für den Bootvorgang benötigte
			Programme und Dateien
\item \cmd{/var}: variable Daten, wie z.B. Log-Dateien
\end{itemize}

Besondere Erwähnung verdienen die Verzeichnisse \cmd{/sys} und \cmd{/proc},
die normalerweise virtuelle Dateisysteme des Kernels beinhalten (siehe
nächsten Abschnitt).

\subsection*{Der \cmd{mount}-Befehl}

Ein Verzeichnisbaum wie oben gezeigt kann auf den verschiedensten
Datenträgern existieren. Es ist nur wichtig, dass das auf dem Datenträger
befindliche Dateisystem Gerätedateien und symbolische Links beherrscht. Aus
diesem Grund eignen sich veraltete Dateisysteme wie FAT nicht für ein
Linux-Rootfilesystem. Falls ein USB-Stick oder eine SD-Karte ein
Root-Filesystem enthalten sollen, müssen sie erst mit einem geeigneten
Dateisystem wie ext2 versehen werden.

Der Linux-Kernel kann sein Root-Filesystem von nahezu jeder beliebigen
Quelle beziehen. Dazu gehören beliebige Partitionen auf Festplatten,
USB-Geräten, SD-Karten, Flash-Chips und Ähnlichem. Das Root-Filesystem
kann sogar auf einem anderen Rechner liegen, wenn dieser es über das
Netzwerk per NFS veröffentlicht.

Der Bootloader muss dem Kernel mitteilen, wo das gewünschte Root-Filesystem
liegt. Dies geschieht über die Kernel-Commandline durch Anweisungen, die
etwa so aussehen:

\begin{itemize}
\item \cmd{root=/dev/hda1} (erste Partition einer IDE-Festplatte)
\item \cmd{root=/dev/mmcblk0p1} (erste Partition einer SD-Karte)
\item \cmd{root=/dev/nfs nfsroot=192.168.0.3:/rfs} (per NFS von anderem Rechner)
\end{itemize}

Die genauen Gerätenamen sind teilweise Architektur-spezifisch und müssen
von Fall zu Fall ermittelt werden.

Wenn der Kernel seine Initialisierungsarbeiten beendet hat, versucht er, das
bis dahin noch undefinierte Wurzelverzeichnis mit dem angegebenen
Root-Filesystem zu initialisieren. Über das bis dahin leere Verzeichnis ``/''
erhält man dann Zugriff auf die Dateien des Rootfilesystems.

Diesen Vorgang, bei dem ein Dateisystem einem Verzeichnis zugewiesen wird,
nennt man \emph{mount}.

Der Kernel selbst sorgt zunächst nur dafür, dass das Wurzelverzeichnis
initialisiert wird. Alle weiteren mount-Vorgänge werden durch Startskripte
oder einen Benutzer ausgelöst.

Eine Besonderheit stellen dabei virtuelle Dateisysteme dar. Sie existieren
nicht physikalisch auf einem Datenträger, sondern es werden bei jeder Anfrage
die angeforderten Informationen über Verzeichnisse, Dateien und deren Inhalt
vom Kernel dynamisch generiert.

Ein Beispiel dafür ist das Dateisystem sysfs, das Kernel-Informationen
über Treiber, Systemzustände und vieles mehr bereitstellt. Es wird
üblicherweise auf das Verzeichnis \cmd{/sys} im Root-Filesystem gemountet.

Dies kann so geschehen, beispielsweise in einem Bootskript:

\begin{verbatim}
mount -t sysfs sysfs /sys
\end{verbatim}

Eine andere Möglichkeit ist das Eintragen dieser mount-Vorgabe in die Datei
\cmd{/etc/fstab}. Dort würde man eine Zeile der Form

\begin{verbatim}
sysfs /sys sysfs defaults 0 0
\end{verbatim}

eintragen. Ein Startskript kann dann einfach \cmd{mount -a} aufrufen, was
alle in \cmd{/etc/fstab} gelisteten Dateisysteme mountet.

Ein weiteres derartiges virtuelles Dateisystem ist procfs, das standardmäßig
auf \cmd{/proc} gemountet wird. Es liefert ebenfalls Informationen aus dem
Kernel, allerdings handelt es sich dabei im Unterschied zum sysfs nicht um
einzelne Werte, sondern meist um längere Texte. Probieren Sie beispielsweise
folgende Befehle aus:

\lstset{backgroundcolor=\color[gray]{0.92}, basicstyle=\ttfamily\small}
\begin{lstlisting}
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/interrupts
\end{lstlisting}

\subsection*{Zugriffsrechte}

Da Unix vom Design her ein Multiuser-Betriebssystem ist, bestand von Anfang
an die Forderung nach einer Regelung der Benutzerrechte. Jeder Benutzer kann
gleichzeitig mehreren Benutzergruppen angehören. Jede Datei gehört einem
Eigentümer und einer Gruppe. Mit der Datei verknüpft sind ausserdem Flags, die
angeben, welche Rechte der Eigentümer, Angehörige der Gruppe und sonstige
Benutzer haben. Es werden Lese-, Schreib- und Ausführungsrechte unterschieden.

\begin{figure}[h]
\centering
\includegraphics[width=0.5\textwidth]{images/Zugriffsrechte.png}
\caption{Unix-Flags für Zugriffsrechte}
\label{img:accessflags}
\end{figure}

Abbildung \ref{img:accessflags} zeigt diese Flags, manchmal auch
``Rechte-Maske'' genannt. Der Befehl \cmd{ls -l} zeigt diese Flags an. Mit
Hilfe des Befehls \cmd{groups} kann man herausfinden, welchen Gruppen man
angehört.

\newpage

\subsection*{Kontrollfragen}

\begin{enumerate}
\item Warum ist es wichtig, dass bestimmte Dateien an einem standardisierten
	Platz im Root-Filesystem liegen?
\item Welche Möglichkeiten zum Mounten von Dateisystemen kennen Sie?
\item Welche Bedingungen müssen erfüllt sein, damit Sie eine ausführbare
	Datei tatsächlich starten dürfen?
\end{enumerate}

\end{document}
