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