Hi, bei Recherchen im Internet findet sich immer nur "How to compile Linux kernel". Ich hingegen würde gerne außer dem Linux-Kernel, den ich bereits kompiliert habe, und dem isolinux bootloader und Hello World! init.c noch alles notwendige hinzufügen, um z.B. bash erstmal zum laufen zu bekommen. Also eine textbasierte Shell, eigentlich egal ob bash, dash, bsh, zsh, csh, ksh, mksh, lksh,... Welche Dateien sind dafür notwendig, dem kompilierten Kernel vor dem Erstellen des iso Image hinzuzufügen, damit diese Shell auch läuft? Danke im Voraus Pascal P.S. ich kenne mich bisher nicht besonders gut aus, versuche aber durch die praktische Erfahrung deutlich mehr zu lernen als Bücher dazu zu lesen. War nicht "binutils" an dieser Stelle wichtig?
Nenne deine bash einfach init. Die wird dann mit PID 1 gestartet...
Im Wesentlichen brauchst du außer dem Kernel nur ein statisch gelinktes Programm, das heißt, ein Programm, das von keinen Bibliotheken abhängt. Dieses Programm packst du die initial ramdisk, und übergibst beim Booten dem Kernel "init=/bash" als Parameter. Irgendwie kriegt man sicher eine statische Variante der bash o. ä. kompiliert. Prüfen kannst du das, indem du Folgendes machst:
1 | ~> readelf -a /bin/bash | grep "Req" |
2 | [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] |
Wenn die Ausgabe nicht leer ist, weißt du, dass zur Laufzeit noch Bibliotheken nachgeladen werden müssen.
Die Shell alleine bringt einem ggf. nicht viel, da man noch einen ganzen Stall voll Kommandozeilen-Tools braucht, damit man in der Shell auch was tun kann. Die core utilites wird man mindestens auch noch brauchen. Am einfachsten dürfte da Busybox sein. Da ist das wichtigste schon dabei, und es ist alles in ein einziges Executable eingebaut, das auch statisch gelinkt werden kann. Es ist genau dafür gemacht, sich ein minimalistisches Linux-System zu bauen. In manchen Distros wird eine Busybox schon mit in die initrd gepackt. Auf die Weise hat man ein bedienbares System selbst dann, wenn der Kernel es nicht schafft, sein root-Filesystem zu mounten.
:
Bearbeitet durch User
Danke! Das heißt, die einfachste Methode, um eine Shell dem Kernel hinzuzufügen, und auch nutzbare Funktionen zu haben, ist es, busybox statisch gelinkt zu kompilieren und als init auszuführen?
Ja. Wobei das dann immer noch sehr minimalistisch ist und nicht ausreicht, damit das System sich selbst reproduzieren kann. Das hier kennst du? http://linuxfromscratch.org/lfs/view/development/
Ja, kenne ich. Dauert aber sehr lange, bis man was fertig hat. Mit der iso funktioniert das eine mit den bashprofilen nicht. Ansonsten ganz ok. Aber minimalistisch reicht mir ja. Muss nur beim Starten ein Skript ausführen, und dann direkt neustarten. Für das Skript brauche ich eben eine Shell.
Irgendwie musst du es noch schaffen, die ganzen virtuellen Dateisysteme einzuhängen, die busybox zum Arbeiten braucht. Sonst scheitert es schon daran, /dev/console für die Ausgabe zu finden. Oder kann das mittlerweile der Kernel ganz alleine?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.