Seitenprojekt: TinyCrossLinux

Mittlerweile hat es sich fast eingebürgert, für “kleine” Linux-Anforderungen ein Ubuntu oder Debian zu nehmen und dieses abzuspecken. Je nach Vehemenz landet man dabei meistens so bei 200MB, mit ein wenig Herumgetrickse auch mal bei 80 bis 100MB. Ich bin der Ansicht, dass nicht die Benutzung einer “klassischen” Distribution und deren Abspecken der beste Weg ist, sondern der Aufbau auf Null. Doch ganz auf den Morast einer unerschlossenen Sumpflandschaft möchte man nicht bauen – ich habe daher ein minimales Fundament erstellt, nicht viel mehr als eine Bodenplatte.

Der eine oder andere erinnert sich sicher an diesen nun drei Jahre alten Beitrag: Cross compiling uClibc and busybox, der im Prinzip das Fundament für solch ein Minimal-Linux legen könnte. Allerdings hat uClibc in letzter Zeit einige Inkompatibilitäten angesammelt und wurde seit zwei Jahren nicht mehr aktualisiert (für aktuelle Header benötigt man einen git Checkout). Statt einer statisch gegen uClibc gelinkten BusyBox setze ich nun auf dynamisches Linken gegen musl-libc.

Und so geht’s

Die Build-Umgebung ist Shell. Keine Experimente, keine Nebenläufigkeit, gut zu lesen und vor allem leicht zu erweitern. Gehostet wird auf github, folglich genügt es:

git clone  https://github.com/mschlenker/TinyCrossLinux

zum Klonen des Repos auszuführen. Achtet darauf, dass das Build-System ein x86_64 ist (noch werden die Bootloader auf dem Host kompiliert…) und darauf, dass gcc, make, nasm und diverse Header (gnu-efi, libblkid1, libblkid-dev, autoconf, automake, libtool, shtool, pkg-config, mpc) installiert sind. Den Build von Toolchain und startet Ihr mit

bash build_stage0n.sh

Das kompiliert zunächst die Tools für den Host (hosttools), dann die Toolchain (stage01) und schließlich die eigentlichen Pakete (stage02). Das ganze läuft aus “historischen” Gründen unterhalb von /mnt/archiv ab. Keine Angst: Schlägt etwas fehl, weil ein Paket fehlt, installiert nach und lasst das Script nochmal laufen, es geht dann einfach weiter. Passt ggf. die stage0n_variables an. Ruft anschließend

bash build_iso.sh

um zwei ISO-Images zu bauen: eines für BIOS und eines für UEFI (abgeschaltetes Secure Boot).

Mit dem Image könnt Ihr noch nicht so viel anfangen, aber Modifikationen sind schnell erledigt. Ideen gefällig?

  • Webserver: Ergänzt in der patches/isolinux.cfg und patches/tiny.conf den Parameter httpd=1 und definiert für stage02 ein Script, das eigene Inhalte nach /srv/www kopiert und fertig ist der minimale Webserver.
  • Sicher löschen: Erstellt ein Bootscript /etc/rc.d/0080-delete.sh, das auf sda bis sdz ein dd if=/dev/zero of=/dev/sdx ausführt. Scripte wie patches/etc-rc.d-0050-dropbear.sh können als Beispiel dienen.
  • Keine Grenzen: ergänzt eigene Build-Scripte in stage02, orientiert Euch an dem, was da ist (z.B. an stage02/0030_dropbear.sh) und erstellt eigene Build-Scripte. Die kompilierte Software wandert ins Root-Dateisystem.

Auch der gesamte Boot-Vorgang ist leicht anpassbar. Wo Ihr anpassen müsst, erfahrt Ihr aus der /etc/inittab und /etc/rc des gebooteten Systems (die Vorlagen liegen im Verzeichnis patches).

So now: Have fun!