Bewertung: 1


Die Kandidaten sollten in der Lage sein, sowohl eine Standard-Bootdiskette, als auch eine Recovery-Diskette zur Systemreparatur zu erstellen.

Schlüsseldateien, Begriffe und Hilfsmittel beinhalten:


Die meisten der hier genannten Anforderungen sind bereits von früheren Kapiteln abgedeckt worden, werden hier also als bekannt vorausgesetzt.

Um eine Boot- oder Recovery-Disk zu erstellen, müssen ein paar Grundinformationen klar sein, der Rest ist eigentlich mehr oder weniger simpel. Da das Erstellen solcher Disketten ein mühsamer und vor allem aus vielen Schritten bestehender Job ist, werden in der LPI-Prüfung nur einzelne Informationen über bestimmte Programme abgefragt, nicht die gesamte Ablaufsteuerung des Erstellungsprozesses.

Der Bootprozess

Eine Bootdiskette ist grundsätzlich ein sehr kleines, aber komplettes Linux-System, das im Wesentlichen die selben Aufgaben hat, wie ein „echtes“ großes Linux-System auf der Festplatte. Das zentrale Problem bei der Verwendung von Disketten ist der geringe zur Verfügung stehende Speicherplatz. Die Kunst bei der Erstellung dieser Disks ist es, alles notwendige auf einer (oder zwei) Disketten unterzubringen.

Der Bootprozess eines Personal-Computers beginnt immer damit, dass ein kleines Programm im ROM (BIOS) ausgeführt wird, das dann den Sektor 0 des Zylinders 0 des Bootlaufwerks liesst und das dort gefundene Programm ausführt. Dieses Programm kann entweder ein Bootmanager oder ein Betriebssystem selbst sein.

Wurde der Kernel direkt auf eine Diskette geschrieben, so enthält der erste Sektor des ersten Zylinders eben den Beginn des Kernels. Er wird also entsprechend geladen. Als Alternative könnte aber auch ein entsprechender Bootmanager bzw. ein Linux Loader dort gespeichert sein, der dann wiederum eine Datei mit dem Kernel abarbeitet.

Wenn schließlich der Kernel komplett in den Speicher geladen wurde, so liesst er eine ganz bestimmte Speicherstelle im Kernelimage selbst, das sogenannte RAMDISK-Word, Diese Zahl legt fest, welche Partition oder Laufwerk als Wurzeldateisystem eingebunden werden soll. Dieses RAMDISK-Word kann später mit dem Befehl rdev verändert (eingestellt) werden. Findet der Kernel an der angegebenen Stelle kein nutzbares Wurzelsystem, so wird der Bootprozess mit einem Fehler angehalten.

Beim Booten von Diskette wird gerne eine Ramdisk als Wurzeldateisystem geladen, das hat mehrere Gründe, unter anderem die folgenden:

  • Der Zugriff auf eine Ramdisk ist ungleich viel schneller als der auf eine Diskette
  • Die Verwendung einer Ramdisk macht es möglich, dass auf der Diskette ein komprimiertes Image eines Wurzeldateisystems liegt, das dann in die Ramdisk dekomprimiert werden kann. Dadurch ist wesentlich mehr Speicherplatz zur Verfügung, als es auf einer Diskette möglich wäre.

Da moderne Kernel zumeist gerade noch auf eine Diskette passen, werden heute in der Regel zum Booten mindestens zwei Disketten benötigt, zum Einen die eigentliche Boot-Disk, die den Kernel enthält, zum Anderen eine sogenannte Root-Disk, also eine Diskette, die ein Wurzeldateisystem enthält, das dann in eine Ramdisk geladen werden kann. Eine solche Root-Disk kann unterschiedliche Dinge enthalten, entweder sie enthält einfach nur ein kleines Standard-System zum Start der Installation eines Linux-Systems oder sie enthält beispielsweise eine komplette Umgebung, um Probleme zu lösen. In diesem Fall spricht man von einer Rescue-Disk.

Erstellen von Wurzeldateisystemen

Ein Wurzeldateisystem muss alles enthalten, das Linux benötigt um zu laufen. Das heisst, dass mindestens die folgenden Anforderungen erfüllt sein müssen:

  • Die grundlegende Dateisystemstruktur (/bin, /dev, /etc, /lib, /proc, /tmp, /usr) muss enthalten sein
  • Die nötigsten Programme wie sh, ls, cp, mv usw. müssen enthalten sein
  • Die Libraries, die von diesen Programmen benötigt werden müssen enthalten sein.
  • Die wichtigsten Konfigurationsdateien (inittab) müssen vorhanden sein.
  • Die benötigten Gerätedateien in /dev müssen vorhanden sein.

Um jetzt möglichst viel auf eine einzige Diskette zu bringen, wird heute meist eine sogenannte komprimierte RAM-Disk verwendet. Dazu existiert ein eigenes kleines Dateisystem (CRAMFS) das dann beim Kopieren in die Ramdisk entkomprimiert wird. Um ein solches Image zu erzeugen, sind ein paar einfache Schritte nötig:

  • Anlegen einer etwa 4 MByte großen Datei, die mit Nullen aufgefüllt wird. (Das Auffüllen mit Nullen ist wichtig, damit die Kompression optimal funktioniert.) Dazu wird der bekannte Befehl dd if=/dev/zero of=Datei bs=1k count=4096 verwendet. Damit haben wir eine vier MByte große Datei voller Nullen.
  • Anlegen eines Loop-Devices mit der neuen Datei (siehe auch Seite ageref{loop}) losetup /dev/loop0 Datei Jetzt haben wir ein „virtuelles“ Gerät, das aus der entsprechenden Datei besteht.
  • Anlegen eines Dateisystems auf dem Loop-Device. Mit dem Befehl mke2fs wird ein Dateisystem auf einem Gerät angelegt. Es ist hier darauf zu achten, dass genügend Inodes angelegt werden, da die Gerätedateien in /dev zwar keinen Soeicherplatz, wohl aber Inodes benötigen. Der Befehl mke2fs -m 0 -N 2000 /dev/loop0 legt ein Dateisystem auf dem Loop-Device an, ohne Blöcke für root zu reservieren (-m 0) und mit 2000 Inodes (-N 2000).
  • Mounten des Loop-Devices. Um jetzt Dateien und Verzeichnisse auf dem neuen Dateisystem anzulegen, müssen wir es mounten. Wir können das entweder mit der Option -o loop erledigen mount -o loop Datei /mnt oder einfach das angelegte Loop-Device selbst mounten mount /dev/loop0 /mnt

Jetzt kann damit begonnen werden, die erforderlichen Dateien und Verzeichnisse zu kopieren. Dabei ist natürlich darauf zu achten, dass

  1. alle notwendigen Gerätedateien in /dev angelegt werden
  2. alle notwendigen Verzeichnisse (siehe oben) angelegt werden
  3. alle gewünschten Utilities und die von ihnen benötigten Librariesan die entsprechenden Stellen (/bin, /lib) kopiert werden
  4. die nötigsten Konfigurationsdateien in /etc angelegt und angepasst werden.

Sind alle Dateien schließlich angelegt, so muss das neue Image noch komprimiert werden. Dazu wirde es zunächst einmal abgehängt (umount und dann die Datei mit gzip komprimiert:

  umount /mnt                                                        |
  dd if=/dev/loop0 bs=1k | gzip -v9 > rootfs.gz 

Natürlich kann statt dessen auch die Datei selbst komprimiert werden:

  gzip -v9 Datei

Einstellungen im Kernel mit rdev

Wenn der Kernel direkt von einer Diskette geladen wird, so hat er keine Informationen darüber, wo er sein Wurzelverzeichnis finden kann. Normalerweise übernehmen Bootmanager wie LILO die Aufgabe, diese Information an den Kernel weiterzugeben. In unserem Fall kann es aber nötig sein, einem Kernelimage direkt mitzugeben, wo er sein Wurzelverzeichnis finden kann. Dazu dient das oben schon erwähnte RAMDISK-Word. Es existiert ein kleines aber wichtiges Programm für diesen Zweck, das rdev heisst.

In jedem bootbaren Kernel-Image gibt es mehrere Bytepaare, die dem Linux-Kernel sagen welche Partiton die root-, und welche die swap-Partition ist, und die den Videomodus und die Größe der RAM disk angeben. Der Beginn dieser Bytepaare ist im Kernel-Image auf offset 504 (dezimal) voreingestellt:

   498 Root flags
   (500 und 502 sind reserviert)
   504 RAM disk-Größe
   506 VGA-Modus
   508 Root-Partition
   (510 Boot-Signatur)

rdev kann diese Werte ändern. Das Programm rdev kann mit

  rdev KernelImage Root-Partition

die zu verwendende Root-Partition für einen Kernel einstellen. Dabei wird tatsächlich der Wert in der Kerneldatei verändert, es sollte also nur mit einer Kopie des Kernel-Images gearbeitet werden, die dann später auf die Bootdisk geschrieben wird. Andererseits kann auch gleich ein Kernel-Image auf eine Diskette geschrieben werden und die Diskette selbst als Kernelimage für rdev verwendet werden:

  dd if=KERNEL of=/dev/fd0 bs=1k
  rdev /dev/fd0 /dev/fd0

So wird die Veränderung direkt auf der Diskette selbst geschrieben.

Die Anwendung von rdev ist heute nur noch selten benötigt, für die LPI-Prüfung reicht es aus, zu wissen, dass es dieses Programm gibt und was damit einstellbar ist.

Ausprobieren einer Root-Diskette mit chroot

Um tatsächlich festzustellen, ob alle notwendigen Libraries installiert sind und ob alle Konfigurationsdateien existieren, gibt es ein kleines Hilfsprogramm, das ein beliebiges Programm (oder eine Shell, sofern kein Programm angegeben wurde) in einem Verzeichnis ausführt und dabei dieses Verzeichnis als Wurzelpartition benutzt. Dieses Programm heisst chroot (Change Root) und ist hervorragend geeignet, eine Root-Disk auszutesten, bevor sie komprimiert und geschrieben wird.

Um also unser Root-Image auszuprobieren, könnten wir es wieder mounten (bevor es komprimiert wurde) und einen chroot-Befehl eingeben:

  mount -o loop Datei /mnt
  chroot /mnt

Jetzt können alle gewünschten Befehle ausprobiert werden, sie werden jetzt ja in einem System gestartet, das als Wurzeldateisystem nur unser Image hat.