Ich baue ein sehr minimales Linux-System, das nur aus dem Kernel (v4.1-rc5) und einem mit Busybox (v1.23.2) bestückten Initramfs besteht. Es funktioniert größtenteils einwandfrei, aber ich beobachte einen Unterschied im Verhalten der Befehlsausführung in / init, unabhängig davon, ob ich ein eingebettetes initramfs oder ein externes verwende.
Das / init-Skript lautet:
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t sysfs none /sys
mount -t proc none /proc
echo "Welcome"
while true
do
setsid cttyhack /bin/sh
done
Dann setze ich entweder die Option CONFIG_INITRAMFS_SOURCE im Kernel .config auf das Verzeichnis, das alle Ordner für die initramfs enthält, oder ich führe aus
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
um es zu bauen.
Wenn ich dann den Kernel kompiliere, entweder mit oder ohne CONFIG_INITRAMFS_SOURCE, habe ich zwei Varianten meines Systems:
bzImage mit eingebettetem initramfs
bzImage + rootfs.cpio.gz (externe initramfs)
wenn ich jetzt anfange diese zu benutzen qemu
qemu-system-x86_64 -enable-kvm -kernel bzImage
oder
qemu-system-x86_64 -enable-kvm -kernel bzImage -initrd rootfs.cpio.gz
Ich habe folgenden Verhaltensunterschied:
Mit Version 2 (externes Initramfs) funktioniert alles einwandfrei. "Willkommen" wird angezeigt und ich erhalte eine Eingabeaufforderung. Mit Version 1 (Embedded Initramfs) bekomme ich jedoch die Warnung
unable to open an initial console
"Willkommen" wird nicht angezeigt und ich erhalte meine Eingabeaufforderung.
Soweit ich den Prozess verstehe, sollten diese beiden Versionen von initramfs dieselben Dateien enthalten, da ich sie aus einem identischen Ordner erstelle (oder vom Kernel erstellen lasse).
Ich frage mich, ob mir jemand mit einer Erklärung für dieses Verhalten helfen kann.
* UPDATE *
Wie MikeServ in den Kommentaren sagte, enthält der Kernel standardmäßig ein minimales eingebettetes Initramfs. Dies ist weiterhin vorhanden, wenn Sie ein externes verwenden, wird jedoch überschrieben, wenn Sie Ihr eigenes einbetten. Ich habe festgestellt, dass dies entgegen der Spezifikation zwar nicht leer ist, sondern einen Entwicklungsordner, einen Stammordner und das Gerät / dev / console enthält. Dieses Gerät wird dann bei Verwendung eines externen Initramfs verwendet, aber überschrieben, wenn Sie Ihr eigenes einbetten. Sie müssen also das Gerät / dev / console in Ihre initramfs-Quelle aufnehmen, mknod -m 622 initramfs_src/dev/console c 5 1
wenn Sie Ihr eigenes einbetten.
Vielen Dank an mikeserv, frostschutz und JdeBP, die mir dabei geholfen haben, mich darum zu kümmern!
/dev/console
für Ihre integrierte Version festgelegt? Ich denke, der Unterschied könnte darin bestehen, wer in beiden Fällen die Verpackung übernimmt.