![]() ![]() ![]() |
![]() ![]() |
Bevor wir uns in den Details des Linux-Dateisystems verfangen, verschaffen wir uns einen Überlick über den prinzipiellen Aufbau eines jeden Unix-Dateisystems.
Generell werden die Verwaltungsinformationen von den eigentlichen Daten getrennt. Die Verwaltungsdaten werden in so genannten Information Nodes - kurz Inodes - gehalten, deren vereinfachten Aufbau diese Abbildung zeigt.
Jede Datei (und das gilt für jeden Dateityp) wird durch genau einen Inode
repräsentiert. Innerhalb einer Partition besitzt jeder Inode eine eindeutige Nummer.
Abbildung: Speicherung der Dateien mit Hilfe von Inodes.
Im Laufe der Installation wird auf jeder Partition ein Dateisystem angelegt. Alle Unix-Dateisysteme lassen sich in das in dieser Abbildung skizzierte Schema einordnen.
Bootblock | Der erste Block jeder Partition kann einen Bootloader (zum Start eines Betriebssystems) enthalten, er wird beim Einschalten des Rechners vom BIOS gelesen. Dieser Block existiert bei allen Dateisystemen. |
Superblock | Hier stehen Informationen zum Typ und internen Aufbau des Dateisystems. Der Inhalt ist also systemabhängig. |
Inode-Blöcke |
Im einfachsten Fall stehen alle Inodes hintereinander auf der Platte. Ist die Datei sehr klein (<= 60 Bytes), werden ihre Daten direkt im Inode gespeichert, ansonsten verweist ein Eintrag im Inode auf einen (oder mehrere) Datenblock, in dem nun der Inhalt der Datei gespeichert wird. Reichen die in einem Inode referenzierten Blöcke (maximal 12) für eine Datei nicht aus, zeigt ein Eintrag im Inode auf einen (oder mehrere) Datenblock, welcher nun die eigentlichen Verweise zu den Datenblöcken beinhaltet. Man spricht von einem einfach indirekten Block. |
Daten-Blöcke |
Gehört ein Block zu einer normalen Datei, dann stehen hier die Daten zu dieser. Gehört der Block zu einem Verzeichniseintrag, so enthält er den Inhalt des Verzeichnisses, also eine Tabelle aus Dateinamen und zugehöriger Inode. Ein Datenblock lässt (aus Sicht des Systems) keinen Rückschluss auf den zugehörigen Inode zu. Da die Blockgröße festliegt, wird im Falle, dass die Dateigröße diese nicht erreicht, Plattenplatz verschwendet. In Anbetracht der durchschnittlichen Dateigrößen in einem Unix-System hat sich 4096 Byte als optimale Blockgröße herausgestellt. Wählt man einen kleineren Wert, erhöht sich zwar die mittlere Auslastung der einzelnen Blöcke, allerdings benötigt man ggf. mehr indirekte Datenblöcke (sowie im konkreten Falle des Linux-Dateisystems größere Bitmaps). |
Schauen wir uns nun die Einteilung einer Partition im ext2
an:
Scheinbar besitzt das ext2
keinerlei Änlichkeit mit herkömmlichen Unix-Dateisystemen. Abgesehen vom
Bootblock, aber über diesen verfügt bekanntlich jedes Dateisystem. Aber das täuscht... Vergleichen wir einmal die
Struktur einer Gruppe mit dem Unix-Prinzip:
Superblock, Inode-Tabelle und Datenblöcke sind hier enthalten. Aber der Reihe nach:
Superblock | Die Superblöcke der einzelnen Gruppen sind exakte Kopien des Superblockes aus Gruppe 0. Er enthält in einer 1024 Bytes großen Struktur alle wichtigen Informationen zum Dateisystem, wie die Anzahl von Inodes und Datenblöcken (gesamt/frei), Blockgröße der Datenblöcke (ein Inode ist immer 128 Byte groß), Zeitpunkt des letzten Mountens, Zähler der Anzahl der Mountvorgänge, Status, Zeit der letzten Überprüfung usw. |
Gruppendeskriptoren | Hier wurde zusätzliche Sicherheit eingebaut. Die Deskriptoren enthalten alle notwendigen Informationen zu allen anderen Gruppen, um diese nach einem Defekt restaurieren zu können. Sind in einer Gruppe also die Verwaltungsinformationen (Superblock, Gruppendeskriptoren oder Bitmaps) zerstört worden, können diese repariert werden und die Daten sind weiterhin verfügbar. |
Bitmaps | Sie dienen dem schnellen Auffinden von freien Inode/Datenblöcken. Ihre Größe entspricht der Datenblockgröße und beschränkt die Anzahl der Datenblöcke einer Gruppe (bei einer Blockgröße von 4096 Bytes sind es somit 32768). |
Inodetabelle / Datenblöcke | Hier gilt das schon in der allgemeinen Beschreibung Gesagte. |
Aber warum haben die ext2
Entwickler sich für eine solch komplizierte Struktur entschieden?
Weil die entscheidende Bremse auf heutigen Festplatten die Bewegung der Schreib-Lese-Köpfe darstellt. Die gewählte Aufteilung stellt nun sicher, dass die Datenblöcke relativ nahe bei den zugehörigen Inodes liegen. Also muss der Schreib-Lese-Kopf nicht erst wild über die Platte eilen. Darüber hinaus wird ebenso versucht, die Inodes der Dateien nahe dem zugehörigen Verzeichnis-Inode zu halten. Und beim Allokieren von Speicher für eine neue Datei werden vorsorglich gleich mehrere (hintereinander liegende) Datenblöcke reserviert, obwohl sie womöglich niemals benötigt werden (beim Schließen der Datei oder bei Bedarf werden alle vorgemerkten, aber nicht benötigten Blöcke freigegeben).
![]() ![]() ![]() |
![]() ![]() |