Bewertung: 2


Die Kandidaten sollten in der Lage sein, Kerneloptionen zu konfigurieren, um verschiedene Hardware zu unterstützen, wie UDMA66 Festplatten und IDE-CD Brenner. Dieses Prüfungsziel beinhaltet auch die Nutzung von LVM (Logical Volume Manager) um Festplatten und Partitionen zu managen, sowie Software Tools um Harddiskeinstellungen vorzunehmen

Schlüsseldateien, Begriffe und Hilfsmittel beinhalten:

  • hdparm
  • tune2fs
  • /proc/interrupts
  • sysctl

Das Thema LVM ist hier in einem Nebensatz abgehandelt, das schien mir ein bißchen wenig. Ich habe eine kleine Anleitung und Erklärung dazu geschrieben und ein paar wichtige Handbuchseiten übersetzt (beileibe nicht alle – es sind etwa 36 verschiedene Handbuchseiten…) Diese Seiten finden Sie hier.

Einstellen von Festplattenparametern mit hdparm

Die gebräuchlichsten Festplatten in heutigen PC-Systemen sind sogenannte IDE-Platten. Dieser Standard wurde im Lauf der Jahre seit dem 286er ständig erweitert, aus diesem Grund wird heute meist von EIDE (enhanced IDE) gesprochen. Die IDE-Platten und Controller haben – je nachdem, aus welcher Zeit sie stammen – unterschiedliche Fähigkeiten, die jeweils nur von bestimmten Generationen von IDE-Geräten unterstützt werden.

Damit diese Fähigkeiten unter Linux auch genutzt werden können, existiert ein kleines, kommandozeilenorientiertes Programm, mit dessen Hilfe praktisch alle Einstellungen an diesen Geräten vorgenommen werden können. Dieses Programm heißt hdparm und ist mit Vorsicht zu genießen. Viele Einstellungen können dazu führen, dass eine Platte nicht mehr funktioniert oder die auf der Platte existierenden Dateisysteme beschädigt werden.

Um mit diesem Programm umzugehen, sollten also einige Details der Festplatte bekannt sein. Wir werden hier nicht alle denkbaren Manipulationen durchspielen, sondern nur die häufigsten und wichtigsten Einstellungen besprechen.

Informationen über die Platte bekommen

Hdparm kann sowohl Informationen direkt von der Platte lesen, als auch Informationen vom Betriebssystem lesen. Dazu dienen die Parameter -i und -I. Mit ihnen wird entweder die Information direkt aus der Platte gelesen (mit -I – sehr ausführlich) oder mit -i die Informationen des Kernels über die Platte erfragt.

Die Anwendung ist einfach, wir schreiben

  hdparm -i Gerätedatei

Um also Informationen über die Platte /dev/hda zu bekommen, schreiben wir

  hdparm -i /dev/hda

Die Ausgabe sieht dann etwa folgendermaßen aus:

/dev/hda:

 Model=IBM-DTLA-305020, FwRev=TWEHA60A, SerialNo=YEEYEMY7103
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=40
 BuffType=DualPortCache, BuffSize=380kB, MaxMultSect=16, MultSect=off
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=39851760
 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes: pio0 pio1 pio2 pio3 pio4 
 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 udma3 udma4 udma5 
 AdvancedPM=yes: disabled (255) WriteCache=enabled
 Drive Supports : ATA/ATAPI-5 T13 1321D revision 1 : ATA-2 ATA-3 ATA-4 ATA-5 

Aus der Angabe können wir unter anderem entnehmen, welche PIO-Modi oder (U)DMA-Modi die Platte unterstützt, ob sie Advanced-Power-Management (APM) unterstützt und ob es eingeschalten ist und ob sie (und wenn ja welche) Multisektorlesefähigkeit ermöglicht und ob sie sie benutzt.

Aktivierung des DMA-Zugriffs

Der DMA-Zugriff einer Platte kann sie wesentlich schneller machen, speziell, wenn es um Lesezugriffe geht. Außerdem wird die jeweilige Prozessorbelastung erheblich gesenkt, wenn mit DMA gearbeitet wird. Der Befehl, den DMA-Modus zu aktivieren lautet

  hdparm -d1 Gerätedatei

Diese Einstellung macht bei den meisten modernen Platten nur Sinn, wenn sie zusammen mit der Aktivierung der entsprechenden MDMA oder UDMA Parameter eingegeben wird.

PIO-Mode und UDMA-Mode einstellen

Moderne Festplatten bieten neben den herkömmlichen Zugriffsmethoden noch weitere an, die die Performance zum Teil erheblich verbessern. Damit diese Methoden auch tatsächlich angewandt werden können, müssen sie sowohl vom IDE-Controller (also meist dem Chipsatz des Mainboards oder der Adapterkarte), als auch von der Festplatte selbst unterstützt werden.

Eine dieser Methoden ist der sogenannte PIO-Modus. Dieser Modus existiert in verschiedenen Generationen, die durch Nummern gekennzeichnet sind. Im Augenblick existieren meist die PIO-Modi 0-4. PIO (Programmed Input Output) ist eine Methode, Daten zwischen zwei Geräten auszutauschen, wobei der Prozessor ein Teil des Datentransferweges ist, also Prozessorleistung verwendet wird.

Die Modi haben die folgenden Spezifikationen:

PIO-ModusDatentransferrateDefiniert in Standard
03,3 MByte/SekATA
15,2 MByte/SekATA
28,3 MByte/SekATA
311,1 MByte/SekATA2
416,6 MByte/SekATA2

Die andere verwendete Methode ist das sogenannte Ultra-DMA oder kurz UDMA. Hier wird der Datentransfer von Laufwerk zum Computer ohne Umweg über den Prozessor realisiert, eben über Direct Memory Access – direkten Speicherzugriff. Auch für UDMA existieren verschiedene Modi, wie bei PIO. Die folgende Tabelle zeigt die jeweilige Maximale Transferrate der einzelnen Modi:

UDMA-Modusmax. DatentransferrateDefiniert in Standard
016,7 MByte/SekATA/ATAPI4
125 MByte/SekATA/ATAPI4
233,3 MByte/SekATA/ATAPI4
344,4 MByte/SekATA/ATAPI5
466,7 MByte/SekATA/ATAPI5
5100 MByte/SekATA/ATAPI6

Damit die Modi ab UDMA-3 überhaupt funktionieren, muß ein spezielles Flachbandkabel verwendet werden, das zusätzliche Leitungen enthält, auch wenn es weiterhin an einem 40poligem Stecker angeschlossen wird. Jeder Pin wird durch eine zusätzliche Datenleitung abgeschirmt um auch im hochfrequenten Bereich keine gegenseitige Störung zuzulassen.

Zwischen den PIO und UDMA gab es noch drei Multiword DMA (MDMA) Modi, auch die werden wieder von 0-2 bezeichnet, spielen aber heute eine untergeordnete Rolle.

Um einen dieser Modi mit hdparm zu aktivieren benötigen wir den -X Parameter. Die Zahl, die dem X folgt beschreibt den jeweiligen Modus. Dabei gelten die folgenden Regeln:

  • Der PIO-Modus, der eingestellt wird, wird zu 8 addiert.
  • Der MDMA-Mode, der eingestellt wird, wird zu 32 addiert.
  • Der UDMA-Mode, der eingestellt wird, wird zu 64 addiert.

Daraus ergeben sich die folgenden Werte für die genannten Modi:

Modus-X Wert
PIO-08 (0+8)
PIO-19 (1+8)
PIO-210 (2+8)
PIO-311 (3+8)
PIO-412 (4+8)
MDMA-032 (0+32)
MDMA-133 (1+32)
MDMA-234 (2+32)
UDMA-064 (0+64)
UDMA-165 (1+64)
UDMA-266 (2+64)
UDMA-367 (3+64)
UDMA-468 (4+64)
UDMA-569 (5+64)

Um also den MDMA-Modus 2 auf /dev/hda einzuschalten schreiben wir

  hdparm -d1 -X34 /dev/hda

für UDMA Modus 4 (UDMA66) würden wir mit

  hdparm -d1 -X68 /dev/hda

arbeiten. In beiden Fällen bietet es sich natürlich an, die DMA Unterstützung mit -d1 gleich mit anzuschalten.

Multi-Sector IO aktivieren

Die meisten modernen EIDE-Festplatten kennen ein Feature, das Multi-Sector IO oder auch IDE Block-Mode genannt wird. Dieses Feature ermöglicht es, pro Interrupt mehr als nur einen Sektor der Platte zu lesen oder zu schreiben. Ein Sektor speichert ja grundsätzlich 512 Byte Daten. Wenn häufig Dateien gelesen werden, die größer als 512 Byte sind, dann beschleunigt der Block-Modus den Zugriff erheblich, da die Dateien meist auf hintereinanderliegenden Blöcken abgelegt sind.

Die meisten Laufwerke unterstützen einen Block-Modus von 2, 4, 8 oder 16 Sektoren, die gleichzeitig bearbeitet werden. Mit hdparm -i ist leicht herauszubekommen, was der maximale Wert für die jeweilige Platte ist. Sehen wir uns nochmal die Ausgabe aus dem letzten Beispiel an:

/dev/hda:

 Model=IBM-DTLA-305020, FwRev=TWEHA60A, SerialNo=YEEYEMY7103
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=40
 BuffType=DualPortCache, BuffSize=380kB, MaxMultSect=16, MultSect=off
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=39851760
 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes: pio0 pio1 pio2 pio3 pio4 
 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 udma3 udma4 udma5 
 AdvancedPM=yes: disabled (255) WriteCache=enabled
 Drive Supports : ATA/ATAPI-5 T13 1321D revision 1 : ATA-2 ATA-3 ATA-4 ATA-5 

Die rot dargestellten Werte sind für uns von Interesse. Die Angabe MaxMultSect=16 gibt an, dass dieses Laufwerk als maximale Einstellung für den Block-Mode 16 Sektoren gleichzeitig bearbeiten kann. Mit der nächsten Angabe MultSect=off bekommen wir die Information, dass das Feature im Augenblick nicht genutzt wird. Um es jetzt mit hdparm einzuschalten, benutzen wir den -m Schalter:

  hdparm -m16 /dev/hda

Die Antwort ist eindeutig:

  /dev/hda:
   setting multcount to 16
   multcount    = 16 (on)

Ein erneutes hdparm -i würde entsprechend jetzt MultSect=16 ausgeben.

Feste Einstellungen während des Bootvorgangs

Wenn experimentell die besten Werte für ein Laufwerk herausgefunden wurden und das Laufwerk dann immer noch (hoffentlich besser und schneller) arbeitet, dann ist es an der Zeit zu überlegen, wo wir die Einstellungen eintragen, damit sie beim nächsten Booten wieder aktiviert werden.

Jede Distribution bietet im /etc/init.d Verzeichnis ein Script, um Einstellungen beim Booten vorzunehmen. Meist trägt es einen Namen wie boot.local oder boot.local.sh. Im Auslieferungszustand sind diese Dateien meist leer. Hier tragen wir jetzt die entsprechenden hdparm-Befehle ein, dann werden sie beim nächsten Booten automatisch abgearbeitet. Also z.B.

  echo Setting IDE-harddisk modes:
  hdparm -d1 -X68 -m16 /dev/hda

um die Platte /dev/hda mit UDMA 4 und MultiSect 16 zu betreiben.

Dateisystemtuning mit tune2fs

Die bisher beschriebenen Möglichkeiten, unsere Festplatte zu tunen, bezog sich immer auf die ganze physikalische Platte und war sozusagen sehr hardwarenah. Wir können aber auch die Einstellungen des Dateisystems im Nachhinein verändern, dazu gibt es den Befehl tune2fs. Dieser Befehl erlaubt es uns, ein bestehendes EXT2 Dateisystem auf einer Partition zu manipulieren. Wir haben schon einmal im Abschnitt 2.203.2 kurz darüber gesprochen.

Insbesondere sind mit diesem Befehl die verschiedenen Eigenschaften des EXT2-Dateisystems änderbar, die keinen Einfluß auf die eigentliche Speicherung der Daten haben. Also z.B. die Anzahl der reservierten Blöcke aber eben nicht die Blockgröße.

Einstellungen zum Partitionscheck

EXT2-Dateisysteme werden in regelmäßigen Abständen beim Booten überprüft, ob sie noch konsistent sind. Dabei werden zwei Kenndaten verarbeitet, die festlegen, ob das Dateisystem gecheckt werden muß oder nicht. Das sind die Werte:

  • Anzahl der maximalen Mountvorgänge (Mountcount)
  • Zeit, die seit der letzten Überprüfung vergangen ist.

Beide dieser Kriterien werden während des Mountens beim Systemstart überprüft, wenn ein Kriterium erfüllt ist, wird eine Dateisystemüberprüfung mit e2fsck gestartet, bevor das Dateisystem gemountet wird.

Die Verwendung von Linux als Serversystem, das monatelang läuft, ohne dauernd neu gestartet zu werden, macht die beiden Kriterien notwendig. Ein System, das nur zweimal im Jahr gebootet wird, wird den voreingestellten Wert der maximalen Mountanzahl (20) erst nach 10 Jahren erreichen. Hier empfielt es sich also auch eine Zeitspanne anzugeben, nach der das Dateisystem überprüft werden soll. Eine Workstation hingegen, die täglich gebootet wird, wird wahrscheinlich nie diese Zeitspanne erreichen, weil vorher der maximale Mountcount erreicht wird.

Bei jedem Mountvorgang werden also zwei Werte im Dateisystem abgespeichert, die Anzahl der Mountvorgänge und das aktuelle Datum während des Mountens. Gleichzeitig hat das Dateisystem während des Anlegens mit mke2fs zwei Werte fest im Dateisystem gespeichert, eben die Anzahl der maximalen Mountvorgänge und die maximale Zeitspanne zwischen zwei Mountvorgängen.

Mit tune2fs können diese Werte eingestellt werden. Man kann beide Überprüfungsformen auch deaktivieren, was allerdings nicht empfehlenswert ist. Bei mehreren Partitionen in einem System bietet es sich aber an, die Anzahl der maximalen Mountvorgänge zu staffeln, damit nicht bei einem Bootvorgang alle Dateisysteme überprüft werden müssen.

Mit der Option -c kann die Anzahl der maximalen Mountvorgänge eingestellt werden. Um also z.B. festzulegen, dass die Partition /dev/hdc5 nur alle 32 Mountvorgänge überprüft wird, schreiben wir

  tune2fs -c 32 /dev/hdc5

Es bietet sich an, dafür zu sorgen, dass alle Dateisysteme unterschiedliche Werte aufweisen, etwa 30, 31, 32, 33 usw. Dann werden sie gestaffelt überprüft. Ein Wert von 0 schaltet die Überprüfung vollständig ab (Nicht ratsam).

Es ist auch möglich, den Zähler im Dateisystem selbst zu manipulieren, allerdings sollte das nur im Notfall geschehen, etwa um das Dateisystem zwingend das nächste Mal überprüfen zu lassen. Mit der -C Option wird der Zähler gesetzt.

Um die zeitabhängige Überprüfung zu aktivieren, wird mit der -i Option die gewünschte Anzahl von Tagen angegeben, die zwischen zwei Mountvorgängen verstreichen sollen, ohne dass überprüft werden muß. Ist dieser Wert überschritten – unabhängig wie oft gemountet wurde – wird die Überprüfung beim nächsten Systemstart erzwungen. Wird der angegebenen Anzahl ein w angehängt, so wird die Zahl nicht als Tage sondern als als Wochen interpretiert, mit einem m sind es Monate. Die folgenden drei Zeilen stellen für /dev/hda1 40 Tage, für /dev/hda2 3 Wochen und für /dev/hda3 einen Monat als Intervall zwischen zwei Dateisystemchecks ein:

  tune2fs -i 40 /dev/hda1
  tune2fs -i 3w /dev/hda2
  tune2fs -i 1m /dev/hda3

Optional kann der Angabe von Tagen auch ein d angehängt werden, um die Darstellung einheitlicher zu gestalten.

Setzen/Ändern des Dateisystemnamens (Volume-Label)

Jedes Dateisystem kann einen Namen besitzen, ein sogenannter Volume-Label. Dieser Name kann beim Anlegen des Dateisystems angegeben werden oder im Nachhinein mit tune2fs durch die Verwendung des -L Flags. Um also der Platte /dev/hda1 den Namen „Wurzelpartition“ zu geben, schreiben wir

  tune2fs -L Wurzelpartition /dev/hda1

Ein Volume-Label darf nicht länger als 16 Zeichen lang sein. Besitzt eine Partition einen Namen, so kann dieser Name statt der Angabe der Gerätedateien für die Befehle mount und fsck mit der Option LABEL=Volume-Label benutzt werden.

Reservierte Blöcke

Jedes EXT2-Dateisystem reserviert eine bestimmte Anzahl von Blöcken für einen bestimmten User (normalerweise root). Wenn ein Normaluser also eine Platte vollständig mit Daten belegen würde, blieben immer noch eine bestimmte Anzahl von Blöcken übrig, auf die er keinen Zugriff hätte. Das bietet die Sicherheit, dass der Systemverwalter immer noch administrative Aufgaben auf dieser Platte vornehmen kann, auch wenn sie – aus der Sicht der Normaluser – längst voll ist.

Um die Anzahl der reservierten Blöcke zu manipulieren, bietet uns tune2fs gleich zwei Möglichkeiten. Entweder wir geben an, wieviel Prozent der Blöcke reserviert werden sollen, oder wir geben die Anzahl der zu reservierenden Blöcke an. Dazu dienen die Optionen -m (prozentuale Angabe) oder -r (absolute Angabe). Um also 5 Prozent aller Blöcke von /dev/hdb6 zu reservieren, schreiben wir

  tune2fs -m 5 /dev/hdb6

Wollen wir aber gleich angeben, dass wir 1200 Blocks reservieren wollen, so schreiben wir stattdessen

  tune2fs -r 1200 /dev/hdb6

Normalerweise werden diese Blöcke für die Verwendung durch den Systemverwalter (root – UID 0) vorgesehen. Sollte aber ein anderer User gewünscht sein, der Zugriff auf diese Blöcke haben soll, dann kann das mit -u eingestellt werden. Dabei darf dem -u entweder eine UID oder ein Username folgen. Mit -g können wir entsprechend auch eine Gruppe angeben, deren Mitglieder Zugriff auf die Blöcke haben. Auch hier wird entweder eine GID oder ein Gruppenname akzeptiert.

Kerneleinstellungen mit sysctl

Der Kernel kennt einige Einstellungsmöglichkeiten, die über das /proc-Dateisystem vornehmbar sind. Dazu können Dateien unter /proc/sys direkt geschrieben werden. Leichter geht es, wenn dazu der Befehl sysctl benutzt wird.

Dieser Befehl ermöglicht es, dem Kernel während der Laufzeit bestimmte Parameter zu übergeben, oder bestimmte Einstellungen zu lesen. Als Parameter stehen dabei alle unter /proc/sys zu findenden Dateien zur Verfügung. Bei der Angabe dieser Dateien als Schlüssel kann entweder das / oder ein Punkt(.) als Trennzeichen eingesetzt werden, um den Pfad korrekt anzugeben. Wollen wir z.B. den Inhalt von /proc/sys/kernel/domainname lesen, so schreiben wir entweder

  sysctl kernel/domainname

oder

  sysctl kernel.domainname

Um die Werte nicht nur zu lesen, sondern zu ändern müssen wir die Option -w benutzen und nicht nur den Schlüsselnamen, sondern auch einen Wert dazu angeben. Also z.B.

  sysctl -w kernel/domainname=beispiel.de

Um alle existierenden Parameter auszugeben, kann der -a oder -A Parameter verwendet werden.

Es ist auch möglich, sysctl zusammen mit einer Datei aufzurufen, die wiederum Schlüsselfelder und entsprechende Werte enthält. So kann etwa beim Booten dafür gesorgt werden, dass entsprechende Werte immer gleich geschrieben werden. Standardmäßig wird der Dateiname /etc/sysctl.conf als Voreinstellung benutzt. Es existiert eine Handbuchseite für diese Datei, in der das Dateiformat erklärt ist.

Mit der Option -p Dateiname wird sysctl angewiesen, diese Datei zu lesen und die entsprechenden Werte zu schreiben. In diesem Fall ist die Angabe des -w Parameters unnötig. Wird die Angabe der Datei weggelassen, so wird die voreingestellte Datei benutzt.