Sto costruendo un sistema Linux molto minimale che consiste solo nel kernel (v4.1-rc5) e in un initramfs popolato con busybox (v1.23.2). Funziona bene per la maggior parte, ma osservo una differenza nel comportamento dell'esecuzione del comando in / init se sto usando un initramfs incorporato rispetto a uno esterno.
Lo script / init è:
#!/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
Quindi ho impostato l'opzione CONFIG_INITRAMFS_SOURCE nel file .config del kernel sulla directory contenente tutte le cartelle per initramfs, oppure corro
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
per costruirlo.
Quando compilo quindi il kernel, con o senza il set CONFIG_INITRAMFS_SOURCE, finisco con due varianti del mio sistema:
bzImage con initramfs incorporato
bzImage + rootfs.cpio.gz (initramfs esterni)
quando inizio ora quelli che usano qemu
qemu-system-x86_64 -enable-kvm -kernel bzImage
o
qemu-system-x86_64 -enable-kvm -kernel bzImage -initrd rootfs.cpio.gz
Ottengo la seguente differenza di comportamento:
con la versione 2 (initramfs esterno) tutto funziona bene, viene visualizzato "Welcome" e viene visualizzato un messaggio. Tuttavia, con la versione 1 (initramfs incorporato) ricevo l'avviso
unable to open an initial console
"Benvenuto" non viene visualizzato e viene visualizzato il messaggio.
Per quanto ho capito il processo, quelle due versioni di initramfs dovrebbero contenere gli stessi file, dal momento che lo costruisco (o lo faccio compilare dal kernel) da una cartella identica.
Mi chiedo se qualcuno mi può aiutare con una spiegazione per questo comportamento?
* AGGIORNARE *
come ha detto mikeserv nei commenti, Il kernel include un initramfs incorporato minimo per impostazione predefinita. Questo è ancora presente quando si utilizza uno esterno, ma viene sovrascritto se si incorpora il proprio. Ho scoperto che contrariamente alle specifiche, questo non è in realtà vuoto, ma contiene una cartella dev, una cartella radice e il dispositivo / dev / console. Questo dispositivo viene quindi utilizzato quando si utilizza un initramfs esterno, ma sovrascritto se si incorpora il proprio. Quindi devi includere il dispositivo / dev / console nel tuo sorgente initramfs mknod -m 622 initramfs_src/dev/console c 5 1
quando ne incorpori il tuo.
Grazie mille a Mikeserv, Frostschutz e JdeBP per avermi aiutato a risolvere il problema!
/dev/console
su quella integrata? Penso che la differenza potrebbe riguardare chi fa i bagagli nei due casi.