UNIX und Festplatten |
Um eine Festplatte nutzen zu können, müssen mehrere Vorgänge durchgeführt werden. Zunächst muss eine neue Platte partitioniert werden. Das bedeutet, sie wird in mehrere Dateisysteme untergliedert. Jedes System hat sein eigenes Programm zur Partitionierung einer Platte. Im Allgemeinen findet sich über das jeweilige Systemadministrationstool ein Weg zu dem Programm, das die Partitionierung übernimmt. Man kann sie allerdings auch direkt aufrufen. Unter Linux heißt das Partitionierungstool beispielsweise fdisk, unter SCO divvy und unter MacOS X DiskUtility. Nach der Partitionierung der Platte wird jede Partition über einen Eintrag im Verzeichnis /dev referenziert.
Sowohl Solaris als auch MacOS X unterscheiden zwischen rohen (raw devices) und den logischen Partitionen. Bei Solaris werden die Links auf die Partitionen in zwei Verzeichnissen /dev/dsk und /dev/rdsk untergebracht. Als rohe Devices werden die nackten Partitionen betrachtet, während die logischen Partitionen das Dateisystem anspricht. Entsprechend unterscheiden sich beispielsweise die Parameter von newfs und mount.
mkfs /dev/hda3 |
Viele Systeme unterscheiden zwischen >>raw devices<< und den Dateisystemen derselben Partition. Diese Unterscheidung ist vor allem beim Einsatz von RAID-Systemen hilfreich. Für beide gibt es einen getrennten Eintrag im Verzeichnis /dev.
Neben den Datenpartionen verwendet UNIX eine Partition zum Swappen. Unter
Swapping versteht man das Ein- und Auslagern von Prozessen aus dem
Hauptspeicher auf die Festplatte. UNIX lagert Prozesse, die längere Zeit
nicht aktiv wurden aus, wenn der Hauptspeicher eng wird. Dadurch ist es
möglich, dass mehr Prozesse arbeiten, als in den Hauptspeicher passen.
Nun ist das Auslagern auf Platte und das Zurückholen in den Hauptspeicher
ein recht zeitaufwändiges Verfahren, da die Platte einen sehr viel langsameren
Zugriff hat als Hauptspeicher. Tatsächlich belastet das Swappen das System
bei den ersten Fällen der Speicherengpässe nicht unerheblich. Je länger das
System allerdings läuft, desto ruhiger wird es, weil mit der Zeit
diejenigen Hintergrundprozesse ausgelagert werden, die selten zum Einsatz
kommen. Solche Hintergrundprozesse, die nur auf ein bestimmtes Ereignis
warten um aktiv zu werden und die restliche Zeit schlafen, gibt es in einem
UNIX-System in hoher Zahl. Insofern ist es auch nicht beunruhigend, wenn
der Swapbereich belegt ist.
Kritisch wird es erst dann, wenn Bewegung ins Spiel kommt, also das System
häufig auslagern muss. Dann sollte man den Hauptspeicher erweitern, weil das
ständige Wechseln der Prozesse die Maschine belastet. Wenn der Speicher
derart überlastet ist, dass die Maschine ständig die Prozesse ein- und
auslagert und sonst fast nicht mehr arbeitet, redet man vom Thrashing.
Die meisten UNIX-Systeme können auch mit Swap-Dateien arbeiten. Dies kann
eine schnelle Lösung sein, wenn der Swap-Bereich zu eng wird und eine
erneute Partitionierung vermieden werden soll. Es ist aber vor allem eine
dynamische Lösung, die kurzfristige, extreme Spitzen abfängt.
Installiert man auf einem System zusätzlich zur Swappartition eine Swapdatei,
wird es auch dann keinen Programmabbruch wegen zuwenig Speicher geben, wenn
plötzlich und überraschend mehr Prozesse gestartet werden, als je voraussehbar
war.
Unter HP-UX kann am Einfachsten über das Administrationstool sam
eine Swapdatei eingerichtet werden. Der entstehende Eintrag in der
/etc/fstab:
Swapping
Heutiges Swappen ist Paging
An sich ist der Name Swappen nicht mehr ganz korrekt, da es an sich das
Auslagern ganzer Prozesse bezeichnet. Heutige Systeme arbeiten längst mit
Pagingverfahren. Das bedeutet, dass das Auslagern nicht mehr auf Prozessebene
stattfindet, sondern dass Speicherseiten fester Größe ausgelagert werden.
Man kann sich das so vorstellen, dass der Hauptspeicher in Kacheln gleicher
Größe aufgeteilt ist und das System kontrolliert, welche Kachel wie oft
benutzt wird. Auf diese Weise können Prozesse teils im RAM und teils auf
Platte liegen. Paging ist aufwändiger, aber auch wesentlich effizienter als
Swapping. Man spricht auch von virtuellem Speicher, da der Prozess
nicht merkt, dass sein Speicher zum Teil eigentlich auf der Platte ist.
swapon startet das Swappen
Das Swappen wird beim Systemstart in einem rc-Skript gestartet. Der Befehl
zum Aktivieren lautet swapon. Dabei wird es üblicherweise mit der
Option -a gestartet. Das führt dazu, dass in der /etc/fstab
nach den Swapdevices geschaut wird und diese aktiviert werden.
Größe der Swappartition
Über die Größe der Swappartition gibt es leicht ideologische
Auseinandersetzungen. Die Faustregel, den Hauptspeicher noch einmal als
Swap zu nehmen, stammt wohl daher, dass das System im Falle eines kernel
panic, also eines Totalzusammenbruchs des Betriebssystems, einen Speicherabzug
in die Swappartition schreibt.
Abgesehen von dieser Überlegung ist die Regel wenig sinnvoll,
da die Summe beider den virtuellen Speicher ausmachen. Wenn also das RAM
bereits knapp ist, sollte der Swapbereich großzügig sein. Ist jede Menge RAM
im System, kann man vielleicht sogar ganz ohne Swappartition auskommen und
nur als Sicherheit noch eine Swapdatei anlegen. Die Summe aus RAM und
Swapbereich sollte auch im schlimmsten Fall noch ausreichend sein.
Swappartitionen sind schneller als Dateien
Fast jedes UNIX verwendet eine Swap-Partition und keine Datei. Der Vorteil
liegt in der Geschwindigkeit. Der Zugriff auf die Swappartition ist
wesentlich schneller als der Zugriff über das Dateisystem. Der Nachteil ist,
dass man zum Installationszeitpunkt festlegen muß, welche Größe der Swapbereich
benötigen wird.
Swapdateien
/dev/vg00/lvol8 /users hfs rw,suid 0 2 /dev/vg00/lvol8 /users swapfs min=3840,lim=12800,pri=2 0 2 |
In der oberen Zeile sieht man, dass das Plattendevice lvol8 ein normales hfs-Dateisystem ist. Es wird auch tatsächlich für Benutzerdaten verwendet. Daneben liegt aber auch im Verzeichnis /users das sogenannte Dateisystempaging. Betrachtet man die Situation in /users, findet man dort ein Verzeichnis namens paging, in dem mehrere Dateien liegen, die zum Swappen verwendet werden. Die Parameter geben übrigens an, dass mindestens 3840 Blöcke verwendet werden sollen. Das Limit (lim=) ist 12800 Blöcke. Alle installierten Swapbereiche bekommen eine Priorität. Bei Anforderung von virtuellem Speicher wird mit der geringsten Priorität begonnen. Da auf diesem System auch eine Swappartition mit der Priorität 1 ist, wird zuerst diese ausgeschöpft, bevor auf die Datei zugegriffen wird.
mkdir /usr mount /dev/sda2 /usr |
Wird dagegen nachträglich eine Platte als Speichererweiterung eingebaut, wird man sie unter einem Dummyverzeichnis in den Verzeichnisbaum einhängen und die Zugriffe über einen symbolischen Link realisieren. Manchmal werden Platten über Verzeichnisse /u, /u1 oder /v eingehängt. Etwas ordentlicher ist es, wenn man innerhalb eines Verzeichnisses /mount oder /drives Verzeichnisse für das Einhängen der Platten einrichtet. Durch einen symbolischen Link kann man anschließend jedes beliebige Verzeichnis auf die Platte umlegen. Zum Beispiel:
mkdir /mount/hda3 mount /dev/hda3 /mount/hda3 ln -s /mount/hda3 /home/tacoss |
/dev/hda3 /mount/hda3 ext2 defaults 1 1 |
Die /etc/fstab enthält alle Dateisysteme, die beim Booten bereits eingebunden werden. Eine typische fstab sieht so aus:
/dev/hda3 swap swap defaults 0 2 /dev/hda2 /boot ext2 defaults 1 2 /dev/hda5 / ext2 defaults 1 1 /dev/cdrom /cdrom auto ro,noauto,user,exec 0 0 /dev/fd0 /floppy auto noauto,user 0 0 |
Allein durch die unterschiedlichen Namen der Dateisysteme ist die fstab nicht zwischen den UNIX-Systemen portabel. Da die Partitionseinteilung aber auch sehr individuell für jeden Computer ist, muss sie auch nicht zwischen den Systemen austauschbar sein. Immerhin sind sie so konsistent, dass man sich auch unter einem fremden UNIX-Derivat sofort darin zurecht findet.
Um den Spezialisten für die einzelnen Systeme ein gewisses Spezialwissen zu garantieren, haben die Hersteller für die gleiche Datei ein paar Variationen in die Namensgebung gebracht:
| System | Name der Datei |
|---|---|
| SCO | /etc/default/filesys |
| HP-UX 10.10 | /etc/fstab |
| Solaris | /etc/vfstab |
Bestimmte Systemverzeichnisse sind natürlich immer in Gebrauch, wie etwa das Verzeichnis /var, das von beinahe jedem Hintergrundprozess verwendet wird. Solche Verzeichnisse kann man nur im Single User Modus aushängen.
fsck /dev/hda3 |
Hat man Anlass zur Vermutung, dass ein Dateisystem nicht konsistent ist, kann man den fsck auch im laufenden Betrieb starten. Allerdings sollte das bei einem mit umount abgehängten Dateisystem durchgeführt werden, da vermieden werden muss, dass andere Benutzer parallel darauf zugreifen. Ist ein Dateisystem betroffen, das man nicht im laufenden Betrieb aushängen kann, muss man in den Single-User Modus wechseln und von dort den fsck starten.
Belegungslisten: df und du
df zeigt die Plattenbelegung
Der Befehl df (disk free) zeigt eine Liste aller Dateisysteme mit
deren Platzverbrauch und den Füllgrad in Prozent. Der Befehl ist auch nützlich,
um zu sehen, welche Dateisysteme wo eingehängt sind. Man kann sich auch einzelne Dateisysteme ansehen, indem man das Dateisystem als Parameter angibt.
gaston> df Dateisystem 1k-Blöcke Benutzt Verfügbar Ben% montiert auf /dev/hda5 7889920 4150752 3338348 56% / /dev/hda2 225517 3578 210292 2% /boot /dev/hda7 6324896 3177260 2826340 53% /home gaston> |
Ältere Systeme liefern diese Angaben in 512-Byte-Blöcken statt in Kilobyte. Oft stellt dann die Flag -k auf KB-Anzeige um. Auch der Füllgrad wird nicht von allen Systemen mitangezeigt. Durch die Option -v erscheint eine vollständigere Auflistung.
gaston# du 40 ./news/OLD 176 ./news 428 ./httpd 4 ./uucp 116 ./cups 4 ./vbox 172 ./samba 17728 . gaston# |
Da du alle Verzeichnisse rekursiv durchläuft, bekommt man eine recht lange Liste. Durch die Option -s werden nur die angeforderten Verzeichnisse aufgelistet. Dennoch muss natürlich der Verzeichnisbaum komplett durchgerechnet werden, was eine gewisse Belastung der Maschine darstellen kann. Wer schon immer eine Liste mit der Platzverteilung auf dem Produktionsserver haben wollte, sollte also seine Neugier nicht unbedingt um 11 Uhr am vormittag befriedigen, sondern den Lauf als at-Job in die Nacht legen.
gaston# du -s 17728 . gaston# |
/dev/hda3 /mount/hda3 ext2 defaults,usrquota 1 1 |
touch /mount/hda3/quota.user touch /mount/hda3/quota.group chmod 600 /mount/hda3/quota.user chmod 600 /mount/hda3/quota.group mount /dev/hda3 /mount/hda3 -o remount |
Der Befehl touch legt eine leere Datei an, wenn noch keine vorhanden ist. Anschließend werden die Rechte der Dateien auf 600 gesetzt. Das ist zwingend, damit nur root diese Dateien lesen und schreiben kann. Ansonsten arbeitet das Quota-System nicht. Zum Schluss wird ein Wiedereinhängen des Dateisystems gestartet, damit der Eintrag in der fstab gelesen wird.
quotacheck -avug /dev/hda3 |
Dieser Vorgang dauert eine Weile. Die quota.user wird mit Daten gefüllt. Anschließend kann man die Limits für die Benutzer einstellen.
edquota -u arnold |
edquota startet den Standardeditor (meist vi) mit folgenden Einträgen:
Quotas for user arnold:
/dev/hda3: blocks in use: 8117, limits (soft=0, hard=0)
inodes in use: 470, limits (soft=0, hard=0)
|
Durch Änderung der Werte in den Klammern werden das Soft- und das Hardlimit des Benutzers für die jeweilige Platte eingestellt.
Time units may be: days, hours, minutes, or seconds Grace period before enforcing soft limits for users: /dev/hda3: block grace period: 7 day, file grace period: 7 days |
Ist das Quotasystem aktiv, erhält der Benutzer bei Überschreitung seines Limits eine Meldung am Bildschirm und der Vorgang wird abgebrochen.
Lange Zeit war 2 GByte die Grenze für die maximale Größe einer Datei und die
maximale Größe eines Dateisystems. Heute erlauben fast alle UNIX-Derivate
größere Dateisysteme. Dies kann auch recht bedenkenlos genutzt werden.
Bei der Größe der Datei spielt aber auch das Programm
eine wesentliche Rolle, das die Datei liest und schreibt.
Schreibt das Programm sequentiell in die Datei, wie das beispielsweise bei
Protokolldateien der Fall ist, stellt das Betriebssystem die obere Grenze.
Wird aber im direkten Zugriff gearbeitet, dann verwendet das Programm den
Aufruf lseek() mit einem 32-Bit-Wert
als Positionierparameter. Mit 32 Bit können maximal 4.294.967.296 Bytes
adressiert werden. Sobald aber ein Vorzeichen verwendet wird, verliert man
ein Bit und die maximale Größe beträgt 2.147.483.648, also 2 GByte.
Programmtechnisch ist das Problem zu umgehen, indem nicht vom Anfang der Datei
aus positioniert wird. Dann muss das Programm bereits mit der Absicht
geschrieben sein, die 2 GB-Grenze zu durchbrechen. Das ist dann im Allgemeinen
auch dokumentiert.
Damit nicht genug, wird ULIMIT auch noch als
Environmentvariable in /etc/default/login eingesetzt, die vom Terminal
gestartete Prozesse auf diese Größe beschränken. Der Wert, den ULIMIT angibt,
ist die maximale Anzahl der Blöcke, die 512 Byte groß sind. Also sind 2 GB
4194303 Blöcke.
Eine weitere Schranke kann die Anzahl der maximal geöffneten Dateien sein.
Dabei gibt es zwei Werte. Der eine beschränkt die Gesamtzahl der offenen
Dateien und der andere die Anzahl der Dateien, die ein einzelner Prozess
eröffnen darf.
Ansonsten gibt es bei älteren Systemen manchmal eine Begrenzung der
Plattenkapazität. So konnte beispielsweise HP-UX bis zur Version 9 nur Platten
von maximal 4 GB Größe verwalten.
Maximalwerte
SCO-Grenze ULIMIT
SCO hat noch eine zusätzliche Grenze, die in den Kernel-Parametern durch
ULIMIT festgelegt wird. In einer Standardinstallation ist die maximale
Dateigröße auf 1 GB beschränkt.
Den Parameter kann man ändern, indem man scoadmin startet. Darin findet
man den Hardware/Kernel Manager. Als Option wird >>Tune Parameter<< angeboten.
Unter der Gruppe >>User and Group configuration<< finden sich zuerst der Parameter
NOFILES, der die Anzahl der Dateien pro Prozess bestimmt und als zweites
ULIMIT. Nach der Änderung muss unter Hardware/Kernel Manager noch die Option
Relink Kernel aufgerufen werden und der Parameter ist korrigiert.
LINUX-Parameter für maximal geöffnete Dateien
Bei einer Linux Standardinstallation wird die Anzahl der gleichzeitig offenen
Dateien auf 1024 begrenzt. Die Einstellung befindet sich in
der Datei
/usr/src/linux/include/linux/fs.h und heißt NR_FILES.
NR_INODES ist um
den gleichen Faktor zu erhöhen. Eine Neubildung des Kernels ist notwendig,
um den Parameter zu erhöhen. Dieser Wert scheint zunächst hoch. Allerdings
kann in einer Serverumgebung mit 200 Benutzern jeder Anwender nur noch 5
Dateien öffnen.
Diese Seite basiert auf Inhalten aus dem Buch
Arnold Willemer: Wie werde ich UNIX-Guru
Verlagsrechte bei galileo computing
| Homepage |
(C) Copyright 2002 Arnold Willemer
|