Dateisystem

Transcription

Dateisystem
Teil III
Dateisystem
95
Aufbau und Management des Dateisystems
6
Aufbau und Management des Dateisystems
In diesem Kapitel lernen Sie Folgendes:
• Festplatten zu partitionieren (LPI Lernziel 1.102.1)
• Den Aufbau des Linux-Dateisystems kennen (LPI Lernziele 1.102.1, 1.102.2)
• Dateisysteme mit mkfs zu erstellen (LPI Lernziel 1.104.1)
• Dateisysteme manuell einzuhängen (zu mounten) (LPI Lernziel 1.104.3)
• Dateisysteme beim Hochfahren des Rechners automatisch einhängen zu lassen
(LPI Lernziel 1.104.3)
• Dateisysteme auszuhängen (LPI Lernziel 1.104.3)
• Eine Dateisystem-Überprüfung (Filesystem-Check) durchzuführen (LPI Lernziel 1.104.2)
Wenn man Linux auf einen frischen“ PC und nur für den Hausgebrauch installieren
”
will, reicht es meistens, die bei den großen“ Distributionen (Fedora/RedHat, SuSE)
”
angebotenen Standardinstallationen auszuwählen.
Möchte man aber Linux parallel zu einem anderen Betriebssystem auf demselben
Rechner installieren, oder hat man einen Server, mit mehreren Festplatten, dann ist es
wichtig, sich vorher mit Partitionierung, Aufbau und Management des Dateisystems
zu befassen.
In diesem Kapitel werden deshalb die Grundlagen zum Verständnis und für den Umgang mit Filesystemen erläutert.
6.1 Partitionierung mit fdisk
Will man aus einem bestehenden Linux-System heraus oder aus einem Rettungssystem
heraus eine Platte umpartitionieren, so benutzt man das Linux-Standard-Partitionierungstool
fdisk:
Syntax:
fdisk /dev/Platte
Dann bekommt man ein Auswahlmenü angezeigt, m dient als Hilfekommando, mit
dessen Hilfe man sich mit den Funktionen des Programms vertraut machen kann.
96
6.1 Partitionierung mit fdisk
e
b`
➴h
Partitionierung einer Platte mit fdisk
1. Wir wollen die Festplatte /dev/sda so partitionieren, daß ein rudimentäres LinuxSystem mit Swap-Partition darauf Platz hat. Zuerst verschaffen wir uns daher
einen Überblick über die schon vorhandenen Partitionen:
# fdisk -l /dev/sda
Festplatte /dev/sda: 64 Köpfe, 32 Sektoren, 1021 Zylinder
Einheiten: Zylinder mit 2048 * 512 Bytes
Gerät Booten
/dev/sda1
*
Anfang
1
Ende
1021
Blöcke
1045488
ID
83
Dateisystemtyp
Linux
Tip: Die Option -l listet die Partitionstabelle der Platte auf, ohne daß wir das
Programm interaktiv benutzen müssen.
2. Nun wollen wir die Partition löschen. Dazu starten wir jetzt fdisk in der interaktiven Variante:
# fdisk /dev/sda
Befehl (m für Hilfe): p
Festplatte /dev/sda: 64 Köpfe, 32 Sektoren, 1021 Zylinder
Einheiten: Zylinder mit 2048 * 512 Bytes
Gerät Booten
/dev/sda1
*
Anfang
1
Ende
1021
Blöcke
1045488
ID
83
Dateisystemtyp
Linux
Befehl (m für Hilfe): d
Partitionsnummer (1-4): 1
Befehl (m für Hilfe): p
Festplatte /dev/sda: 64 Köpfe, 32 Sektoren, 1021 Zylinder
Einheiten: Zylinder mit 2048 * 512 Bytes
97
Aufbau und Management des Dateisystems
Gerät Booten
Anfang
Ende
Blöcke
ID
Dateisystemtyp
Wir haben nun mit dem d-Befehl (delete) die Partition gel öscht. Der p-Befehl
listet die Partitionstabelle auf.
Hinweis: Bis jetzt hat sich die tatsächliche Partitionierung der Platte noch nicht
geändert. Die Änderungen werden erst wirksam, wenn man die Partitionstabelle
schreibt!
3. Nun legen wir eine neue Linux-Partition an:
Befehl (m für Hilfe): n
Befehl Aktion
e
Erweiterte Partition
p
Primäre Partition (1-4)
p
Partitionsnummer (1-4): 1
Erster Zylinder (1-1021) [Standardwert: 1]: 1
Letzter Zylinder oder +Größe, +GrößeK oder +GrößeM (1-1021)
[Standardwert: 1021]: +900M
Befehl (m für Hilfe): p
Festplatte /dev/sda: 64 Köpfe, 32 Sektoren, 1021 Zylinder
Einheiten: Zylinder mit 2048 * 512 Bytes
Gerät Booten
/dev/sda1
Anfang
1
Ende
901
Blöcke
922608
ID
83
Dateisystemtyp
Linux
Mit dem n-Befehl wird eine neue Partition angelegt. Da bis zu vier primäre Partitionen möglich sind, nehmen wir eine primäre Partition mit p. Wir können dann
die Partitionsgrenze angeben. Die Platte besteht laut Ausgabe aus 1021 Zylindern. Unsere Partition soll am Anfang der Platte, also bei Zylinder 1 anfangen.
Das Ende geben wir nun in MB relativ zum Partitionsanfang an: +900M besagt,
daß der Endzylinder so berechnet werden soll, daß die Partition etwa 900MB
groß wird. Alternativ können wir aber auch eine Zylindernummer angeben.
Als Resultat entstand eine Partition vom Typ 83, eine reinrassige Linux-Partition.
4. Nun legen wir unsere Swap-Partition an: Sie soll den Rest in Anspruch nehmen,
deswegen geben wir die Partitionsgrenzen als Zylindernummern an:
98
Z
6.1 Partitionierung mit fdisk
Befehl (m für Hilfe): n
Befehl Aktion
e
Erweiterte Partition
p
Primäre Partition (1-4)
p
Partitionsnummer (1-4): 2
Erster Zylinder (902-1021) [Standardwert: 902]: 902
Letzter Zylinder oder +Größe, +GrößeK oder +GrößeM (902-1021)
[Standardwert: 1021]: 1021
Befehl (m für Hilfe): p
Festplatte /dev/sda: 64 Köpfe, 32 Sektoren, 1021 Zylinder
Einheiten: Zylinder mit 2048 * 512 Bytes
Gerät Booten
/dev/sda1
/dev/sda2
Anfang
1
902
Ende
901
1021
Blöcke
922608
122880
ID
83
83
Dateisystemtyp
Linux
Linux
5. Schließlich müssen wir noch den Partitionstyp auf Nummer 82 setzen, um die
Partition als Auslagerungspartition zu markieren.
Befehl (m für Hilfe): t
Partitionsnummer (1-4): 2
Hexadezimalcode (L eingeben, um eine Liste anzuzeigen): L
0
1
2
3
4
5
6
7
8
9
a
b
c
e
f
10
Leer
FAT12
XENIX root
XENIX usr
FAT16 <32M
Erweiterte
FAT16
HPFS/NTFS
AIX
AIX bootfähig
OS/2 Bootmanage
Win95 FAT32
Win95 FAT32 (LB
Win95 FAT16 (LB
Win95 Erw. (LBA
OPUS
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
5c
61
63
64
65
70
75
80
81
82
83
84
85
86
87
8e
Priam Edisk
SpeedStor
GNU HURD / SysV
Novell Netware
Novell Netware
DiskSecure Mult
PC/IX
Altes Minix
Minix / altes L
Linux (Auslager
Linux
OS/2 verst. Lau
Linux erweitert
NTFS-Datenträge
NTFS-Datenträge
Linux LVM
a5
a6
a7
b7
b8
c1
c4
c6
c7
db
e1
e3
e4
eb
f1
f4
BSD/386
OpenBSD
NeXTSTEP
BSDI-Dateisyste
BSDI-Auslagerun
DRDOS/sec (FATDRDOS/sec (FATDRDOS/sec (FATSyrinx
CP/M / CTOS / .
DOS-Zugriff
DOS R/O
SpeedStor
BeOS-Dateisyste
SpeedStor
SpeedStor
99
Aufbau und Management des Dateisystems
11 Verst. FAT12
... 93 Amoeba
f2 DOS sekundär
12 Compaq Diagnost ... 94 Amoeba BBT
fd Linux-RAID, aut
14 Verst. FAT16 <3 ... 9f BSD/OS
fe LANstep
16 Verst. FAT16
... a0 IBM Thinkpad-Sc ff BBT
17 Verst. ... HPFS/NTF
Hexadezimalcode (L eingeben, um eine Liste anzuzeigen): 82
Der Dateisystemtyp der Partition 2 ist nun 82 (Linux (Auslagerung))
6. Schließlich schreiben wir die Partitionstabelle auf Platte.
Befehl (m für Hilfe): w
Die Partitionstabelle wurde geändert!
ioctl() wird aufgerufen, um die Partitionstabelle erneut zu lesen.
WARNUNG: Wenn Sie DOS 6.x-Partitionen angelegt oder
geändert haben, finden Sie weitere Informationen in
der Handbuchseite für fdisk (Befehl: ’man fdisk’).
Datenträger werden synchronisiert.
Distributions-Spezifische Tools für des Partitionieren Unter Fedora/RedHat- und
SuSE-Linux gibt es auch komfortable grafische Tools für das Partitionieren der Festplatte. Unter Fedora/RedHat verwendet man während der Installation den Disk-Druid.
SuSE liefert ein YaST -Modul. Bei YaST findet sich dieses unter System→Partitionieren.
6.2 Das Dateisystem
6.2.1
Bestandteile eines Dateisystems
Lars Wirzenius (s. Literaturliste) definiert ein Filesystem als die Methoden und Datenstrukturen, die ein Betriebssystem benutzt, um die Dateien auf einer Platte oder
Partition zu verwalten, also die Art und Weise, durch welche die Dateien auf der Platte
organisiert sind.
Linux enthält standardmäßig bereits mehrere Module, die den Zugriff auf verschiedene
Dateisysteme aus anderen Betriebssystemen erlauben und ist dadurch sehr flexibel. F ür
den normalen Anwender bleibt es i. d. R. völlig transparent, ob die Datei, die er gerade
bearbeitet, auf einer lokalen Linux-Partition oder etwa auf einem Server im Netzwerk
liegt.
Dies wird durch ein sogenanntes Virtuelles Filesystem“ erreicht, eine Schnittstelle,
”
die dem Benutzer (und den Anwendungsprogrammen) sämtliche eingebundenen Medien in einem einzigen Dateibaum präsentiert.
100
6.2 Das Dateisystem
Unterhalb der Filesystemtreiber liegt der Buffer Cache“, der sämtliche I/O-Anforderungen
”
puffert und so für eine bessere Performance sorgt.
!
Achtung: Wegen des Buffer Cache darf ein Linux-System niemals einfach ausgeschaltet werden, da z. B. Daten, die sich noch im Schreibpuffer befinden, dann verloren
gehen können.
Dateisysteme unter Linux
Shell/Applikationen
VFS
msdos
ext2
iso9660
nfs
Buffer Cache
Gerätetreiber
Hardware
6.2.2
Von Linux unterstützte Dateisysteme
Hier einige der wichtigsten von Linux unterstützten Dateisysteme. Der Zugriff auf
diese (bereits bestehenden) Dateisysteme erfolgt über das mount-Kommando (s. Abschnitt 6.3). Allerdings lassen sich einige dieser Systeme unter Linux auch erzeugen.
minix: Dies ist eigentlich ein veraltetes Dateisystem, welches noch aus der Zeit vor
Linux stammt, als es bereits Unix-ähnliche Systeme für PCs gab. Es wurde bei
den ersten Linux-Versionen verwendet, und ab und zu auch heute noch, z. B. f ür
Bootdisketten.
ext2: Das Second Extended File System“ ist das Standardfilesystem unter Linux. Es
”
ähnelt dem Berkeley File System, bietet aber einige nützliche Erweiterungen wie
etwa das Setzen von Dateiattributen.
101
Aufbau und Management des Dateisystems
ext3: Eine Weiterentwicklung von ext2, welche um Journaling erweitert wurde (schnelle Wiederherstellung bei Ausfall). Ansonsten ist es vollständig abwärtskompatibel zu ext2. Es ist daher möglich, aus einer bestehenden ext2-Partition im
Handumdrehen eine ext3-Partition zu machen.
reiserfs Ein von Hans Reiser entwickeltes alternatives Dateisystem. Die Datenorganisation baut auf schnellen B-Trees auf und es ist Journaling-fähig, was den
unliebsame Filesystem-Checks fast überflüssig macht. Es ist derzeit stabil und
im Produktionsumfeld einsetzbar.
xfs, jfs von SGI und IBM entwickelte Journaling-Dateisysteme f ür den Einsatz im
Unternehmensumfeld.
sysv, bsd: Diese erlauben den Zugriff auch auf Medien, die unter System V oder Berkeley Systemen erstellt wurden.
ufs Das UNIX-Filesystem. Es wird bei vielen UNIX-Abkömmlingen wie zum Beispiel Solaris verwendet.
msdos: Zugriff auf DOS-FAT16-Partitionen
vfat: Zugriff auf DOS-FAT16 und FAT32-Partitionen
umsdos: Erweiterung des MS-DOS-Filesystemtreibers. Dieser erlaubt die Verwendung langer Dateinamen, von Dateirechten u. ä. auf einer DOS-Partition. Dieses
Dateisystem wird gerne für Testinstallationen verwendet, da man ein bestehendes DOS-System nicht erst umpartitionieren muß.
iso9660: Standard-CD-ROM-Dateisystem incl. Rock Ridge Extensions.
hpfs: Für OS/2-Partitionen
ntfs: Für Partitionen mit Windows-NT-Filesystem
nfs: Netzwerkfilesystem; erlaubt den Zugriff auf freigegebene Verzeichnisse anderer
Rechner über das Netzwerk.
proc: Dies ist ein Pseudo-Filesystem (belegt keinerlei Plattenplatz), welches die Darstellung von Prozessen und einiger Systeminterna in Dateiform erlaubt, z. B.
zeigt cat /proc/filesystems, welche Filesystemtreiber geladen sind, oder
cat /proc/version liefert die aktuelle Kernelversion.
Im Folgenden werden noch einige der wesentlichen Eigenschaften und grundlegenden
Strukturen des ext2-Filesystems erläutert:
Im Gegensatz zur File Allocation Table (FAT) unter DOS, die, wie der Name schon
sagt, lediglich eine Tabelle der Dateibelegung darstellt, wird durch die Formatierung
mit dem ext2-Filesystem die Partition in Blockgruppen aufgeteilt:
102
6.2 Das Dateisystem
Bootblock
Blockgruppe
n
Blockgruppe Blockgruppe . . .
1
2
Jede dieser Blockgruppen enthält die gleiche Struktur:
Superblock
FS Descriptors
Inode
Bitmap
Block
Bitmap
Inode
Table
Data
Blocks
Der Superblock enthält wesentliche Informationen über die Struktur selbst und über
das komplette Filesystem (z.B. wieviele Gruppen es gibt, und wie oft dieses Filesystem bereits montiert wurde), dann folgt eine Beschreibung und Verwaltungsdaten der
jeweiligen Gruppen und die Block- bzw. Inode-Bitmap. Dies sind Tabellen, in denen
festgehalten ist, welche Datenblöcke und Inodes auf der Partition benutzt oder frei
sind. Schließlich folgen die Inode-Tabelle (alle Inodes der Gruppe) und die Datenblöcke in der jeweiligen Gruppe.
(Fast) Jede Gruppe enthält also eine Kopie des Superblocks mit den wesentlichen Informationen über das Filesystem, was erheblich zur Sicherheit des Filesystems beiträgt.
✎
Beispiel: Suchen Sie sich mit df -h eine ext2/3-Partition und lassen Sie sich die
Dateisystemstruktur mit dem Kommando dumpe2fs Partition anzeigen. Versuchen Sie dabei die gerade erläuterte Struktur wiederzufinden (Superblock, Blockgruppen, etc.). In welchen Blockgruppen können Sie Kopien des Superblocks entdecken?
Was aber ist ein Inode? Streng genommen besteht eine Datei unter Linux/Unix aus
zwei Teilen: dem Dateikopf und den Datenblöcken. Der Dateikopf heißt Inode und
enthält folgende Angaben über die Datei:
• Die Art der Datei (reguläre Datei, Verzeichnis, ...)
• Dateieigentümer
• Größe der Datei in Byte
• Datum des letzten Zugriffs (atime), der letzten Änderung der Datei (mtime) und
der letzten Änderung der Dateiattribute (ctime)
• Löschdatum
• ID der Dateigruppe
• Anzahl der Hardlinks
• Anzahl der belegten Datenblöcke
• Dateiattribute (siehe chattr(1))
103
Aufbau und Management des Dateisystems
• Verweise auf die Datenblöcke
• Dateischutz
• Sonstiges
Dateiart
UID
Dateigröße
Zeitstempel
GID
Linkzähler
Blockzähler
Attribute
Dateirechte
12
direkte
Blockzeiger
1 einfach
indirekt
1 doppelt
indirekt
Aufbau einer i−node
Datenblock
Datenblock
Datenblock
...
Datenblock
Datenblock
Zeigerblock
Datenblock
...
Zeigerblock
Zeigerblock
Zeigerblock
1 dreifach
indirekt
Datenblock
Datenblock
Datenblock
...
Datenblock
Datenblock
Datenblock
...
Vereinfachte schematische Darstellung der Inode-Struktur des ext2-Filesystems
Die ersten 12 Verweise auf Datenblöcke zeigen direkt auf solche, dann folgt ein Verweis auf einen Verweis, der auf Datenblöcke zeigt, dann ein zweifacher, dann ein
dreifacher solcher Verweis. Die Datenstruktur ist somit sehr komplex, was z. B. das
Restaurieren einer gelöschten Datei (ohne zusätzliche Maßnahmen) oder eine Defragmentierung nahezu unmöglich macht. Aber das ext2-Filesystem ist so intelligent aufgebaut, daß eine Fragmentierung fast gar nicht erst auftritt, sofern der freie Platz auf
einer Partition nicht unter 10% beträgt.
Dies kann man z. B. mit dem Kommando df ( disk free“ ) überprüfen:
”
# df
Filesystem 1024-blocks Used
Available Capacity Mounted on
/dev/sda5 866139
750595 70796
91%
/
/dev/hda5 3811375
2986697 627482
83%
/kit
104
6.2 Das Dateisystem
Ein Verzeichnis ist eine spezielle Datei, die eigentlich nur beschreibt, welcher Dateiname zu welcher Inode gehört. Dadurch ist es z. B. möglich, mit einem zweiten
Namen auf dieselbe Inode zu verweisen (Hardlink).
Die Directories untereinander sind dadurch veknüpft, das jedes Verzeichnis sich selber
unter dem Namen .“ und das übergeordnete Verzeichnis unter dem Namen ..“ enthält.
”
”
Unterverzeichnisse sind ebenfalls mit Namen und Inode-Nummer enthalten.
6.2.3
Erstellen eines Dateisystems
Das Formatieren einer Partition unter Linux ist gleichbedeutend mit der Erstellung eines Filesystems auf dieser Partition. Da standardmäßig das ext2-Filesystem verwendet
wird, heißt das zugehörige Kommando mke2fs (bzw. allgemeiner mkfs).
Je nach geplanter Verwendung des Filesystems läßt sich, durch geeignete Parameter,
die Performance verbessern. (Bei einer Standard-Installation werden nat ürlich auch
immer nur die Standardwerte verwendet.)
Die wichtigsten Optionen von mke2fs (n bezeichnet darin die entsprechenden Zahlenwerte):
-b nnnn Bestimmt die Blockgröße in n Byte (zulässige Werte sind 1024, 2048 und
4096)
-c Vor dem Erstellen des Filesystems wird die Partition auf defekte Bl öcke untersucht.
-i nnn Legt die Inode-Dichte fest (n Bytes pro Inode). Standardmäßig wird für je 4096
Byte eine Inode angelegt.
-m n Legt fest, wieviel Prozent des Filesystems als eiserne Reserve“ für den Su”
peruser root zur Verfügung gestellt werden. Dieser Wert kann auch mit dem
Kommando tune2fs verändert werden.
✎
Beispiel: Ein ext2-Filesystem soll auf einer Partition erstellt werden. Dabei werden
für root 3% der Partitionsgröße reserviert. Die Blockgröße soll 2048 Byte betragen.
Bei der Erstellung der Filesystems soll nach fehlerhaften Bl öcken gesucht werden.
# mke2fs -m 3 -b 2048 -c /dev/sda6
mke2fs 1.14, 9-Jan-1999 for EXT2 FS 0.5b, 95/08/09
Linux ext2 filesystem format
Filesystem label=
80320 inodes, 160634 blocks
4819 blocks (3.00%) reserved for the super user
105
Aufbau und Management des Dateisystems
First data block=0
Block size=2048 (log=1)
Fragment size=2048 (log=1)
10 block groups
16384 blocks per group, 16384 fragments per group
8032 inodes per group
Superblock backups stored on blocks:
16384, 32768, 49152, 65536, 81920, 98304, 114688, 131072, 147456
Checking for bad blocks (read-only test): 0/160634 2960/160634
5664/160634 7808/160634 10192/160634 12864/160634 15568/160634
....
155360/160634 157792/160634 160192/160634 done
Writing inode tables: 0/10 1/10 2/10 3/10 4/10 5/10 6/10 7/10 8/10
9/10 done
Writing superblocks and filesystem accounting information: done
Beispiel: Eine Unix-formatierte (ext2-Filesystem) Diskette soll erstellt werden. Dabei soll der komplette Bereich für die Anwender zur Verfügung stehen. Der Labelname
wird mit Daten angegeben.
# mke2fs -m 0 -b 2048 -c -L DATEN /dev/fd0
mke2fs 1.14, 9-Jan-1999 for EXT2 FS 0.5b, 95/08/09
Linux ext2 filesystem format
Filesystem label=DATEN
368 inodes, 720 blocks
0 blocks (0.00%) reserved for the super user
First data block=0
Block size=2048 (log=1)
Fragment size=2048 (log=1)
1 block group
16384 blocks per group, 16384 fragments per group
Writing inode tables: done
106
✎
6.2 Das Dateisystem
Writing superblocks and filesystem accounting information: done
Z
Hinweis: Damit ein Filesystem auf eine Diskette erfolgreich übertragen werden kann,
sollte diese vorher mit dem Kommando fdformat low-Level-formatiert werden.
!
Achtung: Eine mit einem Filesystem versehene Diskette muß wie eine Festplatte
montiert“ werden (s. nächstes Kapitel). Sie darf dann nicht einfach aus dem Laufwerk
”
herausgenommen werden. In der Praxis wird man deshalb unter Linux oft einfach die
mtools zum Benutzen DOS-formatierter Disketten verwenden oder die Diskette direkt mit tar beschreiben.
Tip:
Informationen über ein bestehendes ext2-Filesystem liefert das Kommando dumpe2fs.
Aktuelle Entwicklungen: Auch unter Linux stehen mehrere Journaling File Sy”
stems“ zur Verfügung. So hat IBM den Quellcode seines JFS unter die GPL gestellt
und ein Entwicklerteam für Linux bereitgestellt. JFS für Linux ist inzwischen fertiggestellt und kann eingesetzt werden. SuSE entwickelt zusammen mit Hans Reiser
das Journaling Reiser Filesystem“ das inzwischen ebenfalls stabil ist und unter Su”
SE standardmäßig eingesetzt wird. Fedora/RedHat setzt hingegen eher auf ext3, eine
Weiterentwicklung des Linux-Standarddateisystems ext2 mit Journal.
Journaling Filesysteme werden bisher bei Serverbetriebssystemen eingesetzt. Beispiele sind das Windows NTFS und das Compaq Tru64 UNIX Advanced Filesystem.
Bei einem Journaling Filesystem werden alle Änderungen am Dateisystem mitprotokolliert, so daß im Falle eines Absturzes der genaue Zustand rekonstruiert werden
kann. Dadurch entfällt der — insbesondere bei großen Platten — sehr zeitraubende
Filesystem-Check.
Sofern vom laufenden Kernel unterstützt, kann man auch diese Dateisysteme mit mkfs
erzeugen:
mkfs.ext2 Ein ext2-Dateisystem erzeugen.
mkfs.ext3 Ein ext3-Dateisystem erzeugen.
mkfs.reiserfs Ein ReiserFS-Dateisystem erzeugen.
mkfs.xfs Ein XFS-Dateisystem erzeugen.
mkfs.vfat Ein Microsoft FAT-Dateisystem erzeugen. Mit dem Parameter -F kann
die FAT-Größe angegeben werden, 12 für 12 Bit, 16 für 16 Bit und 32 für 32 Bit,
107
Aufbau und Management des Dateisystems
wobei ein Wert zwischen 12 und 16 gewählt wird, wenn man nichts angibt. Für
FAT32 muß die Option -F 32 also explizit gesetzt werden.
6.2.4
Erstellen eines Swap-Bereiches
Manchmal reicht der physische Arbeitsspeicher für die laufenden Prozesse nicht mehr
aus. Dabei gibt es häufig Prozesse die ihren Ablauf unterbrechen müssen, da Sie erst
auf die Ausführung eines anderen Prozesses warten müssen und solange schlafen“.
”
Solche schlafenden Prozesse kann man bei hoher Systemlast in einen speziellen Bereich auf der Festplatte auslagern der Swap-Speicher genannt wird, um im physischen
Arbeitsspeicher Platz für andere Prozesse zu schaffen. Damit wird der Arbeitsspeicher
scheinbar vergrößert, man spricht daher auch von virtuellem Arbeitsspeicher .
Dabei ist der Arbeitsspeicher in Speicherseiten organisiert und so muß ein Prozess
nicht als ganzes, sondern er kann Seitenweise ausgelagert werden.
Wacht“ ein ausgelagerter Prozess wieder auf, merkt man das häufig an der länge”
ren Reaktionszeit. Festplattenspeicher ist leider bedeutend langsamer als physischer
Arbeitsspeicher.
Um wenigstens nicht ganz so langsam zu sein wie beim Lesen und Schreiben von
herkömmlichen Dateien auf die Festplatte, ist Swap-Speicher anders aufgebaut als
herkömmliche Dateisysteme. Speicherseiten müssen im Swap-Speicher zusammenhängend
abgelegt werden können, während in anderen Dateisystemen Dateien durchaus in mehrere Blöcke zerteilt auf verschiedene Orte der Festplatte verteilt werden.
Also benötigen Swap-Partitionen ein spezielles Format.
Unter Linux lassen sich aber auch spezielle Dateien als Swap-Speicher verwenden.
Solche Swap-Dateien sollten aber nur für kurzfristig erhöhten Swap-Bedarf eingesetzt
werden, da Swap-Partitionen performanter sind.
Einen Swap-Bereich erstellen Wir wollen nun /dev/sda2 als Swap-Partition formatieren. Dazu verwenden wir das Programm mkswap:
Beispiel:
# mkswap -c /dev/sda2
Setting up swapspace version 1, size = ...
Nun ist /dev/sda2 als Swap-Partition formatiert. Das Programm mkswap hat die
folgende Syntax:
Die Syntax von mkswap:
108
✎
6.2 Das Dateisystem
mkswap [-c] [-vN ] [-f] [-p PSZ] [-L label] device [size]
Meist ist es ratsam, den Befehl wie eben gezeigt in der einfachsten Variante zu verwenden. Insbesondere benötigt mkswap die Angabe der Größe (size) inzwischen
nicht mehr, weder bei Partitionen noch bei Swap-Dateien. Geben Sie die Gr öße also
lieber nicht an, denn ein kleiner Tippfehler könnte zur Zerstörung von Daten führen.
Die Optionen von mkswap:
-c: Das Geräte (Device) auf defekte Blöcke untersuchen (falls es sich um ein BlockDevice handelt).
-vN : Neues (-v1) oder altes (-v0) Swap-Format verwenden. Standard ist das neue
Format, das alte muß nur dann eingesetzt werden wenn ein Linux-Kernel älter
als 2.1.217 auf den Swap-Bereich zugreifen muß, oder wenn die Seitengr öße
kleiner ist als 2048.
-f: Den Befehl selbst dann ausführen, wenn mkswap ihn mit Fehlermeldung abbricht. Die Manpage man mkswap beschreibt einen Ausnahmefall in dem man
-f benötigt. Üblicherweise sollte man aber die Finger davon lassen.
-p PSZ: Die Größe der Speicherseiten angeben. Dies sollte man normalerweise nicht
tun, da mkswap außer in wenigen unüblichen Konfigurationen die Seitengröße
zuverlässig selbst ermittelt.
-L label: Nur für das neue Swap Format: hier kann ein Labelname für die SwapPartition angegeben werden, der mit swapon anstelle des Gerätenamens verwendet werden kann.
device: Die Swap-Partition oder Datei angeben.
size: Die Größe des Swap-Bereiches angeben. Das sollte man aber besser sein lassen, die Option gibt es nur noch der Rückwärtskompatibilität wegen.
Nun haben wir also eine Partition als Swap-Partition formatiert. Um eine Datei als
Swap-Bereich zu formatieren muss die Datei auf spezielle Weise erstellt werden:
# dd if=/dev/zero of=/dev/swapdatei bs=1024 count=10240
10240+0 records in
10240+0 records out
10485760 bytes (10 MB) copied, 0.252041 seconds, 41.6 MB/s
109
Aufbau und Management des Dateisystems
dd kopiert und konvertiert Dateien abhängig von den angegebenen Parametern. In
diesem Fall ist als Quelle (if=in-file) die spezielle Datei /dev/zero angegeben, die
auf jeden Lesezugriff den Wert 0 liefert. Ziel (of=out-file) ist unsere neu zu erstellende
Swap-Datei. bs gibt die Größe der zu lesenden und zu schreibenden Blöcke an, count
deren Anzahl.
(Mehr zu dd unter: man dd.)
Wir erzeugen also die Datei /dev/swapdatei die vollständig aus Nullen besteht und
10MB groß ist.
Achtung: Eine mit cp kopierte Datei darf niemals als Swap-Datei verwendet werden, da sie Löcher“ ( Holes“) enthalten kann und Speicherseiten damit nicht zusam”
”
menhängend abgelegt werden können. Fehlfunktionen und Datenverluste können daraus resultieren. Erstellen Sie Swap-Dateien wie eben gezeigt immer als neue Datei.
!
Hat man die Datei erzeugt, sollte man vor dem Formatieren unbedingt den Befehl
sync ausführen um sicherzustellen, daß die Datei auch physisch auf die Festplatte
geschrieben wird. Außerdem sollte nur root Lese und Schreibrecht haben:
Beispiel:
✎
# chmod 0600 /dev/swapdatei
# sync
# mkswap -c /dev/swapdatei
Setting up swapspace version 1, size = 10481 kB
Das Einbinden und Herausnehmen eines Swap-Bereiches geschieht mit den Befehlen swapon und swapoff. Wir können nun /dev/sda2 und /dev/swapdatei
wie folgt Einbinden:
Beispiel:
✎
# swapon /dev/sda2
# swapon /dev/swapdatei
Das Herausnehmen geschieht analog:
Beispiel:
# swapoff /dev/sda2
# swapoff /dev/swapdatei
110
✎
6.3 Mounten
Normalerweise geschieht das Einbinden und Herausnehmen aber automatisch. Dazu
werden Swap-Partitionen (und ggf. auch Swap-Dateien) in die Datei /etc/fstab eingetragen, was später noch erläutert wird.
Der Befehl swapon -a bindet alle Swap-Bereiche ein die in /etc/fstab stehen.
swapon -a wird üblicherweise beim Booten von einem Script zur Systeminitialisierung aufgerufen. Um diese Swap-Bereiche wieder herauszunehmen, wird swapoff
-a ausgeführt.
6.3 Mounten
Nachdem man nun die Partitionen mit einem Filesystem versehen hat, muß man diese
zur Benutzung in den Dateibaum einhängen. Dazu dient das Kommando mount.
6.3.1
Manuelles Mounten
mount Die Syntax des Kommandos mount ist:
mount [Option] [Device] [Mount-Point]
Das Device ist dabei der Device-Name der Partition, z.B. /dev/hda5; bei einem NFSMount wird der Name des freigebenden Rechners vorangestellt und nicht der dortige
Gerätename, sondern das freigegebene Verzeichnis, z. B. mount master:/remotedir
/localdir
Der Mount-Point ist ein beliebiges, bereits existierendes Verzeichnis. Darin evtl. enthaltene Dateien sind solange nicht mehr sichtbar, bis das Filesystem wieder heruntergenommen wird. Für temporäre Zwecke wird i.A. der Mount-Point /mnt verwendet.
mount ohne Option zeigt alle zur Zeit eingehängten Filesysteme. Diese Liste wird
intern in der Datei /etc/mtab verwaltet und immer dann verändert, wenn mit den
Kommandos mount bzw. umount Dateisysteme eingehängt bzw. ausgehängt werden. Das Format der Datei entspricht im Übrigen genau dem der weiter unter beschriebenen /etc/fstab.
Wichtige Optionen des mount-Befehls:
-a Alle in der Datei /etc/fstab eingetragenen Filesysteme werden montiert
-r Das Filesystem wird readonly“ eingehängt. In diesem Falle kann nicht einmal der
”
Superuser dort schreiben. Bei CD-ROM wird diese Option automatisch benutzt.
111
Aufbau und Management des Dateisystems
-t fstyp Hiemit wird der Type des Filesystems angegeben, z.B. ntfs, vfat. Der
Default ist iso9660. Aber auch ext2 braucht nicht extra genannt zu werden, da
das mount-Kommando zunächst den Superblock nach der Magic Number“ des
”
Filesystems durchsucht. Einige der möglichen Filesystemtypen siehe Abschnitt:
von Linux unterstützte Dateisysteme“ .
”
-o param Erlaubt die Angabe zusätzliche Parameter, z.B. -o nosuid verhindert die
Ausführung von Programmen mit SUID-Bit. Manche Filesystemtreiber haben
auch noch eigene Optionen, z.B. iso9660, nfs. Ausführliche Angaben findet
man im Online-Manual, den Man-Pages.
6.3.2
Automatisches Mounten beim Hochfahren des Systems
Beim Hochfahren des System sollen normalerweise bestimmte Partitionen automatisch
eingehängt werden. Als Konfigurationsdatei hierfür und für den mount-Befehl dient
die Datei /etc/fstab. Auch die Swap-Partition(en) werden hier eingetragen.
(Im Beispiel wird auch eine Swap-Datei eingebunden. In der Praxis sollte man SwapDateien aber nur als kurzfristige Abhilfe verwenden, ein automatisches Einbinden per
/etc/fstab ist dann für eine Swap-Datei üblicherweise nicht nötig.)
Die Datei /etc/fstab
/dev/sda2
/dev/swapdatei
/dev/sda5
/dev/hda5
/dev/hdc
/dev/fd0
none
swap
swap
/
/kit
/cdrom
/floppy
/proc
swap
swap
ext2
ext2
iso9660
auto
proc
defaults
defaults
defaults
defaults
ro,noauto,user
noauto,user
defaults
0
0
1
1
0
0
0
0
0
1
2
0
0
0
Aufbau der Datei /etc/fstab:
1. Feld: Gerätename; bei NFS auch den Namen des freigebenden Rechners
2. Feld: Mount-Point
3. Feld: Typ des Filesystems
4. Feld: Zugriffmodi und Parameter z.B. ro für read-only, noauto verhindert das automatische Mounten beim Hochfahren, user erlaubt jedem, nicht nur root, das
Gerät zu mounten.
112
6.4 Filesystem-Check
5. Feld: Wird von dump verwendet, um zu ermitteln, ob das Dateisystem gesichert
werden soll (1) oder nicht (0).
6. Feld: Reihenfolge der logischen Prüfung der Filesysteme beim Hochfahren: 0 für
Dateisysteme, die nicht überprüft werden sollen (z.B. NFS, nicht-Linux-Filesysteme
und Swap-Bereiche), 1 für die Root Partition, 2 für andere (im Falle mehrerer
Platten erfolgt eine parallele Prüfung).
Z
Hinweis:
Auf die sinnvolle Reihenfolge in der /etc/fstab ist unbedingt zu achten!
Ist ein Dateisystem in der Datei /etc/fstab eingetragen, so gen ügt es, beim mountBefehl entweder den Gerätenamen oder den Mountpoint anzugeben. Alle anderen Informationen liest mount dann aus der Datei. Beispiele:
mount /floppy
mount /dev/hdc
6.3.3
Herausnehmen eines Filesystems
Um ein montiertes Filesystem wieder aus dem Dateibaum zu entfernen, verwendet
man den Befehl umount.
umount Mount-Point z. B. umount /floppy oder
umount Device z. B. umount /dev/sda6
umount -a versucht, alle momentan montierten Filesysteme (aus /etc/mtab) zu entfernen.
Die häufigste hierbei vorkommende Fehlermeldung device is busy“ wird in den mei”
sten Fällen dadurch verursacht, daß noch jemand auf diesem Device arbeitet oder
schlichtweg in einem Verzeichnis auf diesem Filesystem sitzt“ . Ist man selber der
”
Verursacher, so läßt sich dies leicht beheben. Auf einem echten Multiuser-System kann
der Superuser nur versuchen, den/die betreffenden Benutzer ausfindig zu machen und
zur Freigabe zu bewegen... Schlimmstensfalls muß das System neu gestartet werden.
Tip: Die Programme fuser(1) und lsof können bei der Suche nach blockierenden Benutzern hilfreich sein.
6.4 Filesystem-Check
Da sämtliche I/O-Operationen durch den Buffer Cache laufen, ist im Falle eines unkontrollierten Entfernens (z. B. bei Stromausfall) eines Filesystems nicht sichergestellt,
daß wirklich auch alle Daten auf dem Medium geschrieben wurden.
113
Aufbau und Management des Dateisystems
Intern ist der Puffer so eingestellt, daß alle 30 Sekunden die Daten zur ückgeschrieben
werden. Auch beim umount und beim Herunterfahren des Systems wird der Puffer
geflusht“ , und es wird ein clean flag“ im Filesystem gesetzt.
”
”
Fehlt dieses Flag jedoch, geht Linux davon aus, daß das Dateisystem nicht ordnungsgemäß entfernt wurde, und daß demzufolge Daten inkonsistent sein k önnen. Bevor
man dieses Filesystem wieder mounten kann, muß eine logische Überprüfung der Datenstrukturen erfolgen.
Eine solche logische Überprüfung erfolgt bei Linux auch zwingend, wenn ein bestimmtes Limit, der mount count“, erreicht ist.
”
Manuell läßt sich der Puffer mit dem Befehl sync zurückschreiben, allerdings warnt
Linus Torvalds ausdrücklich davor, eine Maschine nach einem sync-Befehl einfach
auszuschalten.
Beim Hochfahren des Systems geschieht diese Überprüfung automatisch; das verwendete Kommando heißt e2fsck (allgemein fsck) und pr üft sowohl ext2 als auch
ext3 Dateisysteme.
e2fsck kann vielerlei Probleme lösen:
• Inodes, für die es keinen Verzeichniseintrag mehr gibt (unreferenced inodes).
Diese werden dann im Verzeichnis lost+found auf der Ebene des jeweiligen
Mount-Points hinterlegt.
• falsche Link-Zähler im Inode
• freie Blöcke, die nicht in der Freiliste (block bitmap) stehen
• Blöcke in der Freiliste, die auch als Datenblöcke ausgewiesen werden
• nicht lesbarer oder inkorrekter Superblock
• Datenblöcke, die von mehreren Dateien beansprucht werden. (In diesem Falle werden die betroffenen Blöcke einfach dupliziert und neu zugewiesen. Man
sollte anschließend diese Dateien genau untersuchen, da i. d. R. ja nur eine Datei
diese Daten wirklich enthält und die anderen wahrscheinlich unbrauchbar sind.)
Nicht behebbar sind aber z. B. :
• Adressen von Datenblöcken, die außerhalb des Filesystems liegen
• unlesbare Inodes (diese können evtl. mit der Option -c als bad blocks markiert
werden)
Wichtige Optionen von e2fsck:
114
6.4 Filesystem-Check
-y Auf alle Fragen wird immer mit ’yes’ geantwortet
-n Auf alle Fragen wird immer mit ’no’ geantwortet
-f Filesystem Check wird erzwungen, auch wenn es in Ordnung zu sein scheint
-p preen“ : Einige Inkonsistenzen werden automatisch, d.h. ohne Nachfrage korri”
giert.
-b# Erlaubt, es die Blocknummer einer der Kopien des Superblocks anzugeben (#
steht für die Nummer), falls dieser korrupt ist; die meisten Filesysteme haben
Kopien des Superblocks an den Blockadressen 8193, 16385, usw. z. B. e2fsck
-b 8193
Tip: Das Kommando dumpe2fs zeigt tiefergehende Informationen über ein Filesystem, aus denen sich etwa die Blocknummern der Superblock-Kopien ermitteln lassen.
tune2fs erlaubt das Verändern einiger Filesystemwerte, wie z.B. die Nachrüstung
eines Journals, um so ein ext2 in ein ext3-Dateisystem zu konvertieren oder auch umgekehrt.
debugfs erlaubt tiefgreifende Änderungen an ext2 Dateisystemen. Benutzungsfehler können im schlimmsten Fall zu Datenverlust führen und ein Dateisystem unbrauchbar machen.
Andere Dateisysteme können mit folgenden Befehlen überprüft werden:
reiserfsck ReiserFS Dateisysteme überprüfen.
fsck.xfs XFS Dateisysteme überprüfen.
fsck.jfs JFS Dateisysteme überprüfen.
fsck.minix Minix Dateisysteme überprüfen.
fsck.msdos DOS-FAT Dateisysteme überprüfen.
fsck.vfat FAT Dateisysteme überprüfen.
115
Aufbau und Management des Dateisystems
116
6.5 Übungen
6.5
Übungen
1. Überprüfen Sie die Partitionstabellen Ihres Rechners: Welche Arten von Festplatten sind eingebaut? Wie ist die momentane Aufteilung? Gibt es noch Platz
für weitere Partitionen? Wenn ja, dann legen Sie eine solche an, versehen diese
mit einem ext2-Filesystem und richten das System so ein, daß diese Partition automatisch beim Systemstart immer wieder an eine von Ihnen gew ünschte
Stelle eingehängt wird.
2.
(a) Richten Sie ein ext2-Filesystem mit normaler Blockgr öße, aber ohne reservierten Platz für den Superuser auf einer Diskette ein.
(b) Hängen Sie die Diskette ins Verzeichnis /mnt ein und erzeugen Sie einige
Dateien und Unterverzeichnisse.
(c) Editieren Sie eine Datei und nehmen Sie, ohne den Editor zu beenden oder
die Änderungen komplett zu speichern, die Diskette heraus.
(d) Der mount-Befehl zeigt die Diskette immer noch als eingehängt an. Können
Sie weiterhin in /mnt arbeiten? Wenn ja, warum? Geben Sie nun erst den
entsprechenden umount-Befehl (Fehlermeldungen werden übrigens auf
der virtuellen Konsole 10 angezeigt)
(e) Lassen Sie einen Filesystem-Check über die Diskette laufen.
3. Für Fortgeschrittene:
Starten Sie das Programm debugfs -w /dev/fd0u1440 (Hinweis f ür den Trainer: nötigenfalls das Paket e2fsprogs/ext2fs installieren) Wechseln Sie mit
cd in ein Unterverzeichnis und geben Sie ein: ls. Dann l öschen Sie eine der
angezeigten Dateien mit dem Befehl: unlink filename
Verlassen Sie das Programm mit q (quit).
Führen Sie nun einen Filesystem-Check aus und versuchen Sie, die Originaldatei
unter Ihrem alten Namen in Ihrem alten Verzeichnis wiederherzustellen.
4. Wenn noch genügend Zeit ist:
Informieren Sie sich anhand der Online-Hilfe über die verschiedenen erwähnten Hilfsprogramme und testen Sie diese aus (z.B. read-only mount auf der
Diskette)
117
Aufbau und Management des Dateisystems
6.6 Lösungen
1.
(a) Welche Festplatten sind eingebaut: Alle Partitionen bekommt man mit
# cat /proc/partitions
Weitere Informationen erhält man respektive mit
# cat /proc/scsi/scsi
oder im Verzeichnis /proc/ide/hdan/
(b) Momentane Aufteilung:
# fdisk -l /dev/Platte
(c) Neue Partition anlegen:
# fdisk /dev/hda
Command (m for help): p
Disk /dev/hda: 10 heads, 17 sectors, 980 cylinders
Units = cylinders of 170 * 512 bytes
Device Boot
/dev/hda1
*
Start
1
End
69
Blocks
5856+
Id
83
System
Linux
Command (m for help): n
Command action
e
extended
p
primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (70-980, default 70):
Using default value 70
Last cylinder or +size or +sizeM or +sizeK (70-980, default 980):
Using default value 980
Command (m for help): p
Disk /dev/hda: 10 heads, 17 sectors, 980 cylinders
Units = cylinders of 170 * 512 bytes
Device Boot
/dev/hda1
*
/dev/hda2
118
Start
1
70
End
69
980
Blocks
5856+
77435
Id
83
83
System
Linux
Linux
6.6 Lösungen
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
Re-read table failed with error 16: Device or resource busy.
Reboot your system to ensure the partition table is updated.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
# mkdir /a
# echo "/dev/hda2 /a ext2 defaults 0 0" >> /etc/fstab
# mke2fs /dev/hda2
2.
(a) # mke2fs -m 0 /dev/fd0
mke2fs 1.15, 18-Jul-1999 for EXT2 FS 0.5b, 95/08/09
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
184 inodes, 1440 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
184 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
(b) # mount /dev/fd0 /mnt
# touch foo bar
# mkdir -p verz/uverz1/uverz2
(c) # ed foo
0
a
Hallo Welt!
Dies ist der Editor ed
.
<Diskette wird herausgenommen>
q
119
Aufbau und Management des Dateisystems
?
q
(d) # mount
/dev/md0 on / type ext2 (rw)
none on /proc type proc (rw)
/dev/hda1 on /boot type ext2 (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/fd0 on /mnt type ext2 (rw)
# umount /mnt
# mount
/dev/md0 on / type ext2 (rw)
none on /proc type proc (rw)
/dev/hda1 on /boot type ext2 (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
(e) # e2fsck /dev/fd0
e2fsck 1.15, 18-Jul-1999 for EXT2 FS 0.5b, 95/08/09
/dev/fd0 was not cleanly unmounted, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/fd0: 11/184 files (0.0% non-contiguous), 41/1440 blocks
# ls /mnt/
cdrom dos floppy
# ls /mnt/floppy/
# mount /dev/fd0 /mnt
# ls /mnt/
lost+found
3. # mount /dev/fd0 /mnt
# cd /mnt
# mkdir verz
# cd verz/
# echo Hallo Welt > hallo
# ls
hallo
# cd
# umount /mnt/
# debugfs -w /dev/fd0
debugfs 1.15, 18-Jul-1999 for EXT2 FS 0.5b, 95/08/09
debugfs: ls
2 (12) .
2 (12) ..
11 (20) lost+found
12 (980) verz
120
6.6 Lösungen
debugfs: cd verz
debugfs: ls
12 (12) .
2 (12) ..
13 (1000) hallo
debugfs: unlink hallo
debugfs: q
# e2fsck -f /dev/fd0
e2fsck 1.15, 18-Jul-1999 for EXT2 FS 0.5b, 95/08/09
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Unattached inode 13
Connect to /lost+found<y>? yes
Inode 13 ref count is 2, should be 1.
Fix<y>? yes
Pass 5: Checking group summary information
/dev/fd0: ***** FILE SYSTEM WAS MODIFIED *****
/dev/fd0: 13/184 files (0.0% non-contiguous), 43/1440 blocks
# mount /dev/fd0 /mnt/
# cd /mnt/
# ls
lost+found verz
# cd verz/
[root@johannes verz]# ls
# mv ../lost+found/* .
# ls
#13
# mv "#13" hello
# cat hello
Hallo Welt
121