Linux From Scratch

Ich stieß schon vor einigen Jahren auf Linux From Scratch (LFS), und war von der Idee fasziniert, weil ich wusste, wie viel ich dabei über Linux lernen würde. Bei LFS zieht man sich quasi selbst an den eigenen Haaren aus dem Teich, weil man ein komplettes GNU/Linux Ökosystem von Grund auf selbst aufbaut. Man kompiliert jedes Paket, erstellt jedes Konfigurations-File und bügelt jeden Patch auf. Ich hatte aber nie so richtig Lust, Zeit und Hardware. Jetzt habe ich das alte Thinkpad der Holden hergenommen und werde sehen, wie weit ich damit kommen kann. Von außen betrachtet scheint es recht straightforward zu sein. Host-System aufsetzen, massig Quellcode runterladen und ab die Post!

Da ich dem alten Thinkpad eh lange beim Kompilieren zugucken muss, kann ich auch nebenbei locker einige Zeilen hier in den Blog tippeln und ein meine Eindrücke dokumentieren.

Hardware

Ursprünglich war meine Idee die meiste Arbeit per Remote-Session von meinem Desktop aus zu machen. Ich habe mich dann relativ früh dagegen entschieden, weil ich alles lieber direkt vom Host-System aus machen wollte. Da musste ich mich einfach etwas mehr bemühen. Der Laptop ist ein altes Thinkpad, noch Original von IBM. Er hat eine 32Bit Intel Pentium M CPU mit 1.86Ghz, dazu 1GB RAM und 40GB Festplatte. Der Lüfter rattert und ich werde ihn im Verlauf der Installation einmal mit Kriechöl bearbeiten müssen.

Ziele

Ich hätte gerne am Ende einen funktionieren X-Server, dementsprechend sollten i3 und conky am Ende laufen. Ich brauch wohl auch einen netten Terminal-Emulator. Ein Browser wäre auch noch ganz gut, wobei ich mir da vielleicht einige Abstriche zugestehen muss, weil es sonst einfach nicht fertig werden wird. Was der Rechner am Ende überhaupt tun soll, weiß ich noch nicht, schließlich muss man auch erstmal zum Ende kommen.

Erstellung des Hosts

Erstmal muss man ein sogenanntes Hostsystem aufsetzen, welches man benutzt um auf dem Rechner selbst ein System aus dem Nichts zu erzeugen. Schließlich braucht man erst einmal einen Compiler um einen Compiler zu kompilieren. In dem Moment weiß ich noch nicht genau, welche Anforderungen ein Host haben muss, aber ich denke mit einem Archlinux macht man erstmal nichts falsch. Das erste Problem ist, dass ich ein 32Bit Linux brauche, aber Arch selbst stellt nur noch Pakete für die 64Bit Architektur bereit. Zum Glück gibt es ein Community-Projekt, welches 32Bit Pakete am Leben erhält. Netterweise funktioniert es immernoch halbwegs so wie Upstream.

Ich habe mich dazu entschlossen, den Host auf einem USB-Stick zu installieren, sodass die Platte des T43 jungfräulich bleibt und ich mir nicht vorher schon irgendwelche Probleme beim Partitionieren einfange. Im Live-System habe ich dann folgendes gemacht:

sgdisk —zap-all /dev/sdX

bereinigt einfach den Stick, auf dem ich den Host installieren möchte.

fdisk /dev/sdX

partitioniert ihn.

mkfs.ext4 /dev/sdX1

erzeugt mir ein ext4 Dateisystem und

mount /dev/sdc1 /mnt

hängt es mir ein. Ich habe keine Lust auf Experimente, also entscheide ich mich für einen LTS-Kernel und installiere gleich die ganze Doku und dergleichen mit. Außerdem hat Arch ein nettes Meta-Paket, das die Toolchain und alles mögliche andere noch beinhaltet, was man so zum Kompilieren braucht:

pacstrap /mnt base base-devel linux-lts{,-docs,-headers}

Das hat dann in etwa 1GB Platz benötigt. Danach ging eigentlich erstmal alles nach der Anleitung im Arch-Wiki. Lokalisierung, fstab, Passwort, Kernel-Image und Bootloader. Man muss ein bisschen aufpassen, wenn man Arch auf einen USB-Stick installiert, wie zum Beispiel immer die UUID in fstab und grub.cfg zu verwenden, aber das passiert alles mittlerweile fast automatisch. Im neuen System legt man noch einen neuen User an, der nicht root ist, installiert OpenSSH und schon kann es losgehen. Später habe ich dann gemerkt, dass man noch wget und Python braucht, aber beides ließ sich wunderbar nachträglich installieren.

Für das richtige Gefühl habe ich mich dazu entschlossen einen Browser in der Kommandozeile für LFS zu nutzen – über SSH Befehle eingeben kann ja irgendwie jeder. Man hat ja einige virtuelle Terminals zur Verfügung, sodass man bequem in einem arbeiten kann. Später fiel mir noch auf, dass man schon ab und zu mal einen längeren, mehrzeiligen Befehl einfach nur kopieren muss. Dafür habe ich dann noch tmux installiert, damit ich komfortabel mit einer Zwischenablage hantieren kann. Dabei lief dann immer lynx auf einem “Desktop” und eine übliche Shell auf dem nächsten und man kann bequem zwischen beiden Text austauschen.

Vorbereitungen

Zunächst habe ich die etwa 37GB Platte einmal mit einer 30GB /-Partition versehen, wonach der Rest dementsprechend für den swap reserviert wurde. Dann wird die Platte beim USB-Host unter /mnt/lfs gemounted, dementsprechend ins fstab eingetragen und ein lfs user angelegt, der die ganze Arbeit machen wird. Schließlich legt man /mnt/lfs/tools und /mnt/lfs/sources an, wobei ersteres die erste Toolchain enthalten wird, die benutzt wird, um dann wirklich das System unter /mnt/lfs/ aufzubauen. In letzterem legt man den ganzen Quellcode für das Userland, den Kernel, den Kompiler und so weiter ab.

Vorgehen

Soßen