Puffy

HowTo: OpenBSD Live-CD

Irgend jemand hat mal zu mir gesagt, es sei sehr einfach, mit OpenBSD Live-CDs zu erstellen. Leider hat er mir aber nicht gesagt wie. Als ich mir jedoch vor kurzen die Manpages zu boot und cdboot durchgelesen habe, dämmerte es mir von selbst. Damit niemand anderes die gleichen Experimente wie ich anstellen muß, sondern bereits eine zwar nicht perfekte, aber simple und funktionierende Methode als Anleitung bekommt, schreibe ich dieses HowTo.

Vorüberlegungen

Zunächst sollte man sich im klaren sein, was für eine Art von Live-CD man eigentlich möchte: Will man eine Desktop-CD muß nicht nur X, sondern auch zahlreiche Desktopanwendungen enthalten sein. will man eine CD für Systemrettung, kann man auf X verzichten und muß auch nicht allzu viele zusätzliche Pakete außerhalb des Basisystems installieren. Ich persönlich bezwecke mit meiner Live-CD nur eine Rettungs-CD zu haben, deren Umfang eben einfach deutlich größer ist als der eines bsd.rd Kernels, aber deutlich kleiner als der eines typischen Desktop-Systems ist.

Verzeichnisstruktur und Basissystem entpacken

Alle folgenden Schritte sollten als root und nicht als Benutzer gemacht werden. Das ist wichtig, da später die Dateien auf der CD die korrekten Dateieigentümer haben sollen. Als erstes sollte man sich ein Arbeitsverzeichnis erstellen:

# mkdir livecd

Dann wechselt man in dieses Verzeichnis und erstellt einige Ordner die für den CD-Boot nötig sind:

# cd livecd
# mkdir -p 4.1/i386

Für das Release 4.2 muß der Ordner dann natürlich 4.2 heißen etc. Dann wechselt man in diesen Ordner:

# cd 4.1/i386

In diesen Ordner müssen nun folgende Dateien eines OpenBSD-Installationsverzeichnisses kopiert werden: cdbr, cdboot und bsd. Diese Dateien können entweder von einem OpenBSD FTP-Server kommen oder z. B. von der OpenBSD-CD.

# ftp ftp://openbsd.informatik.uni-erlangen.de/pub/OpenBSD/4.1/i386/cdbr
# ftp ftp://openbsd.informatik.uni-erlangen.de/pub/OpenBSD/4.1/i386/cdboot
# ftp ftp://openbsd.informatik.uni-erlangen.de/pub/OpenBSD/4.1/i386/bsd

Dann wechselt man wieder in das Basisverzeichnis seines Arbeitsverzeichnisses:

# cd ../..

Als nächstes lädt man in dieses Verzeichnis, alle Dateisets des Basissystems, welche man in seiner Live-CD verwenden möchte, minimal muß dies base41.tgz und etc41.tgz sein, ich persönlich habe auch noch man41.tgz hinzu genommen, da ich auch die Dokumentation zum System haben will:

# ftp ftp://openbsd.informatik.uni-erlangen.de/pub/OpenBSD/4.1/i386/base41.tgz
# ftp ftp://openbsd.informatik.uni-erlangen.de/pub/OpenBSD/4.1/i386/etc41.tgz
# ftp ftp://openbsd.informatik.uni-erlangen.de/pub/OpenBSD/4.1/i386/man41.tgz

Nun werden die Pakete entpackt und zwar so, das alle Dateieigenschaften, wie etwa der Eigentümer erhalten bleiben:

# tar xzpf base41.tgz
# tar xzpf etc41.tgz
# tar xzpf man41.tgz

Nun können die Dateisets gelöscht werden:

# rm base41.tgz etc41.tgz man41.tgz

Als letztes müssen noch die Gerätedateien erzeugt werden:

# cd dev
# ./MAKEDEV all
# cd ..

Anpassungen

Wenn man nun überlegt, was eigentlich das schwierige an einer Live-CD ist, sind dies vor allem 2 Punkte: Teile des Dateisystems müssen schreibbar sein, eine CD ist aber nur lesbar und außerdem muß der Kernel wissen, wo sein Root-Dateisystem liegt, bzw. der Bootloader wo der Kernel liegt.

Letzteres läßt sich über die Datei /etc/boot.conf regeln. Steht in dieser Datei z. b. folgende Zeile:

boot /4.1/i386/bsd -a

Dann bootet der Bootloader den Kernel der auf dem momentanen Datenträger unter /4.1/i386/bsd liegt. Genau dort haben wir gerade vorher den OpenBSD Kernel abgelegt. Der Parameter -a bewirkt, das der Kernel nach dem Datenträger auf dem / liegt fragt, sobald er die Hardwareerkennung abgeschlossen hat. Auf diese Art kann man z. B. cd0c (erstes CD-Laufwerk im System) als /-Datenträger angeben, oder auch cd1c, sofern man mehrere CD-Laufwerke hat.

Der Punkt mit dem schreiben im Dateisystem ist allerdings etwas kniffliger. Ein Mechanismus der sich hier als sehr einfache Lösung anbietet ist ein mfs-Dateisystem. Ein mfs-Dateisystem ist ein Dateisystem, das in Wirklichkeit im Hauptspeicher liegt, sich aber wie ein normales ffs-Dateisystem auf der Festplatte verhält. Es kann einfach mit mount_mfs erstellt werden. In solch ein Dateisystem kann man dann außerdem eine vorhandene Verzeichnisstruktur hineinkopieren. Dazu gibt es den Parameter -P für mount_mfs. Der Trick besteht also darin, alle Dateisysteme, in die geschrieben werden muß, als mfs-Dateisysteme in der fstab zu definieren und diese aus Verzeichnissen der CD mit der entsprechenden Verzeichnishierarchie zu bestücken. Außerdem muß man auch noch wissen welche Verzeichnisse beschreibbar sein müssen. Zunächst hatte ich angenommen das es eventuell sogar möglich ist, nur /var als mfs zu mounten, jedoch hagelte es bei der als Ergebnis getesteten CD noch immer massenweise Fehler, zum Beispiel auch mit Dateien in /etc und in /dev.

Letztendlich mounte ich folgende Verzeichnisse als mfs-Dateisysteme: /etc, /var, /dev, /tmp und /root. Da mfs-Dateisysteme nicht befüllt werden können, aus genau den Verzeichnissen die sie als Mountpoint benützen, fügte ich vor die entsprechenden Verzeichnisse ein mfs in den Namen, also /mfsvar, /mfsetc usw. Da außerdem /etc und /dev bereits beim booten benötigt werden, gibt es auch noch mal ein statisches /etc und /dev Verzeichnis auf der CD welche dann später durch den mfs-mount überdeckt werden. In der resultierenden /etc/fstab sieht das dann bei mir so aus:

swap /tmp mfs rw,auto,-s=120000 0 0
swap /var mfs rw,auto,-P/mfsvar 0 0
swap /etc mfs rw,auto,-P/mfsetc 0 0
swap /root mfs rw,auto,-P/mfsroot 0 0
swap /dev mfs rw,auto,-P/mfsdev 0 0

Der Parameter -s bei /tmp macht das Dateisystem gut 55 MB groß. Ich mache das um per Netzwerk dort auch dumps eines root-Dateisystems für ein Restore hinein kopieren zu können. Im allgemeinen ist der dump eines Root-Dateisystems etwa 40 MB groß. Alle anderen Dateisysteme haben die für mfs voreingestellte Standardgröße von knap 8 MB (16384 Blöcke zu 512 Byte) was im Normalfall ausreichen sollte.

Erstellt man keinen Eintrag für das Root-Dateisystem, bekommt man später eine Fehlermeldung beim booten. Da ich aber flexibel bleiben möchte und auch auf Rechnern mit mehreren CD-Laufwerken die Möglichkeit das zweite CD-Laufwerk zu benutzen bieten möchte, benenne ich das /-Dateisystem trotzdem nicht in der fstab. Das führt zwar zu einer Fehlermeldung, aber bei mir bislang zu keinen Problemen beim Einsatz der CD. Der Kernel hatte das Root-Dateisystem ja bereits per Benutzerfrage read-only eingebunden und mehr wollen wir ja auch gar nicht.

Die benötigten Verzeichnisse für den mfs-mount erstelle ich so:

# cp -rp var mfsvar
# rm -r var/*
# cp -rp root mfsroot
# cp -rp etc mfsetc
# cp -rp dev mfsdev

Beim kopieren von dev wird man Fehlermeldungen bekommen, da Gerätedateien nicht kopiert werden können. Daher sollte man danach noch in mfsdev gehen und nochmals das MAKEDEV-Script ausführen:

# cd mfsdev
# ./MAKEDEV all

Konfiguration und extra Pakete

Wer möchte kann natürlich auch Dateien in etc anpassen. Dies macht man am besten vor dem kopieren von etc nach mfsetc oder man muß in beiden Verzeichnissen die Schritte synchron vornehmen. Ebenso lassen sich auch Dateien in root und var anpassen. Möchte man z. B gleich beim booten deutsches Tastaturlayout haben kann man die Datei etc/kbdtype erstellen und dort in eine Zeile de schreiben. Um eine eventuell vorhandene Netzwerkkarte gleich per DHCP beim booten zu konfigurieren habe ich folgenden Code in etc/rc.local gepackt:

myif=`ifconfig | awk -F: '/^[a-z][a-z]+[0-1]: flags=/ { print $1 }' | grep -v lo | grep -v enc | grep -v pflog`
ifconfig $myif up
echo "starting dhclient $myif in background"
dhclient -q $myif &

Wie bekomme ich aber nun weitere Anwendungen hinzu, die nicht im Basissystem enthalten sind? Zunächst mal dachte ich das geht per chroot in mein Arbeitsverzeichnis, in dem sich ja nun bereits ein ganzes System befindet. Das klappte aber erst mal nicht. Ich habe erst hinterher herausgefunden, das dies daran liegt, das mein Heimatverzeichnis (in dem mein Arbeitsverzeichnis liegt) mit der Option nodev gemountet ist. Ein mount -u -o dev /home als root kann dies ändern. Da ich das aber zunächst nicht gemerkt hatte bin ich einen anderen Weg gegangen. Ich habe die Live-CD zunächst ohne weitere Pakete erstellt und gebootet. Dann habe ich ein zusätzliches mfs-Dateisystem erstellt unter /usr/local. Dann habe ich einige Pakete installiert und dann den Inhalt von /usr/local auf einen ffs-formatierten USB-Stick kopiert (mit cp -rp) und dann wieder in mein Arbeitsverzeichnis eingefügt. Diese Methode ist zugegeben relativ umständlich und da nicht immer alle Teile eines Packages nur in /usr/local abgelegt werden, auch Fehleranfällig. In meinem Fall habe ich genau getestet, das die von mir gewünschten Anwendungen keine Dateien außerhalb von /usr/local ablegen. Die chroot-Methode sollte jedoch ebenfalls funktionieren und müßte sogar etwas sicherer sein, wurde aber von mir bislang nicht ausprobiert.

Erstellen des CD-Images

Am Ende verläßt man sein Arbeitsverzeichnis wieder und kann mit folgenden Befehl ein bootfähiges CD-Image erstellen:

# mkhybrid -l -R -o livecd.iso -b 4.1/i386/cdbr -c 4.1/i386/boot.catalog livecd

Die Option -R ist für mkhybrid wichtig, damit auf der CD alle Dateiattribute wie Rechte und Eigentümer erhalten bleiben. Danach läßt sich das Iso-Image mit cdrecord oder cdio brennen:

# cdrecord -v -tao dev=/dev/cd0c livecd.iso

Creative Commons Attribution 2.0 Germany License
Copyright (c) René Maroufi, 2007