9.5 Dateisystemverwaltung
In diesem Abschnitt wollen wir uns nun um Verwaltungsaufgaben kümmern, die mit dem Dateisystem zu tun haben. Dabei gibt es natürlich wiederum Grundlagen, die vor den eigentlich interessanten Themen behandelt werden müssen. Im ersten Kapitel haben wir dabei schon das VFS, das Mounting sowie die /etc/fstab erwähnt. Diese Themen wollen wir nun aufgreifen.
9.5.1 Die /etc/fstab
Betrachten wir also noch einmal das Beispiel aus Kapitel 1, und konzentrieren wir uns dabei auf die Felder, die wir noch nicht besprochen haben:
# Partitionen /dev/hda1 / ext3 errors=remount-ro 0 1 /dev/hda3 /home reiserfs defaults 0 0 /dev/hda4 none swap sw 0 0 # Wechselspeicher /dev/fd0 /mnt/floppy auto user,noauto 0 0 /dev/hdc /mnt/dvd iso9660 ro,user,noauto 0 0 /dev/hdd /mnt/cdburn auto ro,user,noauto 0 0 # virtuelle Dateisysteme proc /proc proc defaults 0 0
Listing 9.61 Eine /etc/fstab
Aufbau
Der Aufbau dieser Datei ist, wie leicht zu erkennen ist, tabellarisch gehalten. Jeder Datensatz wird in einer eigenen Zeile platziert, jedes Attribut wird mittels Leerzeichen vom nächsten getrennt. Die erste Spalte legt das Blockgerät – die Gerätedatei des Speichermediums – fest, das gemountet werden soll. An dieser Stelle können auch Netzwerkdateisysteme in der Form Rechner:Verzeichnis angegeben werden.
In Spalte zwei ist der Mountpoint angegeben. Handelt es sich bei einem Datensatz jedoch um den Swap-Auslagerungsspeicher, so ist hier kein Mountpoint, sondern none anzugeben.
Das dritte Feld legt das Dateisystem fest. Auf einer CD-ROM befindet sich schließlich ein ganz anderes Dateisystem als auf einer Windows- oder Linux-Partition. Generell können hier folgende Dateisysteme angegeben werden:
- ext
- Der Vorläufer des für Linux hauseigenen Dateisystems ext2.
- ext2
- Dieses Dateisystem erlaubt recht lange Dateinamen und benutzt Inodes zur Verwaltung der Dateien.
- ext3
- Die aktuelle Journaling-Version des ext2-Dateisystems. Diese Extended-Dateisysteme sind speziell für Linux entwickelt worden und damit natürlich für den Einsatz unter Linux prädestiniert. Sie sind abwärtskompatibel. Man kann demnach eine ext3-Partition mit einem ext2-Treiber mounten, und alles läuft glatt.
- Darüber hinaus entfällt bei ext3 ein langes Überprüfen der Partition, wenn beispielsweise durch einen Stromausfall das Dateisystem nicht ordentlich ungemountet werden konnte, was sonst beim Shutdown des Systems automatisch passiert.
- xfs
- SGIs XFS. Dieses schon alte Dateisystem benötigt einen Kernel-Patch, bietet sich jedoch besonders für die Verwaltung sehr großer Datenmengen an und unterstützt Access Control Lists sowie auch das Journaling.
- reiserfs
- Das ReiserFS ist ein relativ neues und sehr weit verbreitetes Journaling-Dateisystem, das binäre Bäume als Grundlage seiner Datenverwaltung benutzt. Als das ext3-System noch nicht fertig war, wurde ReiserFS aufgrund seiner Journaling-Fähigkeiten ext2 oft vorgezogen.
- swap
- Das Swap-Dateisystem wird zur Auslagerung momentan nicht benötigter Hauptspeicherdaten benutzt.
- msdos/vfat
- Microsofts FAT16/32-Dateisysteme. Sollten Sie eine ältere Windows- oder DOS-Partition benutzen, so kann diese auch von Linux aus genutzt werden.
- ntfs
- Microsofts NTFS, das Dateisystem neuerer Windows-Versionen, wird ebenfalls unterstützt.
- iso9660
- Dieses Dateisystem wird auf CD-ROMs und DVDs verwendet.
- nfs
- Das Netzwerkdateisystem NFS <NFS = network filesystem> wird für die Speicherung von Dateien auf Fileservern genutzt. Ein so von einem anderen Rechner gemountetes Dateisystem ist für den Benutzer bis auf Performance-Aspekte identisch mit lokalen Verzeichnissen.
- proc
- Das Prozessdateisystem. Es enthält unter anderem Informationen über die aktuellen Prozesse des Rechners sowie andere Einstellungen und Laufzeitdaten des Kernels. Dieses Dateisystem ist ein echtes Pseudodateisystem, da Sie die Dateien und Verzeichnisse zwar sehen, aber alles während Ihres Zugriffs zur Laufzeit für Sie erstellt wird. Es wird also keinerlei Platz auf der Festplatte benötigt.
Die vierte Spalte wird zur Festlegung einiger Optionen benutzt. Mehrere angegebene Optionen werden dann durch ein Komma getrennt. Die wichtigsten Optionen lauten dabei wie folgt:
- auto/noauto
- Mit diesen Optionen wird festgelegt, ob ein Dateisystem automatisch beim Booten gemountet werden soll. Wenn man ein Dateisystem nicht beim Booten mountet, reicht später ein einfaches mount mit dem Mountpoint oder dem Device als Parameter, um das Dateisystem einzubinden.
- user=steffen,gid=1000
Integration ins VFS
- Mit einem solchen Parameter können die Rechte für den Zugriff auf ein Dateisystem gesetzt werden. Das ist vor allem für Dateisysteme interessant, die selbst keine Benutzer- oder Rechteinformationen verwalten, wie etwa Microsofts FAT16/32. Bei einem Listing mit »ls -l« werden dann die entsprechenden (Rechte-)Daten angezeigt.
- ro/rw
- Mit diesen Optionen kann festgelegt werden, ob ein Dateisystem nur lesbar (»ro, read-only) oder mit Lese- und Schreibzugriff (rw, read & write) gemountet wird.
- suid/nosuid
- Über die suid-Option können Sie festlegen, ob Dateien mit SUID- bzw. SGID- Berechtigungen ausgeführt werden dürfen. Vor allem für »fremde« (Netzwerk-)Dateisysteme von anderen Systemen empfiehlt es sich, das nosuid-Flag zu setzen, um Sicherheitsrisiken zu minimieren.
- sync/async
- Soll ein asynchroner oder synchroner I/O-Zugriff auf das Medium erfolgen?
- atime/noatime
- Regelt, ob die Zugriffszeiten auf Dateien (nicht) angepasst werden sollen.
- dev/nodev
- Erlaubt (keine) Nutzung von Character- und Block-Geräten von diesem Medium. Demnach sollte das Dateisystem, auf dem sich das Verzeichnis /dev befindet, diese Option sinnvollerweise gesetzt haben – andere, vor allem fremde Dateisysteme aus Sicherheitsgründen eher nicht.
- exec/noexec
- Diese Option erlaubt bzw. verhindert die Ausführung von Binärdateien.
- user/nouser
- Mit der nouser-Option hat nur root die Berechtigung, dieses Medium zu mounten. Ist die user-Option gesetzt, ist dies dementsprechend also erlaubt.
- default
- Diese Option setzt rw, suid, dev, exec, auto, nouser und async.
Default-Option
Es existieren noch einige weitere, teilweise dateisystemspezifische Optionen, die an dieser Stelle nicht weiter erläutert werden sollen. Falls Sie sich für diese Optionen interessieren, so hilft Ihnen die mount-Manpage weiter.
Spalte Nummer fünf beinhaltet entweder eine 1 oder eine 0. Ist eine 1 gesetzt, so wird das Dateisystem für die Backup-Erstellung mittels des dump-Kommandos markiert. Da dieses Kommando aber kaum noch genutzt wird, brauchen Sie sich über diesen Wert keine Gedanken zu machen. Wenn Sie es genau nehmen, sollten allerdings alle Wechselmedien mit einer 0 gekennzeichnet werden. Schließlich wird man ja – wenn überhaupt – nur die lokalen Platten, aber keine zufällig eingelegten CD-ROMs sichern wollen.
Die letzte Spalte (eine 2, 1 oder eine 0) gibt ein Flag für das Tool fsck an. Ist es mit einer Zahl größer null gesetzt, überprüft fsck beim Booten nach einem fehlerhaften oder ganz fehlenden Unmount <Beispielsweise beim Absturz des Rechners> das Dateisystem auf Fehler hin. Die Zahlen selbst geben dabei die Reihenfolge beim Überprüfen an. Man sollte daher die Rootpartition (/) mit einer 1 und alle anderen Platten und Partitionen mit einer 2 versehen. Dort ist die Reihenfolge schließlich egal.
9.5.2 Das mount-Tool
Dateisysteme einbinden
Das mount-Tool wurde bereits kurz angesprochen: Es wird benutzt, um ein Dateisystem per Hand einzuhängen.
Dabei werden der Dateisystemtyp (mit dem Parameter -t), das zu mountende Gerät und der Mountpoint angegeben. Das Gerät kann sowohl ein CD-ROM-Laufwerk als auch eine Festplattenpartition, eine Netzwerkressource (Network Filesystem) oder Ähnliches sein.
# mount -t ext2 /dev/hdb1 /public
Listing 9.62 Beispiel für ein Mounting
Hier wurde die erste Partition der zweiten Festplatte <Genauer gesagt: der Primary Slave des IDE-Hostadapters>, auf der sich ein ext2-Dateisystem befindet, in das Verzeichnis /public gemountet.
Ruft man mount ohne Parameter auf, bekommt man alle momentan eingehängten Dateisysteme angezeigt:
# mount /dev/hda5 on / type ext2 (rw) /dev/hda1 on /dos type vfat (rw) devpts on /dev/pts type devpts (rw, gid=5, mode=620) proc on /proc type proc (rw)
Listing 9.63 Was haben wir denn Feines eingehängt?
Mit dem Kommando umount wird ein Dateisystem wieder ausgehängt. Einsteigern bereitet dieses Kommando jedoch oft Kopfzerbrechen, da sich so manches Dateisystem nicht wieder ganz einfach unmounten lässt. Dies liegt oft daran, dass in diesem Dateisystem noch ein Prozess läuft – beispielsweise befindet man sich mit dem Arbeitsverzeichnis der Shell gerade selbst im Mountpoint.
# umount /public
Listing 9.64 Unmounten einer Partition
9.5.3 Platz beschränken: Quotas
Im Folgenden wollen wir die sogenannten Quotas besprechen. Quotas sind dazu da, den Speicherplatz zu begrenzen, den ein Benutzer zur Verfügung hat. Das ist auf Mehrbenutzersystemen oft effektiver, als auf die Kooperation der Nutzer zu hoffen, und wird somit vor allem in größeren Unix-Rechenzentren eingesetzt.
Es sei hier erwähnt, dass Quotas in erster Linie nur von den Dateisystemen der ext-Familie in dieser Form unterstützt werden. Möchte ein Prozess eine Datei anlegen oder anderweitig mehr Speicherplatz beanspruchen, prüft der Kernel zuerst, ob der mit dem Prozess assoziierte Nutzer überhaupt das entsprechende Recht dazu hat.
Harte und weiche Grenzen
Um den Benutzern den Umgang mit dieser Kontrolle zu erleichtern, können sogenannte harte und weiche Grenzen definiert werden. Ein Überschreiten der weichen Grenzen ist auf eine gewisse Dauer beschränkt und wird mit einer Warnmeldung quittiert. Im Gegensatz dazu ist es unmöglich, harte Grenzen zu überschreiten. Auf diesem Weg kann man klare Grenzen setzen und trotzdem zeitweilige Ansprüche befriedigen.
Um diese Speicherplatzbeschränkungen nutzen zu können, muss zuallererst einmal der Quota-Support in den Kernel kompiliert worden sein, was jedoch bei allen Standard-Kerneln, so wie sie von den Distributoren ausgeliefert werden, der Fall sein sollte.
Den Quota-Support aktivieren
Anschließend kann in der /etc/fstab für die entsprechenden Partitionen der Quota-Support aktiviert werden. Dies geschieht im Optionenfeld durch Angabe der Schlüsselwörter usrquota beziehungsweise grpquota, je nachdem, ob man eine Beschränkung für Benutzer oder für Gruppen aktivieren möchte. Natürlich ist auch eine Kombination dieser Parameter möglich.
/dev/hda3 /home ext3 defaults,usrquota,grpquota 1 2
Listing 9.65 Aktivieren von Quotas in der fstab
Hier im Beispiel wurden für die /home-Partition beide Begrenzungsmöglichkeiten aktiviert. Als Nächstes muss man sicherstellen, dass in der Wurzel der entsprechenden Partitionen die Datei quota.user beziehungsweise quota.group existiert. Da diese beim Erstellen auch leer sein können, reicht ein Anlegen der Dateien mit touch:
# cd /home # touch quota.user
Listing 9.66 Anlegen einer quota.user-Datei
Mit den Kommandos quotaon und quotaoff kann nun der Administrator die Quotas aktivieren und wieder beenden. Sinnvollerweise sollten die Befehle, soweit sie noch nicht von der Distribution über ein bestimmtes Paket <Natürlich sollte man vor jeder Aktion im Repository der eigenen Distribution nachsehen, ob man sich vielleicht etwas Arbeit durch ein vorkonfiguriertes Paket sparen könnte.> vorkonfiguriert worden sind, in ein Skript in /etc/init.d eingebaut werden. Am besten eignet sich dafür die /etc/init.d/boot oder die /etc/init.d/boot.local, in die beispielsweise folgende Zeilen eingefügt werden könnten:
if [ -x /usr/sbin/quotaon ] echo "Aktivieren der Speicherplatzbeschränkung" /usr/sbin/quotaon -avug fi
Listing 9.67 Quotas im Initscript
Dieses kurze Codefragment testet, ob die Datei /usr/sbin/quotaon vorhanden und ausführbar ist. Im Erfolgsfall wird das Programm dann mit einer kurzen Meldung einfach gestartet.
Des Weiteren ist es empfehlenswert, vor dem Aktivieren die Quotas überprüfen zu lassen. Dazu führt man vor dem Befehl quotaon das Kommando quotacheck aus. Analog dazu können Quotas natürlich mit quotaoff wieder deaktiviert werden.
Quotas setzen
Nun möchten wir natürlich noch die Quotas ändern können. Es ist zwar unter Unix-Systemen unüblich, Konfigurationsdateien im Binärformat zu speichern, die quota.user bzw. quota.group sind aus Performance-Gründen allerdings so optimiert. Aus diesem Grund kann man sie auch nicht per Hand editieren, sondern benötigt das Programm edquota.
Mit edquota -u jploetner kann man dann beispielsweise die Quotas für den Benutzer jploetner ändern.
Das Programm edquota nutzt dafür das in der Shell-Variablen EDITOR gespeicherte Programm. Es wird sich dann die Möglichkeit eröffnen, für die Werte soft = 0, hard = 0 entsprechende Grenzen einzutragen. Aber Vorsicht:
Sie geben die Größen in Blocks bzw. Inodes an! Daher müssen Sie eventuell erst zurückrechnen, wie viel Platz das letztendlich wäre. Standardgrößen sind 1024, 2048 oder 4096 Bytes pro Block. Über die Inodes lässt sich dann die Anzahl der Dateien und Verzeichnisse regeln.
# edquota -u jploetner Quotas for user jploetner: /dev/hda3: blocks in use: 6, limits (soft = 0, hard = 0) inodes in use: 5, limits (soft = 0, hard = 0)
Listing 9.68 Die Limits für den Benutzer 'jploetner' ändern
Hier könnte man nun ein entsprechendes Limit eintragen. Dabei wird jedoch das hard-Limit erst genutzt, wenn man eine grace-time, eine Art »Gnadenfrist«, definiert hat. In dieser Zeit kann das Softlimit überschritten werden, das Hardlimit jedoch nicht. Setzen kann man diese Zeit mit dem Parameter »-t«:
# edquota -t Time units may be: days, hours, minutes, or seconds Grace period before enforcing soft limits for users: /dev/hda3: block grace period: 0 days, file grace period: 0 days
Listing 9.69 Die grace-time setzen
Nach dem Speichern der Datei und dem Beenden des Editors werden diese Daten schließlich übernommen. Wir könnten nun noch sehr viel über die vielfältigen Spielereien erzählen, die mit Quotas möglich sind, jedoch würde dies deutlich den Rahmen dieses Kapitels sprengen. Stattdessen wollen wir uns von der administrativen Sichtweise verabschieden und einen Blick auf die Benutzer in einer von Quotas bestimmten Welt werfen.
Benutzer und Quotas
Natürlich werden Benutzer durch die Quotas in dem ihnen zur Verfügung stehenden Speicherplatz eingeschränkt. Die Frage ist jedoch, wie sie damit umgehen können. Zu allererst sollte den Benutzern natürlich ein Überblick über den bisher verbrauchten Speicher sowie die gesetzten Grenzen gegeben werden können. Dazu können diese recht einfach das quota-Programm nutzen:
$ quota Disk quotas for user steffen (uid 1021): Filesystem blocks quota limit grace /dev/hda3 37760 80000 90000 files quota limit grace 1272 8000 9000
Listing 9.70 Das quota-Programm
Natürlich kann sich auch der Administrator über die Option »-u«, gefolgt vom Benutzernamen beziehungsweise »-g«, gefolgt vom Gruppennamen, diese Daten anzeigen lassen.
9.5.4 du und df
Ebenfalls in diesem Zusammenhang interessant sind natürlich Informationen über die Gesamtgröße bestimmter Verzeichnisse oder Dateisammlungen. Für diesen Zweck gibt es das Tool du:
$ du -h Kompendium/ 12K Kompendium/CVS 12K Kompendium/images/CVS 13M Kompendium/images 45M Kompendium/
Listing 9.71 Verzeichnisplatz anzeigen: du
Offensichtlich zeigt du also den aufsummierten Speicherplatz eines bestimmten Verzeichnisses – alternativ auch einer Datei oder mehrerer Dateien – samt aller aufsummierten Unterverzeichnisse an. Dabei wurde die Option »-h« (vom englischen »human readable«) benutzt, die die Angabe des Speicherplatzes in »üblichen Größen« veranlasst. Ohne diese Option dürfte man entsprechend von der Anzeige in Kilobyte zurückrechnen.
Ebenfalls häufig genutzt ist die Parameterkombination »-sch«, die am Ende nur für jedes auf der Kommandozeile angegebene Argument sowie die Gesamtheit aller Argumente eine Summe produziert und ausgibt:
$ du -sch Kompendium/ 45M Kompendium/ 45M insgesamt
Listing 9.72 Nur die Summen: du -sch
Mit du kann ein Benutzer auf einem durch Quotas reglementierten Dateisystem einen guten Überblick über seinen Speicherplatzverbrauch behalten.
In größeren Maßstäben denken: df
Größe eines Dateisystems
Dagegen ist das df-Tool (aus dem englischen »disk-free«) dazu gedacht, die Auslastung ganzer Dateisysteme zu überwachen. Dazu übergibt man bei jedem Aufruf am besten ebenfalls die Option »-h«, da spätestens bei etwas größeren Platten der Umgang mit mehreren hundert Millionen Kilobytes etwas unhandlich wird. Eine Anzeige in Gigabyte ist allemal handlicher:
$ df -h Dateisystem Größe Benut Verf Ben% Eingehängt auf /dev/hda1 20G 8,2G 11G 44% / tmpfs 380M 4,0K 380M 1% /dev/shm /dev/hda2 21G 7,5G 13G 38% /mnt/openbsd /dev/hda3 35G 30G 4,5G 96% /home
Listing 9.73 Platz auf der Platte: df
Vielleicht werden Sie sich an dieser Stelle fragen, warum der verfügbare Plattenplatz addiert auf den benutzten Plattenplatz so gar nicht mit der Größe der Partition zusammenhängt. Der Grund dafür ist in der Struktur der Dateisysteme zu suchen: Für Metadaten wie »Eigentümer« oder »Zugriffsrechte« von Dateien beziehungsweise Verzeichnissen wird ebenfalls Speicherplatz benötigt. Diese Metadaten werden in Form von sogenannten Inodes am Anfang einer Partition abgelegt. Mehr Informationen zum Thema »Dateisysteme« finden Sie in Kapitel 26.
9.5.5 SoftRAID und LVM
Dieser Abschnitt zeigt Ihnen Möglichkeiten auf, wie Sie aus Linux bezüglich der Speicherplatzverwaltung das Optimum herausholen können. Dabei gibt es – abgesehen von hardwarebasierten Lösungen, die wir hier nicht besprechen wollen – unter Linux zwei Ansätze: SoftRAID und LVM.
- LVM
- Der LVM (»Logical Volume Manager«) bietet Ihnen die Möglichkeit, Dateisysteme über mehrere Partitionen, ja sogar über mehrere Speichermedien zu verteilen.
- SoftRAID
- SoftRAID dagegen bietet Ihnen eine Softwarelösung, um Ihr System in verschiedenen RAID-Leveln zu fahren und damit Performance beziehungsweise Datensicherheit zu gewinnen. Zwar muss der Prozessor dafür etwas Leistung einbüßen, da er sich um Dinge kümmern muss, die ansonsten ein RAID-Controller übernehmen würde, doch kann man das auf modernen, leistungsfähigen Rechnern durchaus in Kauf nehmen.
Zuerst wollen wir jedoch klären, was »RAID« überhaupt ist, welche Unterschiede getroffen werden und was das für Linux bedeutet.
RAID
Ein RAID (Redundant Array of Inexpensive/Independet Disks) dient zur Organisation mehrerer Festplatten in einem Computersystem.
Performance und Sicherheit
Man kann nun ein RAID unterschiedlich nutzen, je nachdem, ob man in erster Linie Performance, Datensicherheit durch Redundanz oder eine möglichst gute Mischung beider Vorteile haben will.
Die wichtigsten Arten ein RAID zu betreiben – die sogenannten RAID-Level – sind in der folgenden Übersicht zusammengefasst:
- Level 0
Parallelisierung
- Bei RAID 0 (Striping) werden mehrere Festplatten ohne Fehlertoleranz zusammengeschlossen. Um eine Performance-Verbesserung zu erreichen, werden dabei jeweils Schreib- und Leseoperationen parallel auf allen verfügbaren Platten durchgeführt. Es wird also zum Beispiel Datenblock 1 auf die Platte 1 geschrieben, während gleichzeitig Datenblock 2 auf Platte 2 geschrieben wird.
- Fällt hier allerdings eine Platte aus, so können die Daten nicht wiederhergestellt werden, da keine Fehlertoleranz genutzt wurde. Daher ist RAID 0 auch eigentlich kein echtes RAID, da die Daten nicht redundant gespeichert werden.
- Level 1
Spiegelung
- Auf RAID 1-(Mirroring-)Systemen wird eine Festplatte einfach nur von einer anderen Platte permanent gespiegelt. Fällt eine der Platten aus, können die Daten selbstverständlich von der anderen Platte noch rekonstruiert werden. Auch wenn man es auf den ersten Blick vielleicht übersieht:
- Auch hier ist zumindest beim Lesen ein Performance-Gewinn möglich, da eine große Datei parallel von beiden Platten gelesen werden kann.
- Da RAID 1 aber bezüglich der verwendeten und dann nutzbaren Kapazität recht ineffizient und teuer ist, wird es meist nur bei sehr kleinen Servern eingesetzt.
- Level 5
- Der RAID-Level 5 (Striping and distributed parity mode) versucht, die Vorteile von Level 0 und Level 1 zu kombinieren, indem eine Paritätsinformation <Die Paritätsinformation wird datenblockweise in einer Art und Weise gebildet, dass bei dem Verlust von einem Datenblock dieser wiederhergestellt werden kann. Für alle, die es interessiert: Die mathematische Funktion xor leistet genau das Gewünschte: a xor b = c, a xor c = b und bxor c = a.> auf den Platten verteilt wird. Für RAID 5 braucht man mindestens 3 Platten und kann dann bei $n$ Platten immerhin der Gesamtkapazität effektiv nutzen. Man braucht also nur eine Platte für die Paritätsinformation.
- Dadurch, dass für jeden Datenblock auch die Paritätsinformation geschrieben werden muss, dauert das Schreiben natürlich länger als bei anderen RAID-Leveln. Dafür erfolgt das Lesen ähnlich wie bei RAID 0 parallel von mehreren Platten, und ist daher prinzipiell schneller als bei einzelnen Festplatten. Aufgrund dieser Datensicherheit durch Redundanz sowie des Performance-Gewinns ist RAID 5 der am meisten genutzte RAID-Level.
So ein RAID kann nun auf unterschiedliche Weise realisiert werden; so gibt es zum Beispiel RAID-Controller in Hardware und Software. Eine Softwarelösung wäre zum Beispiel die im Folgenden beschriebene Soft-RAID-Implementierung im Linux-Kernel. Dort kann man einzelne Festplatten zu neuen, virtuellen Devices zusammenfassen, die man dann wie ganz normale Platten auch ins Dateisystem einbinden kann. Ein Hardware-RAID funktioniert vom Prinzip her nicht anders, nur dass die Intelligenz nicht in Form von Softwaretreibern für das Betriebssystem, sondern in Mikrochips implementiert ist.
SoftRAID konfigurieren
Die Verwaltung von mehreren unabhängigen Festplatten beziehungsweise Partitionen als ein RAID-Device fällt eindeutig in den Aufgabenbereich des Kernels, was bei der Übersetzung des Kernels die Einbindung entsprechender Features direkt oder als Modul voraussetzt.
Setzt man nun einen Standard-Kernel ein, so wird man die benötigten Treiber in der Regel als Modul finden. So kann man zum Beispiel den Support für RAID5 durch das Laden des gleichnamigen Moduls aktivieren:
# modprobe raid5
Listing 9.74 Die benötigten Module laden
Da modprobe alle durch Abhängigkeiten benötigten Module automatisch mitlädt, werden die Module »md« und »xor« mitgeladen, wie man an der Ausgabe von lsmod erkennt:
# lsmod raid5 22592 0 md 49544 1 raid5 xor 15688 1 raid5 …
Listing 9.75 lsmod
Sind die Module eingebunden, so wird im /proc-Verzeichnis die Datei mdstat angelegt, die immer den aktuellen RAID-Status des Systems enthält. Zu Anfang ist jedoch noch kein RAID konfiguriert:
$ cat /proc/mdstat Personalities : [raid5] unused devices: <none>
Listing 9.76 Die /proc/mdstat
Möchte man nun ein RAID-System konfigurieren, braucht man bestimmte Programme. Früher hat man dazu oft das raidtools-Paket herangezogen, jedoch ist man mit der Zeit zum einfacheren mdadm gewechselt. Nach der Installation des entsprechenden Pakets kann man nun ein RAID anlegen.
Normalerweise würde man als Devices zum Zusammenstellen eines RAIDs verschiedene, möglichst gleich große Partitionen <Die kleinste Partition bestimmt die Gesamtgröße des RAIDs, da alle Platten parallel genutzt werden.> auf unterschiedlichen Festplatten zusammenschließen. Da jedoch die meisten Heimbenutzer eben keine zwei oder drei Festplatten übrig haben, kann man zum Testen auch Ramdisks nehmen.
Eine Ramdisk ist ein Bereich im Hauptspeicher, der nicht Programmen zur Vefügung steht, sondern mit einem Dateisystem formatiert und in das VFS (virtual file system) eingebunden werden kann.
Der Aufruf von mdadm zum Anlegen eines neuen RAID5-Devices aus drei Ramdisks sieht nun wie folgt aus:
# mdadm --create --verbose /dev/md0 --level=raid5 --raid-devices=3 /dev/rd/0 /dev/rd/1 /dev/rd/2 mdadm: layout defaults to left-symmetric mdadm: chunk size defaults to 64K mdadm: size set to 8128K mdadm: array /dev/md0 started.
Listing 9.77 Ein RAID-System anlegen
Als Ausgabe erhält man auch gleich die entsprechenden Erfolgsmeldungen. An der /proc/mdstat kann man ebenfalls die Veränderung erkennen. Dort wird aufgeführt, dass md0 ein RAID5-Gerät ist und aus drei Ramdisks besteht:
# cat /proc/mdstat Personalities : [raid5] md0 : active raid5 ram2[2] ram1[1] ram0[0] 16256 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU] unused devices: <none>
Listing 9.78 Änderungen in der /proc/mdstat
Dateisystem formatieren
Bevor wir das RAID nun nutzen können, muss es zuerst mit einem Dateisystem formatiert werden. Bei richtigen (Soft-)RAID-Systemen wird man hier noch einige Parameter zur Performance-Verbesserung anpassen wollen, aber da eine Ramdisk im Gegensatz zu einer Festplatte auch so unschlagbar schnell ist, wollen wir es hier bei einem einfachen Aufruf belassen:
# mke2fs /dev/md0 mke2fs 1.38-WIP (20-Jun-2005) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 4064 inodes, 16256 blocks 812 blocks (5.00%) reserved for the super user …
Listing 9.79 Unser RAID formatieren ...
Nun kann unser neues Device auch gemountet werden. Im Anschluss daran könnte man nun Dateien speichern und das RAID als vollwertiges Dateisystem nutzen.
# mount -t ext2 /dev/md0 /mnt/ # mount … /dev/md/0 on /mnt/ type ext2 (rw) # ls /mnt/ lost+found
Listing 9.80 ... und mounten!
In unserem Fall sind jedoch alle Einstellungen und Formatierungen spätestens nach dem nächsten Neustart vergessen, schließlich wurde alles nur im flüchtigen Hauptspeicher angelegt.
Diese Ausführungen sollen an dieser Stelle genügen. Es wurde g, wie SoftRAID funktioniert und wie man es aufsetzen könnte. Da diese Informationen natürlich für einen ernsthaften Einsatz nicht ausreichen, findet sich auf der Buch-DVD das SoftRAID-HOWTO, in dem Details zum Performance-Tuning und zur Verwaltung zur Laufzeit zu finden sind. Ansonsten hilft natürlich auch die sehr ausführliche Manpage zu mdadm weiter.
9.5.6 Backups, Archive & Co.
Auch ein RAID-System, das dank Redundanzen den Ausfall von einer bis teilweise mehreren Festplatten verkraften kann, schützt nicht vor einen Totalausfall. Aber es muss nicht einmal das ganze Haus abbrennen, wenn ein Backup benötigt wird:
Auch wenn man versehentlich eine wichtige Datei löscht, ist es immer gut, noch irgendwo eine Sicherungskopie zu haben.
Sicherung bestimmter Dateien
In der Regel möchte man dabei nicht das ganze System, sondern nur ausgewählte Dateien sichern. Diese befinden sich oft in einem bestimmten Verzeichnis, oder es handelt sich um eine einzelne besondere Datei. Anstatt diese Daten nun einfach nur zu kopieren, bietet es sich an, sie vorher zu komprimieren.
Wo man unter Windows die Daten einfach »zippen« würde, ist unter Linux ein etwas anderes Vorgehen angebracht.
Es wird nämlich zwischen einem Archiv und einer gepackten Datei unterschieden:
Ein Archiv enthält mehrere Dateien und Verzeichnisse, während eine gepackte Datei einfach nur eine einzige komprimierte Datei darstellt.
Archive mit tar
Rechte erhalten
Damit Rechte und andere Dateiattribute erhalten bleiben, werden mehrere Dateien vor dem Packen in ein Archiv gesteckt.
Das hat den Vorteil, dass bei Änderungen an den Dateiattributen nicht jedes einzelne Komprimierungsprogramm neu geschrieben werden muss. Vor allem, wenn man an ACLs denkt, kann man sich sehr gut vorstellen, dass diese Trennung sinnvoll ist.
Das Archivierungsprogramm der Wahl ist unter Linux so gut wie immer tar, der Tape ARchiver.
Wie man dem Namen entnehmen kann, stammt das Programm aus einer Zeit, als Backups noch auf große Magnetbänder geschrieben wurden – und ACLs auch noch weitgehend unbekannt waren.
$ tar -c Verzeichnis > Verzeichnis.tar $ ls *.tar Verzeichnis.tar
Listing 9.81 Ein Archiv mit tar erstellen
tar schreibt die binären Daten standardmäßig einfach auf die Standardausgabe, also in unserem Fall auf den Bildschirm. Weil wir sie aber nicht da, sondern lieber in einer Datei haben wollen, müssen wir die Ausgabe mit dem >-Operator in eine Datei umlenken. Alternativ könnte man mit der Option »-f« auch einen Dateinamen auf der Kommandozeile angeben.
Möchten wir das Ganze auch noch packen, dann müssen wir zur Option -c für »create« auch noch ein -z packen, um das Resultat dann auch noch zu gzippen. Das erspart uns den Aufruf eines Extraprogramms, und so ist es also nicht ganz richtig, dass wir am Anfang sagten, dass Archivierer und Packer streng voneinander getrennt sind. Das Resultat ist es allerdings: Es handelt sich um ein gepacktes tar-Archiv.
$ tar -cz Verzeichnis > Verzeichnis.tar.gz $ ls *.gz Verzeichnis.tar.gz
Listing 9.82 Ein komprimiertes Archiv mit tar erstellen
Jetzt haben wir alle Dateien im »Verzeichnis« wirklich gepackt. Da Linux nicht auf das DOS-Format von 8.3-Dateinamen <Unter DOS waren Dateinamen auf 8 Buchstaben vor und 3 nach dem Punkt beschränkt.> beschränkt ist, drücken wir die Beziehung, dass wir das »Verzeichnis« erst gepackt und dann komprimiert haben, durch die Endung .tar.gz aus, die aber oft auch als .tgz abgekürzt wird.
Möchten wir so ein Archiv wieder entpacken, nutzen wir statt -c für »Create« einfach die Option -x für »eXtract«. Handelt es sich um ein gzip tar-Archiv, packen wir, wie beim Erstellen, einfach nur noch das -z dazu.
$ tar -xz Verzeichnis.tar.gz
Listing 9.83 Ein Archiv mit tar entpacken
Weitere wichtige Optionen von tar sind im Folgenden aufgelistet:
- -r, --append
- Ruft man tar mit dieser Option auf, so kann man Dateien zu einem bestehenden Archiv hinzufügen. Ein Beispiel könnte so aussehen:
$ tar -cf a.tar Ausarbeitung/ $ tar -rf a.tar paper-ssl.pdfListing 9.84 Dateien hinzufügen
- Im zweiten Schritt wird hier die Datei paper-ssl.pdf zum bereits bestehenden Archiv a.tar hinzugefügt.
- -t, --list
Was ist drin?
- Diese Option gibt den Inhalt eines Archivs aus:
$ tar -tf a.tar Ausarbeitung/ … Ausarbeitung/vortrag.tex paper-ssl.pdf
Listing 9.85 Inhalt anzeigen
- Im Beispiel wurde also der Inhalt des eben erzeugten Archivs ausgegeben, das wie erwartet den Inhalt des Verzeichnisses Ausarbeitung sowie die PDF-Datei enthält.
- -u, --update
- Mit dieser Option kann man Dateien in einem Archiv aktualisieren, die neuer als die dort enthaltenen Versionen sind.
- -d, --diff
- Mit dieser Option kann man Unterschiede zwischen einem Archiv und den auf dem Dateisystem gespeicherten Daten finden:
$ tar -df a.tar paper-ssl.pdf: Änderungszeit ist unterschiedlich paper-ssl.pdf: Größe ist unterschiedlich
Listing 9.86 Änderungen erkennen
- Es hat sich also etwas an der PDF-Datei geändert.
In dem Beispiel wurde, anstatt über die Ein-/Ausgabeumlenkung zu arbeiten, illustriert, wie man über den Parameter »-f« (wie weiter oben beschrieben) das Archiv auch auf der Kommandozeile angeben kann. Konsistenterweise müsste man für die Arbeit mit einem mittels gzip komprimierten Archiv nur die Option »-z« auf der Kommandozeile hinzufügen. Mit den unterschiedlichen Komprimierungsmethoden wollen wir uns nun im Folgenden näher beschäftigen.
Komprimieren mit gzip, bzip2 und compress
Wie bereits erwähnt wurde, gibt es nämlich unterschiedliche Komprimierungsprogramme, die alle unterschiedliche Algorithmen einsetzen und daher mehr oder weniger effektiv beziehungsweise effizient sind. Je stärker eine Datei komprimiert wird, umso länger muss in der Regel diese Komprimierung berechnet werden.
Im Folgenden stellen wir die entsprechenden Komprimierungsprogramme einander gegenüber. Dazu haben wir unser Buchverzeichnis gepackt, das im Original zum aktuellen Zeitpunkt stolze 13 Megabyte umfasst. <Mittlerweile sind es 243 MB, davon sind etwa 2200 KB .tex-Dateien!>
$ ls -lh Buch* -rw-r--r-- 1 jploetner users 2.2M Oct9 Buch.tar.bz2 -rw-r--r-- 1 jploetner users 3.7M Oct9 Buch.tar.gz -rw-r--r-- 1 jploetner users 3.8M Oct9 Buch.Z -rw-r--r-- 1 jploetner users 13M Oct9 Buch.tar …
Listing 9.87 Vergleich der Komprimierungsprogramme
Unterschiedlicher Erfolg
Wie Sie sehen können, sind die Ergebnisse doch sehr unterschiedlich. Das GNU Programm gzip ist in Verbindung mit tar äquivalent zum PKZip aus der DOS/Windows-Welt und liefert ein mittleres Ergebnis.
Mit Abstand die kleinste Datei hat bzip2 erzeugt, allerdings hat das Programm dafür auch am längsten gebraucht. Das ist ein Grund dafür, weshalb man in der Unix-welt oft auf den Kompromiss gzip zurückgreift.
Man sieht ebenfalls sehr schön, dass tar die Daten standardmäßig nicht packt – das .tar-Archiv ist nämlich genauso groß wie das Verzeichnis selbst. Nun möchten wir die Komprimierungsprogramme kurz einzeln vorstellen und ihre Bedienung erläutern.
compress
Dieses Programm hat mittlerweile nur noch historische Bedeutung und wird in der Praxis kaum noch eingesetzt. Die Programme zum Packen bzw. Entpacken heißen compress und uncompress, und die meist auf ».Z« endenden Dateien werden dabei einfach auf der Kommandozeile übergeben. Weil compress kaum noch genutzt wird, ist auf vielen Systemen oft nur uncompress vorhanden. So haben Sie zwar die Möglichkeit, noch vorhandene alte Archive zu entpacken, jedoch nicht die Möglichkeit, neue zu erstellen.
bzip2
Das bisher effektivste unter den Komprimierungsprogrammen wird durch die Kommandos bzip2 und bunzip2 gesteuert, an die sich der Dateiname der zu komprimierenden Datei anschließt. Optional kann man beim Packen beispielsweise noch das Verhältnis von Geschwindigkeit und Effektivität durch die Parameter –1 bis –9 steuern, wobei –1 die schnellste und –9 die effektivste Art zu packen bezeichnet.
Mit gepackten Dateien arbeiten
Hat man eine gepackte Textdatei, <Was bei großen Textdateien durchaus sinnvoll ist ...> so kann man diese auch lesen, ohne sie gleich entpacken zu müssen. Für diesen Fall gibt es nämlich das praktische Programm bzcat, das den Inhalt der Datei dann einfach ausgibt, ohne dass man diese vorher extra entpacken müsste:
$ bzcat Readme.bz2 Das ist ein Test. $
Listing 9.88 Gepackte Dateien lesen: bzcat
Ein mit bzip2 gepacktes TAR-Archiv heißt dann entsprechend file.tar.bz2, und aus tar heraus kann man auf die bzip-Kompression mit dem Parameter »-j« zugreifen, der dann beim Packen und Entpacken anstelle des »-z« wie bei GZip gesetzt wird.
gzip
Die einfache Steuerung durch zwei Programme zum Packen und Entpacken gibt es für GZip natürlich auch – gzip und gunzip. Allerdings gibt es für das beliebte und populärste Packprogramm weitaus mehr Tools als nur ein zcat wie bei bzip2. Es sind nämlich unter anderem diff, less und grep jeweils durch ein vorangestelltes z auch für so gepackte Dateien verfügbar.