Boot CDs erstellen
Nicht ohne mein Linux
Bootfähige Linux-CDs sind nicht nur in Notfällen äußerst praktisch. Wer sie selbst herstellen will, braucht allerdings etwas Know-how über den Bootvorgang oder das hier vorgestellte Tool - besser noch beides.
Bootfähige Linux-CDs sind nicht nur in Notfällen äußerst praktisch. Wer sie selbst herstellen will, braucht allerdings etwas Know-how über den Bootvorgang oder das hier vorgestellte Tool - besser noch beides.
Rettungsdisketten gibt es wie Sand am Meer. Doch sie haben alle eine Reihe von Nachteilen. Sie sind stets zu klein, sie sind langsam und sie sind fehleranfällig. Bei einigermaßen modernen PCs braucht man sie auch gar nicht mehr, da man direkt von der CD booten kann. Was liegt also näher, als sich selbst eine bootbare Linux-CD zu basteln?
Wer jetzt sagt, so was gibt es doch schon, hat natürlich Recht (siehe Infos-Kasten). Doch oftmals fehlt auf diesen CDs gerade ein ganz spezielles, unbedingt benötigtes Programm. Außerdem gibt es noch andere Gründe, eine eigene CD zu basteln. Ideal sind solche CDs beispielsweise für Vorführungen, Schulungen oder Kiosk-Systeme. Oder um dem besten Freund mal stolz die eigene brandneue KDE-Installation auf seinem Rechner vorzuführen.
In diesem Artikel wird ein einfach zu bedienendes Verfahren vorgestellt, mit dessen Hilfe sich mit ganz geringem Aufwand eine funktionierende Linux-Installation auf eine bootbare CD übertragen lässt. Die zunächst folgenden Abschnitte bringen jedoch erst einmal etwas Theorie zum Bootvorgang selbst, die aber auch unabhängig vom Thema interessant sind. Davon ausgehend wird anschließend die Verwendung des Build-Systems zur Erzeugung der bootbaren CD beschrieben.
Nach dem Einschalteten des Rechners sucht dieser an im Bios festgelegten Stellen nach ausführbarem Code. Normalerweise sind das die Diskette, das CD-ROM-Laufwerk sowie die erste Festplatte. Dieser ausführbare Code ist sehr einfach, da zu diesem Zeitpunkt noch keine Betriebssystemmittel zur Verfügung stehen, insbesondere kein Filesystem. Seine Aufgabe ist es, den Betriebssystem-Kern zu laden und zu starten.
Dieser einfache Code ist auch im Linux-Kernel enthalten, deshalb kann man den Kernel direkt auf eine Diskette kopieren ( dd if=bzImage of=/dev/fd0) und ihn davon starten. Der Kernel initialisiert dann alle Teilsysteme und startet anschließend die Programm-Datei /sbin/init auf der Root-Partition (genau genommen werden folgende Dateien in dieser Reihenfolge gesucht: /sbin/init, /etc/init, /bin/init und /bin/sh).
Die Root-Partition wird beim Kompilieren des Kernels festgelegt (im Toplevel Makefile) und hat per Default denselben Wert wie die aktuelle Root-Partition, auf der die Kompilierung läuft. Nachträglich kann dieser Wert mittels rdev(8)-Utilities geändert werden. Wer an den Details des Bootvorgangs interessiert ist, sollte unbedingt einen Blick in die Datei /usr/src/linux /init/ main.c werfen.
Das Programm /sbin/init ist der Urprozess eines laufenden Linux-Systems (es hat die Prozess-ID 1). Es liest seine Konfigurationsdatei /etc/inittab und startet gemäß den Einträgen entsprechende Skripte und Gettys (oder den Xdm für grafische Logins).
Der Nachteil des beschriebenen Verfahrens ist seine mangelnde Flexibilität. Die Root-Partition liegt fest, außerdem können keine zusätzlichen Parameter an den Kernel übergeben werden. Deshalb kommt in der Praxis fast ausschließlich ein zweistufiges Verfahren zum Einsatz. Statt den Kernel direkt zu starten, lädt das Bios einen so genannten Bootloader. Der lädt anschließend den Kernel und übergibt an ihn die Argumente - entweder aus einer Konfigurationsdatei oder von einer Kommandozeile. Die gängigen Bootloader (Lilo, Chos, Grub und andere) können noch mehr: es sind Bootmanager, mit ihnen können auch unterschiedliche Betriebssysteme beziehungsweise Kernel geladen werden.
Selbst mit dem Bootloader bleibt eine Frage ungeklärt: Bei einem gänzlich neuen System gibt es keine formatierte Root-Partition, also auch kein Filesystem mit /sbin/init und /etc/inittab. Der gerade erfolgreich gestartete Kernel würde also mit einer Kernel-Panik stehen bleiben. Die Lösung für das Problem ist eine so genannte Initial Ramdisk. Dabei handelt es sich um ein Linux-Filesystem, das entweder vom Kernel selbst (klassische Ramdisk) oder vom Bootloader in den Speicher geladen wird (Initial Ramdisk: initrd). Die typische Notfalldiskette enthält also genau zwei Komponenten: einen Kernel und eine gezippte Datei, die ein komplettes Dateisystem enthält.
Verwendet man einen Bootloader, sind zwei Argumente für den Kernel notwendig: root=/dev/ram und initrd=Pfad zur Datei. Ohne Bootloader muss man den Kernel (wieder mit Hilfe von rdev) patchen, um die Startadresse der Ramdisk festzulegen. Das letzte Verfahren ist aber inzwischen ziemlich ungebräuchlich, da in diesem Fall sowohl der Kernel als auch die Ramdisk auf eine rohe Diskette an die richtigen Offsets zu kopieren sind.
Der Bootvorgang läuft damit etwas modifiziert ab. Zuerst lädt der Bootloader den Kernel und die Initial Ramdisk. Der Kernel entpackt sie zu einer normalen Ramdisk und mountet sie als Root-Filesystem. Anschließend wird - falls vorhanden - die Datei /linuxrc ausgeführt.
Wenn dieses Programm fertig ist, wird wie oben beschrieben die richtige Partition als Root-Partition gemountet und anschließend /sbin/init aufgerufen. Vorher wird die Initial Ramdisk entweder per umount aus dem Dateisystem ausgehängt (und der Speicherplatz wieder freigegeben) oder - falls das /initrd-Verzeichnis existiert - nach /initrd umgehängt.
Alle Rezensionen aus dem Linux-Magazin
Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...