
Ich versuche, einen selbst kompilierten Kernel zusammen mit einem initramfs zum Laufen zu bringen. Auf dem alten Raspberry hat es geklappt, aber irgendwie bekomme ich es nicht zum Laufen.
Was ich genau versuche: Kernel laden, initramfs „ausführen“, das dann einige Prüfungen durchführt (Systemaktualisierung usw.), schließlich ein Squashfs-Image mounten und switch_root auf dem besagten System aufrufen.
Aber der Kernel weigert sich irgendwie, die Init von initramfs auszuführen. Ich habe verschiedene Einstellungen in cmdline.txt
/ ausprobiert config.txt
, aber keine davon scheint zu funktionieren, der Kernel wartet immer darauf, dass ein Root verfügbar ist (oder schlägt mit fehl VFS: unable to mount root fs on unknown block
). Ich gehe davon aus, dass mir eine Befehlszeileneinstellung fehlt (wahrscheinlich hat ein korrektes root=...
. root=/dev/ram0
nicht funktioniert) oder ein Kernel-Flag. Meine aktuelle Befehlszeile: dwc_otg.lpm_enable=0 console=tty1 elevator=deadline rootwait
, config.txt:initramfs initramfs.gz followkernel
Wenn ich hinzufüge, root=/dev/mmcblk0p6 roottype=ext4
wird das gesamte System gebootet (in ein Test-Linux, das ich hinzugefügt habe, um zu überprüfen, ob der Kernel selbst funktioniert).
Ich habe überprüft, dass der Kernel mit Initramfs-Unterstützung kompiliert wurde ( BLK_DEV_INITRD=y
). Leider ist das Kompilieren von Initramfs in das Kernel-Image keine Option. Der Kernel (4.1 stabil) wurde mit Buildroot kompiliert. Das Kernel-Binärformat ist zImage (scheint mit vmlinux nicht zu funktionieren, der Bildschirm bleibt schwarz).
Antwort1
Ich habe bei Null angefangen und bin nach stundenlangem Herumprobieren zu der/den Quelle(n) meines Problems gekommen, die im Grunde nur aus ein paar dummen Fehlern bestand: Mein Build-Skript hat das Initramfs mit absoluten Pfaden generiert (also nicht beispielsweise, lib/libc.so
sondern ~/Work/project/target/lib/libc.so
), was offensichtlich dazu führt, dass der Kernel das ursprüngliche Init nicht findet.
Eine interessante Lektion, die ich gelernt habe: Ein eingebettetes Initramfs verhält sich anscheinend etwas anders als ein externes, nämlich dass Echo-Befehle und dergleichen im Init-Skript nicht ausgegeben werden, wenn ein eingebettetes Initramfs vorhanden ist. Während ich mit einem externen Initramfs herumgespielt habe, habe ich vergessen, das eingebettete zu entfernen, was dazu führte, dass das externe Init ausgeführt wurde (und nur dieses), aber nichts ausgegeben wurde. Nachdem ich das eingebettete Initramfs entfernt hatte, funktionierte es.