Je construis un système Linux très minimal qui se compose simplement du noyau (v4.1-rc5) et d'un initramfs peuplé de busybox (v1.23.2). Cela fonctionne très bien pour la plupart, mais j'observe une différence dans le comportement de l'exécution des commandes dans / init, que j'utilise un initramfs intégré par rapport à un externe.
Le script / init est:
#!/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
Ensuite, je définis l'option CONFIG_INITRAMFS_SOURCE dans le noyau .config dans le répertoire contenant tous les dossiers pour les initramfs, ou je lance
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
pour le construire.
Lorsque je compile ensuite le noyau, avec ou sans CONFIG_INITRAMFS_SOURCE, je me retrouve avec deux variantes de mon système:
bzImage avec initramfs incorporé
bzImage + rootfs.cpio.gz (initramfs externes)
quand je commence maintenant ceux qui utilisent qemu
qemu-system-x86_64 -enable-kvm -kernel bzImage
ou
qemu-system-x86_64 -enable-kvm -kernel bzImage -initrd rootfs.cpio.gz
J'obtiens la différence de comportement suivante:
avec la version 2 (initramfs externes) tout fonctionne bien, "Welcome" s'affiche et je reçois une invite. Avec la version 1 cependant (initramfs intégrés) je reçois l'avertissement
unable to open an initial console
"Bienvenue" ne s'affiche pas et je reçois mon invite.
Pour autant que je comprenne le processus, ces deux versions d'initramfs devraient contenir les mêmes fichiers, puisque je le construis (ou que le noyau le construit) à partir d'un dossier identique.
Je me demande si quelqu'un peut m'aider à expliquer ce comportement?
* METTRE À JOUR *
comme l'a dit mikeserv dans les commentaires, le noyau inclut un initramfs intégré minimal par défaut. Ceci est toujours présent lors de l'utilisation d'un externe, mais est remplacé si vous intégrez le vôtre. J'ai trouvé que contrairement à la spécification, ce n'est en effet pas vide, mais contient un dossier de développement, un dossier racine et le périphérique / dev / console. Cet appareil est ensuite utilisé lors de l'utilisation d'un initramfs externe, mais écrasé si vous intégrez le vôtre. Vous devez donc inclure le périphérique / dev / console dans votre source initramfs mknod -m 622 initramfs_src/dev/console c 5 1
lors de l'incorporation de la vôtre.
Merci beaucoup à mikeserv, frostschutz et JdeBP de m'avoir aidé à comprendre cela!
/dev/console
sur votre intégré? Je pense que la différence pourrait être de savoir qui fait l'emballage dans les deux cas.