14.5 Dateisystemverwaltung
In diesem Abschnitt wollen wir uns nun um Verwaltungsaufgaben kümmern, die mit dem Dateisystem zu tun haben. Dabei gibt es wiederum Grundlagen, die vor den eigentlich interessanten Themen behandelt werden müssen. Im ersten Kapitel haben wir dabei schon das VFS, das Mounting sowie /etc/fstab erwähnt. Diese Themen wollen wir nun aufgreifen.
14.5.1 /etc/fstab
Betrachten wir im Folgenden noch einmal das Beispiel aus Kapitel 5, und konzentrieren wir uns dabei auf die Felder, die wir noch nicht besprochen haben:
Listing 14.64 Eine /etc/fstab-Datei
# Proc-Verzeichnis
proc /proc proc defaults 0 0
# Festplatten-Partitionen
UUID=c5d055a1-8f36-41c3-9261-0399a905a7d5
/ ext3 relatime,errors=remount-ro 0 1
UUID=c2ce32e7-38e4-4616-962e-8b824293537c
/home ext3 relatime 0 2
# Swap
/dev/sda7 none swap sw 0 0
# Wechseldatenträger
/dev/scd0 /mnt/dvd udf,iso9660 user,noauto,exec,utf8 0 0
Aufbau
Der Aufbau dieser Datei ist tabellarisch. Jeder Datensatz steht in einer eigenen Zeile, jedes Attribut ist durch 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. Beschreibt ein Datensatz jedoch den Swap-Auslagerungsspeicher, so ist hier kein Mountpoint, sondern »none« anzugeben.
Das dritte Feld legt das Dateisystem fest. Auf einer CD-ROM findet sich schließlich ein ganz anderes Dateisystem als auf einer Windows- oder Linux-Partition. Generell können hier folgende Dateisystemtypen angegeben werden:
- ext
Der Vorläufer des bei Linux hauseigenen Dateisystems ext2. - ext2
Dieses Dateisystem erlaubt recht lange Dateinamen und benutzt Inodes zur Verwaltung der Dateien. - ext3/ext4
Die aktuellen Journaling-Versionen des ext2-Dateisystems. Diese Extended-Dateisysteme sind speziell für Linux entwickelt worden und damit für den Einsatz damit 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 und ext4 ein langes Überprüfen der Partition, wenn beispielsweise durch einen Stromausfall das Dateisystem nicht ordentlich ausgebunden 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 Journaling. - reiserfs
ReiserFS (Filesystem) 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 fertiggestellt war, wurde ReiserFS aufgrund seiner Journaling-Fähigkeiten dem Dateisystem 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 hiermit auch von Linux aus genutzt werden. - ntfs
Das Dateisystem NTFS von Microsoft, das auf neueren Windows-Versionen zum Einsatz kommt, wird ebenfalls (jedoch nicht immer mit Schreibzugriff) unterstützt. - iso9660
Dieses Dateisystem wird auf CD-ROMs und DVDs verwendet. - nfs
Das Netzwerkdateisystem 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 mit Ausnahme von Performanceaspekten nicht von lokalen Verzeichnissen zu unterscheiden. - proc
Das Prozessdateisystem proc enthält unter anderem Informationen über die aktuellen Prozesse des Rechners sowie andere Einstellungen und Laufzeitdaten des Kernels. Dieses Dateisystem ist ein Pseudodateisystem, da Sie die Dateien und Verzeichnisse zwar sehen, aber alles auf Ihren Zugriff hin zur Laufzeit für Sie erstellt wird. Es benötigt also keinerlei Platz auf der Festplatte.
Die vierte Spalte wird zur Festlegung einiger Optionen benutzt. Mehrere angegebene Optionen werden durch ein Komma getrennt. Die wichtigsten lauten:
- auto/noauto
Hiermit wird festgelegt, ob ein Dateisystem automatisch beim Booten gemountet werden soll. Mountet man ein Dateisystem nicht beim Booten, so genügt später ein einfaches mount mit dem Mountpoint oder dem Device als Parameter, um das Dateisystem einzubinden.
Integration ins VFS
- user=steffen,gid=1000
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 hier vorgegebenen (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 den SUID- und SGID-Berechtigungen ausgeführt werden dürfen. Vor allem für »fremde« (Netzwerk-)Dateisysteme 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 angepasst werden sollen oder nicht. - dev/nodev
Erlaubt beziehungsweise verbietet die Nutzung von Character- und Block-Geräten in diesem Dateisystem. 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, so dürfen auch andere Benutzer das Medium mounten. - default
Diese Option setzt die Optionen rw, suid, dev, exec, auto, nouser und async.
Es existieren noch einige weitere, teilweise dateisystemspezifische Optionen, die an dieser Stelle nicht weiter erläutert werden sollen. Falls Sie sich dafür 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 auf eine Zahl größer Null gesetzt, so überprüft fsck beim Booten nach einem fehlerhaften oder ganz fehlenden Unmount (beispielsweise nach dem 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.
14.5.2 mount
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.
Ein Aufruf von mount hat die Form mount Optionen Quelldateisystem Mountpunkt, also etwa mount -t ext3 /dev/sdb1 /public. In diesem Beispiel wurde die erste Partition der zweiten Festplatte [Fn. Genauer gesagt: der Primary Slave des SATA-Hostadapters.], auf der sich ein ext3-Dateisystem befindet, in das Verzeichnis /public gemountet. Ruft man mount ohne Parameter auf, werden alle aktuell eingehängten Dateisysteme angezeigt:
Listing 14.65 Was haben wir denn Feines eingehängt?
# mount
/dev/sda5 on / type ext3 (rw)
proc on /proc type proc (rw)
...
[+]Mit dem Kommando umount wird ein Dateisystem wieder ausgehängt. Einsteigern bereitet dieses Kommando jedoch oft Kopfzerbrechen, da sich so manches Dateisystem nicht ohne Weiteres unmounten lässt. Dies liegt dann oft daran, dass noch ein Prozess läuft, der sein aktuelles Arbeitsverzeichnis in diesem Dateisystem hat – beispielsweise befindet man sich mit dem Arbeitsverzeichnis der Shell oft selbst noch im Mountpoint.
Listing 14.66 Unmounten einer Partition
# umount /public
14.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. Dies ist auf Mehrbenutzersystemen oft effektiver, als auf die Kooperation der Nutzer zu hoffen. Quotas werden somit vor allem in größeren Unix-Rechenzentren eingesetzt.
Es sei hier erwähnt, dass Quotas in erster Linie von den ext-Dateisystemen in dieser Form unterstützt werden. Möchte ein Prozess eine Datei anlegen oder anderweitig mehr Speicherplatz beanspruchen, so prüft der Kernel zuerst, ob der mit dem Prozess assoziierte Nutzer überhaupt das 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 Limits setzen und trotzdem zeitweilige Ansprüche befriedigen.
Um solche Speicherplatzbeschränkungen einrichten zu können, muss zunächst der Quota-Support in den Kernel kompiliert 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.
Listing 14.67 Aktivieren von Quotas in der fstab-Datei
/dev/sda3 /home ext3 defaults,usrquota,grpquota 1 2
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 Dateien beim Erstellen auch leer sein können, reicht ein Anlegen der Dateien mit touch, dass leere Dateien anlegen bzw. die zeitlichen Zugriffswerte von Dateien ändern kann:
Listing 14.68 Anlegen einer quota.user-Datei
# cd /home
# touch quota.user
Mit den Kommandos quotaon und quotaoff kann nun der Administrator die Quotas aktivieren und wieder abschalten. Sinnvollerweise sollten die Befehle, soweit sie noch nicht von der Distribution über ein bestimmtes Paket [Fn. 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 sind, in ein Skript in /etc/init.d eingebaut werden. Am besten eignet sich dafür die Datei /etc/init.d/boot oder die /etc/init.d/boot.local, in die beispielsweise folgende Zeilen eingefügt werden könnten:
Listing 14.69 Quotas im Initscript
if [ -x /usr/sbin/quotaon ]
then
echo "Aktivieren der Speicherplatzbeschränkung"
/usr/sbin/quotaon -avug
fi
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 Performancegründen allerdings hierfür 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 den in der Shellvariablen EDITOR benannten Editor. Es wird sich dann die Möglichkeit eröffnen, für die Werte soft = 0, hard = 0 entsprechende Grenzen einzutragen. Aber Vorsicht: Hier sind die Größen in Blocks oder Inodes angegeben! 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.
Listing 14.70 Die Limits für den Benutzer »jploetner« ändern
# edquota -u jploetner
Quotas for user jploetner:
/dev/sda3:
blocks in use: 6, limits (soft = 0, hard = 0)
inodes in use: 5, limits (soft = 0, hard = 0)
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 Frist mit dem Parameter -t:
Listing 14.71 Die grace-time setzen
# edquota -t
Time units may be: days, hours, minutes, or seconds
Grace period before enforcing soft limits for users:
/dev/sda3:
block grace period: 0 days,
file grace period: 0 days
Nach dem Speichern der Datei und dem Beenden des Editors werden die Daten schließlich übernommen. Wir könnten Ihnen nun noch sehr viel über die vielfältigen Spielereien erzählen, die mit Quotas möglich sind, jedoch würde dies den Rahmen des Kapitels sprengen. Stattdessen wollen wir uns von der administrativen Sichtweise verabschieden und im Folgenden einen Blick auf die Benutzer in einer von Quotas bestimmten Welt werfen.
Benutzer und Quotas
Natürlich werden Benutzer durch Quotas in dem ihnen zur Verfügung stehenden Speicherplatz eingeschränkt. Die Frage ist jedoch, wie sie mit dieser Einschränkung umgehen können. Grundsätzlich sollten die Benutzer einen Überblick über den bisher verbrauchten Speicher sowie die gesetzten Grenzen haben. Dazu können sie recht einfach das quota-Programm nutzen:
Listing 14.72 Das quota-Programm
$ 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
Natürlich kann sich auch der Administrator über die Option -u, gefolgt vom Benutzernamen, beziehungsweise -g, gefolgt vom Gruppennamen, diese Daten anzeigen lassen.
14.5.4 du und df
In diesem Zusammenhang ebenfalls interessant sind Informationen über die Gesamtgröße bestimmter Verzeichnisse oder Dateisammlungen. Zu diesem Zweck gibt es das Tool du:
Listing 14.73 Verzeichnisplatz anzeigen: du
$ du -h Kompendium/
12K Kompendium/CVS
12K Kompendium/images/CVS
13M Kompendium/images
45M Kompendium/
Offensichtlich zeigt du also den aufsummierten Speicherverbrauch eines bestimmten Verzeichnisses an – alternativ auch einer Datei oder mehrerer Dateien – samt aller Unterverzeichnisse. Hier 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 wird 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:
Listing 14.74 Nur die Summen: du -sch
$ du -sch Kompendium/
45M Kompendium/
45M insgesamt
Mit du behält der Benutzer auf einem durch Quotas reglementierten Dateisystem einen guten Überblick über seinen Speicherplatzverbrauch.
In größeren Maßstäben denken: df
Größe eines Dateisystems
Dagegen ist das df-Tool (vom 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:
Listing 14.75 Platz auf der Platte: df
$ 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
Vielleicht werden Sie sich an dieser Stelle fragen, warum der verfügbare Plattenplatz, addiert zum 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 im gleichnamigen Kapitel 28.
14.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 sonst ein RAID-Controller übernehmen würde, doch kann man diese Einbuße auf modernen, leistungsfähigen Rechnern durchaus in Kauf nehmen.
Zuerst wollen wir jedoch klären, was ein RAID überhaupt ist, welche Unterschiede bestehen und was das für Linux bedeutet.
RAID
Ein RAID (Redundant Array of Inexpensive/Independent Disks) dient zur Organisation mehrerer Festplatten in einem Computersystem.
Performance und Sicherheit
Man kann ein RAID unterschiedlich nutzen, je nachdem, ob man in erster Linie Performance, Datensicherheit durch Redundanz oder eine möglichst gute Kombination aus beiden Vorteilen haben will. Die wichtigsten Arten, ein RAID zu betreiben – die sogenannten RAID-Level – sind in der folgenden Übersicht zusammengefasst:
Parallelisierung
- Level 0
Bei RAID 0 (Striping) werden mehrere Festplatten ohne Fehlertoleranz zusammengeschlossen. Um eine Performanceverbesserung 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 und gleichzeitig Datenblock 2 auf Platte 2 geschrieben.
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.
Spiegelung
- Level 1
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 dann selbstverständlich von der anderen Platte aus rekonstruiert werden. Auch wenn man es auf den ersten Blick vielleicht übersieht, ist hier zumindest beim Lesen ein Performancegewinn möglich, da eine große Datei parallel von beiden Platten gelesen werden kann. - 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 [Fn. Die Paritätsinformation wird datenblockweise in einer Art und Weise gebildet, dass beim Verlust eines Datenblocks 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 b XOR c = a.] auf den Platten verteilt wird. Für RAID 5 braucht man mindestens 3 Platten und kann dann bei $n$ Platten immerhin $\frac{n-1}{n}$ der Gesamtkapazität effektiv nutzen. Man braucht also nur eine Platte für die Paritätsinformation.
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.
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 meistgenutzte RAID-Level.
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 bspw. die im Folgenden beschriebene Soft-RAID-Implementierung im Linux-Kernel. Dort kann man einzelne Festplatten zu neuen, virtuellen Devices zusammenfassen, die sich dann wie ganz normale Platten ins Dateisystem einbinden lassen. 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. Man kann zum Beispiel den Support für RAID 5 durch Laden des gleichnamigen Moduls aktivieren:
Listing 14.76 Die benötigten Module laden
# modprobe raid5
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:
Listing 14.77 lsmod
# lsmod
raid5 22592 0
md 49544 1 raid5
xor 15688 1 raid5
...
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:
Listing 14.78 Die /proc/mdstat
$ cat /proc/mdstat
Personalities : [raid5]
unused devices: <none>
Möchte man nun ein RAID-System konfigurieren, so benötigt man bestimmte Programme. Früher hat man zur Konfiguration oft das raidtools-Paket herangezogen, jedoch ist man mit der Zeit zum einfacheren mdadm übergegangen. 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 [Fn. Die kleinste Partition bestimmt die Gesamtgröße des RAIDs, da alle Platten parallel genutzt werden.] auf unterschiedlichen Festplatten zusammenschließen. Da jedoch die meisten Heimanwender eben keine zwei oder drei Festplatten übrig haben, kann man zum Testen auch Ramdisks verwenden.
Eine Ramdisk ist ein Bereich im Hauptspeicher, der nicht Programmen zur Verfü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 RAID 5-Devices aus drei Ramdisks sieht nun wie folgt aus:
Listing 14.79 Ein RAID-System anlegen
# 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.
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 RAID 5-Gerät ist und aus drei Ramdisks besteht:
Listing 14.80 Änderungen in der /proc/mdstat
# 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>
Dateisystem formatieren
Bevor wir das RAID nun nutzen können, muss es mit einem Dateisystem formatiert werden. Bei richtigen (Soft-)RAID-Systemen wird man hier noch einige Parameter zur Performanceverbesserung 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:
Listing 14.81 Unser RAID formatieren ...
# 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
...
Nun kann unser neues Device auch gemountet werden. Im Anschluss daran könnte man Dateien speichern und das RAID als vollwertiges Dateisystem nutzen.
Listing 14.82 ... und mounten!
# mount -t ext2 /dev/md0 /mnt/
# mount
...
/dev/md/0 on /mnt/ type ext2 (rw)
# ls /mnt/
lost+found
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 gezeigt, 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 Sie Details zum Performance-Tuning und zur Verwaltung zur Laufzeit finden. Ansonsten hilft Ihnen natürlich auch die sehr ausführliche Manpage zu mdadm weiter.
14.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 einem Totalausfall. Es muss nicht einmal das ganze Haus abbrennen, damit ein Backup benötigt wird: Auch wenn man versehentlich eine wichtige Datei löscht, ist es vorteilhaft, 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. Man unterscheidet hier nämlich zwischen einem Archiv und einer gepackten Datei:
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 bei der Komprimierung erhalten bleiben, werden mehrere Dateien vor dem Packen in ein Archiv gesteckt. Dies hat den Vorteil, dass bei Änderungen an den Dateiattributen nicht jedes einzelne Komprimierungsprogramm neu geschrieben werden muss. Vor allem im Hinblick auf ACLs ist diese Trennung sinnvoll.
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.
Listing 14.83 Ein Archiv mit tar erstellen
$ tar -c Verzeichnis > Verzeichnis.tar
$ ls *.tar
Verzeichnis.tar
tar schreibt die binären Daten standardmäßig einfach auf die Standardausgabe, also in unserem Fall auf den Bildschirm. Weil wir sie aber nicht dort, 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 packen, dann müssen wir zur Option -c für create noch ein -z anfügen, um das Resultat dann zu gzippen. Das erspart uns den Aufruf eines Extraprogramms, und so ist es also nicht ganz richtig, wenn wir am Anfang sagten, dass Archivierer und Packer streng voneinander getrennt sind. Das Resultat ist es allerdings dasselbe wie nach einem getrennten Aufruf des Komprimierungsprogramms gzip: Es handelt sich um ein gepacktes tar-Archiv.
Listing 14.84 Ein komprimiertes Archiv mit tar erstellen
$ tar -cz Verzeichnis > Verzeichnis.tar.gz
$ ls *.gz
Verzeichnis.tar.gz
Jetzt haben wir alle Dateien im »Verzeichnis« wirklich gepackt. Da Linux nicht auf das DOS-Format von 8.3-Dateinamen [Fn. Unter DOS waren Dateinamen auf acht Buchstaben vor und drei 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 ein solches Archiv wieder entpacken, nutzen wir statt -c für create einfach die Option -x für eXtract. Handelt es sich um ein mit gzip komprimiertes tar-Archiv, packen wir, wie beim Erstellen, einfach nur noch das -z dazu.
Listing 14.85 Ein Archiv mit tar entpacken
$ tar -xz Verzeichnis.tar.gz
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: - Diese Option gibt den Inhalt eines Archivs aus:
- -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 ermitteln Sie Unterschiede zwischen einem Archiv und den auf dem Dateisystem gespeicherten Daten:
Listing 14.86 Dateien hinzufügen
$ tar -cf a.tar Ausarbeitung/
$ tar -rf a.tar paper-ssl.pdf
Im zweiten Schritt wird hier die Datei paper-ssl.pdf zum bereits bestehenden Archiv a.tar hinzugefügt.
-t, --listWas ist drin?
Listing 14.87 Inhalt anzeigen
$ tar -tf a.tar
Ausarbeitung/
...
Ausarbeitung/vortrag.tex
paper-ssl.pdf
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.
Listing 14.88 Änderungen erkennen
$ tar -df a.tar
paper-ssl.pdf: Änderungszeit ist unterschiedlich
paper-ssl.pdf: Größe ist unterschiedlich
In diesem Beispiel hat sich also etwas an der PDF-Datei geändert.
Hier 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 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 für diese Komprimierung gerechnet 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. [Fn. Mittlerweile sind es 773 MB, davon sind etwa 2700 KB .tex-Dateien!]
Listing 14.89 Vergleich der Komprimierungsprogramme
$ 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
...
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/Win- dows-Welt und liefert ein mittelmäßiges Ergebnis. Mit Abstand die kleinste Datei hat bzip2 erzeugt, allerdings hat das Programm dafür auch am längsten gebraucht. Dies 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. Im Folgenden möchten wir Ihnen 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 und Entpacken heißen compress und uncompress. Die meist auf .Z endenden Dateien dieser Tools 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, können jedoch keine neuen 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
Sie können eine gepackte Textdatei [Fn. Was bei großen Textdateien durchaus sinnvoll ist ...] 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 einfach ausgibt, ohne dass man diese vorher extra entpacken müsste: [Fn. Der Exaktheit halber ist zu erwähnen, dass bzcat die Datei im Hintergrund dennoch entpackt – Sie müssen sich jedoch nicht selbst darum kümmern.]
Listing 14.90 Gepackte Dateien lesen mit bzcat
$ bzcat Readme.bz2
Das ist ein Test.
$
Ein mit bzip2 gepacktes TAR-Archiv heißt dann entsprechend Datei.tar.bz2, und aus tar heraus kann man auf die BZip2-Kompression mit dem Parameter -j zugreifen, der dann beim Packen und Entpacken anstelle des Parameters -z wie beim GZip-Format gesetzt wird.
gzip
Die einfache Steuerung durch zwei Programme zum Packen und Entpacken gibt es für das GZip-Format 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 die Programme diff, less und grep jeweils durch ein vorangestelltes z auch für auf diese Weise gepackte Dateien verfügbar.
p7zip und unrar
Zwei weitere Programme zur (De-)Komprimierung sollen noch vorgestellt werden. Wir empfehlen Ihnen, lieber die seit Jahrzehnten genutzten und gleichzeitig sehr stabilen Programme bzip2 und gzip zu verwenden – doch nicht immer kann man sich aussuchen, in welchem Dateiformat man z. B. Mail-Anhänge erhält.
p7zip stellt eine Portierung von 7za.exe auf POSIX-Plattformen dar. Es unterstützt das besonders stark komprimierende 7-Zip-Format, gehört aber nicht zum Stan- dardumfang der meisten Linux-Distributionen.
Mit unrar lassen sich hingegen WinRAR-Archive unter Linux dekomprimieren. Dazu muss das Programm mit dem e-Parameter und dem jeweiligen Dateinamen aufgerufen werden. Auch unrar muss von Hand nachinstalliert werden.
Listing 14.91 Entpacken eines Winrar-Archivs
$ unrar e datei.rar
...
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.