\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}