1.104.1 – Erzeugen von Partitionen und Dateisystemen

zurück zu 1.104 – Linux Dateisysteme
Prüfungskandidaten sollten in der Lage sein, Plattenpartitionen zu konfigurieren und Dateisysteme auf Medien wie Festplatten zu erzeugen. Dieses Lernziel beinhaltet verschiedene mkfs Kommandos zur Erzeugung von verschiedenen Dateisystemen auf Partitionen, einschließlich ext2, ext3, reiserfs, vfat und xfs.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

* fdisk
* mkfs

Wie in jedem Betriebssystem, so müssen Festplatten auch unter Linux vorbereitet werden, um vom System benutzt werden zu können. Die beiden Schritte, die nötig sind, sind

* Partitionieren einer Festplatte
* Dateisystem auf den Partitionen erstellen (unter DOS wird das “formatieren” genannt)

Für jede dieser beiden Aufgaben gibt es ein (bzw. mehrere) Programm(e) um sie zu bewältigen.
Partitionieren einer Festplatte mit fdisk
Eine neue Festplatte ist komplett leer. Damit ein beliebiges Betriebssystem auf die Platte zugreifen kann, müssen zunächst einmal bestimmte Bereiche auf der Platte angelegt werden, die das System nutzen kann – die sogenannten Partitionen. Selbst wenn eine Platte nicht unterteilt werden soll, also als ein Bereich genutzt werden soll, muß eine Partition erstellt werden.

Festplatten bestehen aus einer bis mehreren runden übereinanderliegenden Magnetscheiben, die in konzentrische Kreise (Spuren) eingeteilt werden. Alle übereinanderliegenden Spuren werden Zylinder genannt und gemeinsam angesprochen. Das liegt an der Tatsache, daß für jede Scheibenoberfläche ein Schreib/Lesekopf existiert. Alle diese Schreib/Leseköpfe sind starr miteinander verbunden. Wenn einer davon auf der Spur 5 seiner Plattenoberfläche ist, so sind alle anderen auch auf der Spur 5 jeweils ihrer Oberfläche. Daher werden Schreib- und Lesevorgänge immer auf allen untereinanderliegenden Spuren gleichzeitig durchgeführt. So entsteht der Begriff Zylinder, eben alle übereinanderliegenden Spuren.

Partitionen sind jetzt ringförmige Bereiche auf einer Platte. Eine Partition wird durch einen Start- und einen Endzylinder begrenzt. Der erste Zylinder (Zylinder 0) ist nie Teil einer Partition, sondern enthält Verwaltungsinformationen, wie den Master-Boot-Sektor und die Tabelle mit den Partitionsinformationen.

Wenn eine Platte z.B. 1024 Zylinder besitzt und in zwei Partitionen aufgeteilt werden soll, so entstünde etwa eine Aufteilung wie die folgende:

Partition Startzylinder Endzylinder
1 1 512
2 513 1023

Jede physikalische Festplatte kann bis zu vier sogenannte primäre Partitionen (primary partitions) aufnehmen. Das liegt daran, daß auf dem Zylinder 0 nur Platz gelassen wurde für vier Einträge in der Partitionstabelle (partition-table).

Eine dieser vier primären Partitionen darf eine sogenannte erweiterte Partition (extended partition) sein, die ihrerseits wieder behandelt wird, wie eine physikalische Festplatte und selbst wieder Unterpartitionen (logical partitions) aufnehmen kann. Linux kann bis zu 11 solcher logischer Partitionen pro erweiterter Partition verwalten.

Linux hat eine eindeutige Namenskonvention für Festplatten und Partitionen. Dabei wird unterschieden zwischen IDE- und SCSI-Festplatten. Die Namen für die IDE-Festplatten sind:

/dev/hda
Der Master des ersten IDE-Kanals
/dev/hdb
Der Slave des ersten IDE-Kanals
/dev/hdc
Der Master des zweiten IDE-Kanals
/dev/hdd
Der Slave des zweiten IDE-Kanals
/dev/hde
Der Master des dritten IDE-Kanals
/dev/hdf
Der Slave des dritten IDE-Kanals

SCSI-Festplatten werden der Reihe nach mit Buchstaben von a bis z durchnummeriert, zuerst alle Platten des ersten SCSI-Hostadapters, dann die des zweiten usw. Für jeden Hostadapter gilt, daß die Platten der Reihe nach durchnummeriert werden, die Platte mit der niedrigsten SCSI-ID zuerst, bis zur Platte mit der höchsten SCSI-ID. Der Name der SCSI-Platten beginnt immer mit /dev/sd. Also wäre die erste SCSI-Platte /dev/sda, die nächsten /dev/sdb, /dev/sdc usw.

Die Partitionen jeder Platte sind jetzt einfach als Nummern an diese Namen angehängt. Die primären Partitionen tragen die Nummern 1 bis 4, wobei eine dieser primären Partitionen – unabhängig von ihrer Nummer – eine erweiterte Partition sein kann. Die logischen Partitionen (Unterpartitionen) innerhalb der erweiterten Partition tragen die Nummern 5 bis 15. Daraus lassen sich also aus den Namen der Partitionen eindeutige Informationen gewinnen. Ein paar Beispiele:

/dev/hda1
Die erste primäre Partition des Masters des ersten IDE-Kanals
/dev/hdb5
Die erste logische Partition des Slaves des ersten IDE-Kanals

Wenn eine solche Bezeichnung also eine Nummer hat, so ist die jeweilige Partition angesprochen, wenn sie keine Nummer hat, so ist die ganze physikalische Platte gemeint.

Um jetzt eine bestimmte Platte zu partitionieren, müssen wir also zunächst einmal wissen, wie diese Platte heißt. Das Programm zum Partitionieren von Festplatten heißt fdisk und wird zusammen mit dem Namen der zu partitionierenden Platte aufgerufen. Wollen wir also auf der ersten SCSI-Festplatte im System (/dev/sda) Partitionen einrichten, so schreiben wir:

fdisk /dev/sda

Es erscheint zunächst mal die wenig aussagekräftige Zeile

Command (m for help):

Also drücken wir doch mal das m:

Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition’s system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

Command (m for help):

Für uns sind nur ein paar wenige dieser Befehle notwendig, insbesondere die folgenden:

a
Bootflag ein- und ausschalten. Manche Systeme, wie etwa DOS/Windows können nur von Partitionen booten, die den sogenannten Bootflag gesetzt haben oder – im DOS-Jargon – aktiviert sind. Linux benötigt diesen Flag überhaupt nicht.
d
Delete – Löschen einer Partition. Hier muß die jeweilige Partitionsnummer angegeben werden. Mit dem p-Befehl kann die Partitionstabelle angezeigt werden, die uns die gewünschte Nummer zeigt. Erweiterte Partitionen, die noch logische Partitionen enthalten können nicht gelöscht werden.
l
Liste aller Partitionstypen. Jede Partition hat eine hexadezimale Kenn-Nummer, die vom jeweiligen System gesetzt wird und dieser Partition einen bestimmten Typ zuweist. Linux benutzt dabei drei Kenn-Nummern, 82 für eine Swap-Partition (eine Erweiterung des Arbeitsspeichers), 83 für eine normale Linux-Plattenpartition und 8e für eine Partition des Logical Volume Managers.
n
Neue Partition anlegen. Wenn die Platte bisher keine erweiterte Partition besitzt, dann wird zunächst gefragt, ob eine primäre oder eine erweiterte Partition erstellt werden soll. Gibt es schon eine erweiterte Partition, so wird statt dessen nach primärer und logischer Partition gefragt. Existieren schon vier primäre Partitionen und eine davon ist eine erweiterte, dann fällt diese Frage weg, denn es können dann ja nur logische Partitionen angelegt werden.

Die nächste Frage ist die nach der Nummer der anzulegenden Partition und dann müssen Start- und Endzylinder angegeben werden. Statt einem End-Zylinder kann auch eine Größenangabe gemacht werden, die mit einem Pluszeichen (+) eingeleitet werden muß und einen Größenpostfix M oder K für Mega- oder Kilobyte besitzen darf. So bedeutet +256M eben eine Partitionsgröße von 256 Megabyte.
p
Print Partition-Table – Gibt die Partitionstabelle der Platte aus.
t
Wechselt den Typ der Partition. Hier kann dann einer der Typen angegeben werden, die mit dem l-Befehl angezeigt wurden.
q
Quit – Beendet das Programm ohne die vorgenommenen Änderungen tatsächlich vorzunehmen. Es bleibt also alles beim Alten.
w
Write Partition-Table – Schreibt die vorgenommenen Änderungen in die Partitionstabelle und beendet das Programm.

Mit diesen Befehlen sind alle denkbaren Aktionen durchzuführen, die wir für den Umgang mit Linux normalerweise brauchen. Wenn Sie allerdings nur die Partitionstabelle einer physikalischen Festplatte anzeigen wollen, so können Sie fdisk auch einfach mit dem Parameter -l aufrufen, dann zeigt es nur die Partitionstabelle des anfgegebenen Laufwerks (oder aller Laufwerke, wenn keines angegeben wurde) und beendet sich dann sofort wieder.
Erstellen eines Dateisystems mit mkfs und seinen Verwandten

Bevor eine Partition (oder eine Diskette) von Linux benutzt werden kann, muß zunächst ein Dateisystem erstellt werden. Das ist die gleiche Prozedur, die unter DOS/Windows “Formatieren” genannt wird. Das Prinzip eines Unix/Linux Dateisystems unterscheidet sich aber grundlegend von dem des DOS/Windows Dateisystems. So finden Sie hier zunächst einmal ein kurzen Überblick über den Aufbau von Unix-Inode-Systemen, dessen Verständnis im Folgenden vorausgesetzt wird, wenn wir im Einzelnen das Erstellen des Dateisystems besprechen. Dieses Verständnis wird insbesondere auch im nächsten Kapitel wichtig sein.

Das I-Node System

Unix-Dateisysteme sind nach einem anderen Prinzip aufgebaut, als etwa DOS-FAT-Systeme. Es gibt zwar viele verschiedene Dateisysteme unter Unix, gemeinsam haben sie jedoch eben das Prinzip der Funktionsweise. Und dieses Prinzip beruht auf den sogenannten I-Nodes.

Jede Partition enthält ein Dateisystem, dieses Dateisystem wiederum enthält eine Art Inhaltsverzeichnis, die I-Node-Liste. Die einzelnen Elemente der I-Node-Liste sind die Dateiköpfe, also die Orte wo Dateiattribute, Größe usw. gespeichert sind. Diese Dateiköpfe werden I-Nodes genannt.

Wie unter DOS auch, so verwalten Unix-Dateisysteme nicht zwangsläufig die Sektoren einer Festplattenpartition sondern Zuordnungseinheiten, die hier aber nicht Cluster sondern Block heißen. Beim Anlegen eines Dateisystems kann die Blockgröße angegeben werden, die auf dieser Partition verwendet werden soll. Typische Blockgrößen sind 512, 1024 oder 2048 Byte. Voreingestellt sind meist 1024 Byte pro Block.

Anders als unter DOS werden diese Blöcke aber nicht in einer Tabelle (FAT) zusammengefasst, sondern die I-Nodes enthalten selbst die Verweise auf diese Blöcke. Das Format eines typischen I-Nodes sieht etwa so aus:

Typ und Zugriffsrechte
Anzahl der Hardlinks
Benutzernummer (UID)
Gruppennummer (GID)
Größe der Datei in Bytes
Datum der letzten Veränderung (mtime)
Datum der letzten Statusänderung (ctime)
Datum des letzten Zugriffs (atime)
Adresse von Datenblock 0

Adresse von Datenblock 9
Adresse des ersten Indirektionsblocks
Adresse des Zweifach-Indirektionsblocks
Adresse des Dreifach Indirektionsblocks

Nach den Datumsfeldern stehen zehn Felder, die direkt die Adressen der Datenblöcke beinhalten können. Benutzt die Datei weniger Platz sind die Felder einfach leer.

Ist die Datei größer als 10 Blöcke (also größer als 10*1024 oder 10*2048 oder 10*512), so enthält das nächste Feld der I-Node eine Adresse eines Blockes, der wiederum bis zu 128 Adressen anderer Blöcke enthalten kann. Sollte das auch noch nicht ausreichen, so enthält der nächste I-Node-Eintrag eine Adresse eines Zweifach-Indirektionsblocks, eines Blocks, der bis zu 128 Adressen auf Blöcke mit wiederum 128 Adressen enthält. Und falls auch das noch zu wenig sein sollte, so enthält der nächste Eintrag die Adresse eines Blockes, der wiederum 128 Adressen von Zweifach-Indirektionsblöcken enthalten kann. Damit sind dann Dateigrößen von 1, 2 oder 4 Gigabyte (je nach Blockgröße von 512, 1024 oder 2048 Byte) möglich.

Zu beachten ist, daß der Dateiname nicht in der I-Node auftaucht. Die I-Node ist sozusagen nur die Referenz auf die Datenblöcke, die eine Datei benutzt und der Ort, an dem die Attribute wie Eigentümer, Gruppe, Größe und Zugriffsdaten gespeichert sind.

Je nach verwendetem Dateisystem liegt das Wurzelverzeichnis auf einer festgelegten I-Node, meist 1 oder 2. Grundsätzlich ist es aber dem Dateisystem bekannt, welche I-Node das Wurzelverzeichnis enthält.

Jedes Verzeichnis (Ordner, Directory) – auch das Wurzelverzeichnis ist unter Unix nichts anderes als eine Datei, deren Inhalt einfach die Dateinamen der enthaltenen Dateien samt ihren I-Node-Nummern enthält. Damit wird auch klar, warum Unix kein Problem mit Hard-Links hat, also mit Dateien mit mehreren Namen. Es handelt sich ja nur um verschiedene Namenseinträge, die eben die selbe I-Node-Nummer besitzen.

Das Standard Linux-Dateisystem ext2 hat zusätzlich zu den gezeigten I-Node Einträgen noch verschiedene andere, die das System in mancherlei Hinsicht noch leistungsfähiger macht. Für den Anwender ergenen sich dadrch keinerlei Veränderungen, in der Praxis sind aber einige positive Effekte feststellbar.

So benutzt das ext2 System beispielsweise bis zu 12 direkte Datenblockadressen, es hat noch ein zusätzliches Datumsfeld für das Datum des Löschens der Datei (für später zu entwickelnde Undelete-Funktion) und es bietet weitere Attribute, die hier nicht genauer dargestellt werden sollen weil das den allgemeinen Unix-Rahmen dieses Kurses sprengen würde.

Der Superblock

Ein Unix-Dateisystem besitzt einen sogenannten Superblock, einen Block, der die grundlegenden Informationen zum Dateisystem selbst enthält. Einige wichtige Daten des Superblocks sind:

* Die Größe des Dateisystems in Blöcken
* Die Größe der Blöcke in Bytes
* Zeiger auf den ersten freien Datenblock
* Zeiger auf erste freie I-Node
* Verschiedene Statusbits (Flags)

Auch hier unterscheiden sich die verschiedenen Unix-Dateisysteme voneinander, was an zusätzlichen Informationen im Superblock gespeichert ist. Das wesentliche an dieser Struktur ist, daß der Superblock beim Mounten eines Dateisystems in den Speicher gelesen wird und alle Veränderungen dort vorgenommen werden. Erst beim Wiederabhängen des Dateisystems werden diese Veränderungen physikalisch auf der Platte gespeichert. Das erklärt auch, daß es nach einem Systemabsturz zu Inkonsistenzen in einem Dateisystem kommen kann.

Noch vor dem Superblock steht der sogenannte Bootblock auf der Platte, der in etwa dem Bootsektor der DOS-Partitionen entspricht. Zusammengefasst kann man also ein Unix-Dateisystem etwa wie folgt darstellen:

pic

Der häufigste Dateisystemtyp unter Linux ist das Second Extended Filesystem oder kurz EXT2. Es unterscheidet sich in einzelnen Details vom Standard-Unix-Dateisystem, benutzt aber die selben Techniken, was I-Nodes angeht. Für das Verständnis der LPIC-Level1 Prüfung reicht das Wissen um diesen Standard. Für die speziell Interessierten findet sich hier noch Informationen über das EXT2 Filesystem:

Das EXT2 Dateisystem

Im Wesentlichen entspricht das Second Extended Filesystem (EXT2) von Linux dem Unix-Inode-System, das an anderer Stelle schon beschrieben wurde. Es gibt aber ein paar wesentliche Unterschiede, die hier kurz erläutert werden sollen.

Der Aufbau einer EXT2 Inode

Die wesentlichen Unterschiede des EXT2 Systems zum “normalen” I-Node-System liegen in der Struktur der I-Nodes selbst. Hier sind einige Felder hinzugekommen, die für bestimmte Erweiterungen vorgesehen wurden, die im folgenden genauer erklärt werden. Doch zunächst einmal die Struktur der Inode selbst:

permission links owner group
size creation time
modification time access time
deletion time blockcount
flags file version (NFS)
file ACL dir ACL
fragment addr. fr. size frag. nr reserved
1. block data 2. block data
3. block data 4. block data
5. block data 6. block data
7. block data 8. block data
9. block data 10. block data
11. block data 12. block data
simple indirect double indirect
triple indirect reserved
reserved reserved

Die wesentlichen Unterschiede zum bisher beschriebenen I-Node-System sind:

* Neben den drei Standard-POSIX-Zeitmarken (ctime, atime, mtime) gibt es hier eine vierte Zeitmarke, die die Löschzeit (deletion time) speichert. Das ist gedacht für Spezialprogramme zum Wiederherstellen versehentlich gelöschter Dateien.
* Ein Feld für flags ist hinzugekommen. Diese Flags ermöglichen es, daß Dateien bestimmte Eigenschaften bekommen, die weiter unten genauer beschrieben werden.
* Der Eintrag file version kann vom NFS-Server zur Unterscheidung verschiedener Versionen einer Datei verwendet werden.
* Zwei Einträge für eine erweiterte Zugriffskontrolle für Dateien (file ACL) und Verzeichnisse (dir ACL) sind hinzugekommen. ACL steht für Access Control List.
* Die Unterstützung fragmentierter Datenzonen ist vorgesehen.
* Es stehen 12 direkte Adressfelder für Datenblocks zur Verfügung.

Die Flags des EXT2 Filesystems

Jede Datei in einem EXT2 Dateisystem kann neben den normalen Unix-Zugriffsrechten noch einen Satz zusätzlicher Flags bekommen, die hier noch erläutert werden sollen. Um sich die Flags (oder auch Attribute) anzusehen, wird das Programm lsattr benutzt, zum Ändern der Attribute wird chattr benutzt. Es gibt die Attribute A,a,c,d,i,S,s und u.

* Wenn eine Datei mit gesetztem A-Attribut verändert wird, so wird das atime Feld nicht verändert.
* Eine Datei, die das a-Attribut gesetzt hat, kann nur im Append-Mode geöffnet werden. Das heißt, Daten können an diese Datei angehängt werden, bestehende Daten jedoch nicht gelöscht.
* Eine Datei mit dem c-Attribut wird automatisch vom Kernel komprimiert, bevor sie auf die Platte geschrieben wird. Wenn sie gelesen wird, dann entkomprimiert der Kernel die Datei wieder, ein Anwender merkt also nichts von der Kompression.
* Eine Datei mit gesetztem d-Attribut ist kein Kandidat für ein Backup mit dem dump Befehl.
* Eine Datei mit gesetztem i-Attribut kann nicht verändert werden, sie kann nicht gelöscht oder umbenannt werden, kein Link kann auf sie erstellt werden und keine Daten können in ihr verändert werden. Dieses Attribut kann nur vom Superuser gesetzt oder entfernt werden.
* Wenn eine Datei mit gesetztem s-Attribut gelöscht wird, dann werden die Bytes der Datei mit Nullen überschrieben. Ein sicheres Löschen, das keine Wiederherstellung erlaubt.
* Wenn eine Datei, deren S-Attribut gesetzt ist, verändert wird, dann wird diese Veränderung synchron auf die Platte geschrieben, ohne lange im Cache zu liegen.
* Wenn eine Datei mit gesetztem u-Attribut gelöscht wird, dann wird ihr Inhalt gesichert, so daß sie wiederhergestellt werden kann.

Erweiterungen des Superblocks

Der Superblock eines EXT2-Dateisystems enthält ein sogenanntes Valid-Flag. Sobald dieses Dateisystem gemountet wird, wird das Valid-Flag gelöscht. Erst beim Umount wird es wieder gesetzt. Sollte das System abstürzen, so bleibt das Valid-Flag ungesetzt – beim nächsten Start kann also erkannt werden, daß dieses Dateisystem nicht ordnungsgemäß abgehängt worden ist.

Das Programm zur Überprüfung eines EXT2 Dateisystems (e2fsck) überprüft dieses Valid-Flag und prüft (falls es nicht durch die -f Option gezwungen wurde) nur dann das Dateisystem, wenn das Valid-Flag nicht gesetzt war. So kann beim Systemstart einfach für jede Partition das e2fsck-Programm aufgerufen werden. Es wird nur dann aktiv, wenn es nötig ist.

Der Superblock enthält weiterhin eine Angabe über die maximale Anzahl von Mount-Vorgängen, die zwischen zwei System-Checks ablaufen dürfen. Jedesmal, wenn ein Dateisystem gemountet wird, wird ein Zähler (mount-count) um eins erhöht. Wird bei einem Systemstart festgestellt, daß der Wert des Zählers den Wert der maximalen Mountvorgänge überschreitet, so wird ein Systemcheck erzwungen.

Im Superblock steht noch eine Angabe, die festlegt, wieviel Prozent eines Dateisystems für den Superuser root reserviert wird. Standardmäßig sind es 5 Prozent.

Um diese Werte zu manipulieren steht das Programm tune2fs zur Verfügung. Dieses Programm sollte aber nur für Dateisysteme verwendet werden, die gerade nicht read-write gemountet sind!

Das Programm, mit dem wir Dateisysteme erstellen heißt mkfs (Make FileSystem) und ist eigentlich nur ein Frontend für weitere Programme, die dann für jedes Linux-Dateisystem extra zur Verfügung stehen, wie etwa mkfs.ext2, mkfs.minix, mkfs.msdos oder mkfs.xiafs.

Der grundsätzliche Aufruf von mkfs ist

mkfs [ -t Dateisystemtyp ] [ Optionen ] Gerätedatei [ Blocks ]

Dabei sind die Optionen abhängig vom verwendeten Dateisystemtyp. Wird der Dateisystemtyp weggelassen wird heutzutage EXT2 angenommen, aber darauf gibt es keine Garantie. Werden die Blocks weggelassen, so werden alle zur Verfügung stehenden Blocks verwendet.

Das Programm zur Erstellung von EXT2-Dateisystemen kennt die folgenden wichtigen Parameter:

-b Blockgröße
Spezifiziert die Größe der Blocks in Byte. Gültige Größen sind 1024, 2048 und 4096.
-c
Checkt das Gerät nach schlechten Blocks ab, bevor das Dateisystem erstellt wird.
-i Bytes-Per_Inode
Stellt das Verhältnis von Plattenplatz zur Menge der Inodes ein. Je größer der angegebene Wert ist, um so weniger Inodes werden erstellt. Dieser Wert sollte grundsätzlich kleiner als die Blockgröße des Dateisystems sein.
-N Anzahl der Inodes
Gibt die absolute Anzahl der zu erstellenden Inodes an. Wird anstatt des -i Parameters verwendet bzw. überschreibt dessen Einstellungen.

In der Regel ist es ausreichend, ein Dateisystem mit den Standard-Parametern anzulegen, also einfach gar keine Parameter anzugeben. ein einfaches

mkfs /dev/hdb5

legt ein solches Dateisystem auf der Partition 5 der zweiten IDE-Platte an. In Ausnahmefällen ist es aber notwendig, bestimmte Parameter zu verändern. So werden beispielsweise beim Anlegen eines EXT2-Dateisystems auf einer Diskette nur 184 Inodes angelegt. Normalerweise würde das sicher auch reichen, um die 1,44 MByte Diskettenplatz aufzuteilen. Wenn wir aber etwa eine Bootdiskette erstellen wollen, die schon alleine hunderte von Gerätedateien im /dev-Verzeichnis braucht, ist diese Einstellung definitiv nicht brauchbar. Hier müssten wir also mit dem -N Parameter manuell die Anzahl der zu erstellenden Inodes hochsetzen.

Explizites Anlegen eines EXT2- oder EXT3-Dateisystems
Um sicherzugehen, daß tatsächlich ein Dateisystem des Typs EXT2 (second extended) oder seine Erweiterung zum Journaling Dateisystem (ext3) erzeugt wird, muß entweder der Dateisystemtyp mit der Option -t ext2 angegeben werden, oder es wird gleich das entsprechende Programm mke2fs aufgerufen.

Mit diesem Programm können beide Dateisystemtypen erzeugt werden. Um ein Journaling-Dateisystem vom Typ ext3 zu erzeugen muß der Parameter -j (journaling) mit angegeben werden.

Anstatt mke2fs kann auch mkfs.ext2 oder mkfs.ext3 angegeben werden.
Explizites Anlegen eines Reiser-Dateisystems
Wenn ein Dateisystem des Typs REISERFS angelegt werden soll, so muß dem mkfs-Programm der Parameter -t reiserfs angegeben werden, oder es wird das Programm mkreiserfs direkt aufgerufen.

Anstatt mkreiserfs kann auch mkfs.reiserfs angegeben werden.

Eine explizite Angabe der anzulegenden Inodes entfällt bei dieser Dateisystemart, weil das Reiserfs die Inodes dynamisch anlegt, je nach Bedarf.
Explizites Anlegen eines XFS-Dateisystems
Wenn ein Dateisystem des Typs XFS angelegt werden soll, so muß dem mkfs-Programm der Parameter -t xfs angegeben werden, oder es wird das Programm mkfs.xfs direkt aufgerufen.
Explizites Anlegen eines VFAT-Dateisystems
Wenn ein Dateisystem des Typs VFAT (Windows Dateisystem) angelegt werden soll, so muß dem mkfs-Programm der Parameter -t vfat angegeben werden, oder es wird das Programm mkdosfs direkt aufgerufen.

Anstatt mkdosfs kann auch mkfs.vfat angegeben werden.

1.104 Journaling Dateisysteme

zurück zu 1.104 – Linux Dateisysteme
Ein großer Nachteil der traditionellen Unix-Dateisysteme ist die interne Verwaltung von Dateisysteminformationen. Der Superblock eines Dateisystems wird beim Mounten des Dateisystems in den Arbeitsspeicher geladen und alle Veränderungen des Superblocks werden dort vorgenommen. Die eigentlichen Veränderungen am Dateisystem (Anlegen, Verändern oder Löschen von Dateien) werden aber tatsächlich minütlich auf der Platte vorgenommen. Erst beim Abhängen des Dateisystems (in der Regel beim Herunterfahren) wird der im Speicher liegende Superblock physikalisch auf die Platte geschrieben.

Dieser Mechanismus spart zwar Zeit, weil Zugriffe auf den Arbeitsspeicher wesentlich schneller erledigt werden können, als Zugriffe auf die Platte, aber er birgt große Risiken. Wenn ein solches Dateisystem nicht korrekt abgehängt wird, etwa bei einem Systemabsturz oder Stromausfall, dann kann der aktuelle Superblock nicht mehr auf die Platte geschrieben werden. Der Zustand des Dateisystems ist dann inkonsistent, das bedeutet, daß der Superblock nicht mehr die tatsächliche aktuelle Situation des Dateisystems beschreibt, sondern die, die das Dateisystem beim vorletzten Mounten aufwies.

Linux reagiert auf diese Inkonsistenz mit einem erzwungenen Dateisystemcheck beim Booten, wenn das System merkt, daß eine Platte nicht korrekt abgehängt wurde. Dieser Systemchek kann – je nach Partitionsgröße – sehr lange dauern und im schlimmsten Fall einen manuellen Eingriff erfordert. Das bedeutet, daß ein abgestürzter Server lange nicht mehr zur Verfügung steht und eventuell sogar nicht mehr automatisch wieder hochfährt.

Um dieses Problem zu lösen, wurden moderne Dateisysteme mit einem neuen Mechanismus ausgestattet, dem Journaling. Dabei wird jede Transaktion zwischen dem System und der Platte in einem Journal mitprotokolliert, so daß nach einem Absturz in sehr kurzer Zeit wieder ein konsistenter Zustand hergestellt werden kann. Das bedeutet nicht, daß alle Daten wiederhergestellt werden können, die durch den Absturz womöglich verlorengingen, sondern nur, daß es zu keiner Diskrepanz zwischen Superblock und Dateisystem kommen kann.

Dazu wird beim Systemstart – falls es zu einem Absturz gekommen war – das Journal gelesen und die darin enthaltenen Transaktionen werden quasi Stück für Stück rückgängig gemacht, bis es wieder zu einem konsistenten Zustand kommt. Dieser Vorgang kann wesentlich schneller ausgeführt werden, als ein Dateisystemcheck eines herkömmlichen Dateisystems, weil nicht die ganze Platte überprüft werden muß. Die Dauer ist auch nicht abhängig von der Größe der Partition.

Linux bietet heute mehrere Dateisystemtypen an, die das Journaling beherrschen. Bemerkenswert sind dabei die folgenden:

Ext3fs
Ext3fs ist nicht wie der Name vermuten ließe ein echter Nachfolger von Ext2fs, dem Standard-Dateisystem unter Linux. Ext3fs ist vielmehr eine Erweiterung von Ext2fs, da sich am Dateisystem so gut wie nichts entscheidendes zum “Vorgänger” verändert hat. Die Erweiterung beschränkt sich – etwas übertrieben gesagt – im wesentlichen auf das Hinzufügen einer Datei – dem Logfile. Das Ziel bei der Entwicklung von Ext3fs war es mit minimalen Änderungen eine komplette Lösung zu finden, die das Journaling unterstützt. Hierfür wurde dann eine Kopie des Ext2fs-Quellcodes gemacht und eine textuelle Ersetzung durchgeführt mit der “ext2” durch “ext3” ersetzt wurde. Hinzugefügt wurde dann eine vom Dateisystem selbst völlig unabhängige Schicht die das Journaling übernimmt. Das Dateisystem selber hat nichts mit dem Journaling zu tun. Die einzige Änderung die das System hinter sich hat ist, dass es jede Aktion die Schreibend auf die Festplatte zugreift in eine Transaktion packt. D.h. es wird der Journaling-Schicht mitgeteilt, welche Blöcke innerhalb einer Transaktion geändert werden sollen. Den Rest übernimmt dann die neue Journaling-Schicht.

ReiserFS
Beim Dateisystem des Hans Reiser werden im Journal alle Metadatenänderungen protokolliert, die mehr als einen Block betreffen. Bei einem Systemabsturz ist also lediglich sichergestellt, dass das System sehr schnell wieder in einen konsistenten zustand gesetzt wird. Datenverluste kann es weiterhin geben, da ja “nur” die Metadaten im Journal gesichert werden.

Die Datenstruktur wird hier in einem B*-Baum gespeichert. In den Blättern werden vier verschiedene Arten von Datensätzen gespeichert:

* direkte Datensätze: Alle kleinen Dateien (< 1 Block) werden direkt im Baum gespeichert. (Eine 10 Zeichen große Datei landet bei Ext2fs in einem Block von z.B. 1024 Bytes) Hierdurch wird Plattenplatz und ein zusätzlicher Plattenzugriff gespart
* indirekte Datensätze: Hier werden Zeiger auf größere Dateien, die dann außerhalb des Baumes liegen, gespeichert
* Verzeichnisse: Enthält die einzelnen Einträge eines Verzeichnisses
* stat data: Was Ext2fs in Inodes speichert wird hier direkt im Baum gespeichert.

Jeder Datensatz besitzt einen eindeutigen Schlüssel (Hashfunktion), der zum Sortieren und Wiederfinden benutzt wird. Durch die Verwaltung des Baumes (ausbalancieren beim Hinzufügen bzw. Löschen von Einträgen) nimmt das Speichern etwas mehr Rechenzeit in Anspruch als der einfache Mechanismus beim ext2.

XFS
XFS ist eine Portierung des Dateisystems von IRIX, das bereits seit langem auf den bekannten Grafik-Workstations und Servern von Silicon-Graphics läuft. Die Version 1.0 erschien am 1.Mai 2001. Da es in diesem Bereich besonders auf Sicherheit und Geschwindigkeit ankommt ist XFS besonders für große Dateien ausgelegt. Wenn man bedenkt, dass Dateien bis zu 9.000 PByte groß sein können (zur Information die Reihenfolge: Kilo-, Mega-, Giga-, Terra-, Peta-, Exa-Byte).

Die technischen Details füllen ganze Seiten. Zu erwähnen wäre z.B. dass mit dem plattformübergreifenden xfsdump/xfsrestore sogar Dumps von IRIX nach Linux transferiert werden können.

1.104 – Das EXT2 Dateisystem

zurück zu 1.104 – Linux Dateisysteme
Im Wesentlichen entspricht das Second Extended Filesystem (EXT2) von Linux dem Unix-Inode-System, das an anderer Stelle schon beschrieben wurde. Es gibt aber ein paar wesentliche Unterschiede, die hier kurz erläutert werden sollen.

Der Aufbau einer EXT2 Inode
Die wesentlichen Unterschiede des EXT2 Systems zum “normalen” I-Node-System liegen in der Struktur der I-Nodes selbst. Hier sind einige Felder hinzugekommen, die für bestimmte Erweiterungen vorgesehen wurden, die im folgenden genauer erklärt werden. Doch zunächst einmal die Struktur der Inode selbst:

permission links owner group
size creation time
modification time access time
deletion time blockcount
flags file version (NFS)
file ACL dir ACL
fragment addr. fr. size frag. nr reserved
1. block data 2. block data
3. block data 4. block data
5. block data 6. block data
7. block data 8. block data
9. block data 10. block data
11. block data 12. block data
simple indirect double indirect
triple indirect reserved
reserved reserved

Die wesentlichen Unterschiede zum bisher beschriebenen I-Node-System sind:

* Neben den drei Standard-POSIX-Zeitmarken (ctime, atime, mtime) gibt es hier eine vierte Zeitmarke, die die Löschzeit (deletion time) speichert. Das ist gedacht für Spezialprogramme zum Wiederherstellen versehentlich gelöschter Dateien.
* Ein Feld für flags ist hinzugekommen. Diese Flags ermöglichen es, daß Dateien bestimmte Eigenschaften bekommen, die weiter unten genauer beschrieben werden.
* Der Eintrag file version kann vom NFS-Server zur Unterscheidung verschiedener Versionen einer Datei verwendet werden.
* Zwei Einträge für eine erweiterte Zugriffskontrolle für Dateien (file ACL) und Verzeichnisse (dir ACL) sind hinzugekommen. ACL steht für Access Control List.
* Die Unterstützung fragmentierter Datenzonen ist vorgesehen.
* Es stehen 12 direkte Adressfelder für Datenblocks zur Verfügung.

Die Flags des EXT2 Filesystems
Jede Datei in einem EXT2 Dateisystem kann neben den normalen Unix-Zugriffsrechten noch einen Satz zusätzlicher Flags bekommen, die hier noch erläutert werden sollen. Um sich die Flags (oder auch Attribute) anzusehen, wird das Programm lsattr benutzt, zum Ändern der Attribute wird chattr benutzt. Es gibt die Attribute A,a,c,d,i,S,s und u.

* Wenn eine Datei mit gesetztem A-Attribut verändert wird, so wird das atime Feld nicht verändert.
* Eine Datei, die das a-Attribut gesetzt hat, kann nur im Append-Mode geöffnet werden. Das heißt, Daten können an diese Datei angehängt werden, bestehende Daten jedoch nicht gelöscht.
* Eine Datei mit dem c-Attribut wird automatisch vom Kernel komprimiert, bevor sie auf die Platte geschrieben wird. Wenn sie gelesen wird, dann entkomprimiert der Kernel die Datei wieder, ein Anwender merkt also nichts von der Kompression.
* Eine Datei mit gesetztem d-Attribut ist kein Kandidat für ein Backup mit dem dump Befehl.
* Eine Datei mit gesetztem i-Attribut kann nicht verändert werden, sie kann nicht gelöscht oder umbenannt werden, kein Link kann auf sie erstellt werden und keine Daten können in ihr verändert werden. Dieses Attribut kann nur vom Superuser gesetzt oder entfernt werden.
* Wenn eine Datei mit gesetztem s-Attribut gelöscht wird, dann werden die Bytes der Datei mit Nullen überschrieben. Ein sicheres Löschen, das keine Wiederherstellung erlaubt.
* Wenn eine Datei, deren S-Attribut gesetzt ist, verändert wird, dann wird diese Veränderung synchron auf die Platte geschrieben, ohne lange im Cache zu liegen.
* Wenn eine Datei mit gesetztem u-Attribut gelöscht wird, dann wird ihr Inhalt gesichert, so daß sie wiederhergestellt werden kann.

Erweiterungen des Superblocks
Der Superblock eines EXT2-Dateisystems enthält ein sogenanntes Valid-Flag. Sobald dieses Dateisystem gemountet wird, wird das Valid-Flag gelöscht. Erst beim Umount wird es wieder gesetzt. Sollte das System abstürzen, so bleibt das Valid-Flag ungesetzt – beim nächsten Start kann also erkannt werden, daß dieses Dateisystem nicht ordnungsgemäß abgehängt worden ist.

Das Programm zur Überprüfung eines EXT2 Dateisystems (e2fsck) überprüft dieses Valid-Flag und prüft (falls es nicht durch die -f Option gezwungen wurde) nur dann das Dateisystem, wenn das Valid-Flag nicht gesetzt war. So kann beim Systemstart einfach für jede Partition das e2fsck-Programm aufgerufen werden. Es wird nur dann aktiv, wenn es nötig ist.

Der Superblock enthält weiterhin eine Angabe über die maximale Anzahl von Mount-Vorgängen, die zwischen zwei System-Checks ablaufen dürfen. Jedesmal, wenn ein Dateisystem gemountet wird, wird ein Zähler (mount-count) um eins erhöht. Wird bei einem Systemstart festgestellt, daß der Wert des Zählers den Wert der maximalen Mountvorgänge überschreitet, so wird ein Systemcheck erzwungen.

Im Superblock steht noch eine Angabe, die festlegt, wieviel Prozent eines Dateisystems für den Superuser root reserviert wird. Standardmäßig sind es 5 Prozent.

Um diese Werte zu manipulieren steht das Programm tune2fs zur Verfügung. Dieses Programm sollte aber nur für Dateisysteme verwendet werden, die gerade nicht read-write gemountet sind!