Estou construindo um sistema Linux muito minimalista que consiste apenas no kernel (v4.1-rc5) e um initramfs preenchido com busybox (v1.23.2). Ele funciona bem na maior parte, mas eu observo uma diferença no comportamento da execução de comandos em / init, quer eu esteja usando um initramfs incorporado contra um externo.
O 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
Então eu defino a opção CONFIG_INITRAMFS_SOURCE no kernel .config para o diretório que contém todas as pastas do initramfs, ou eu corro
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
para construí-lo.
Quando eu compilo o kernel, com ou sem CONFIG_INITRAMFS_SOURCE, acabo com duas variantes do meu sistema:
-
bzImage com o initramfs incorporado
-
bzImage + rootfs.cpio.gz (initramfs externos)
quando eu começar agora usando qemu
qemu-system-x86_64 -enable-kvm -kernel bzImage
ou
qemu-system-x86_64 -enable-kvm -kernel bzImage -initrd rootfs.cpio.gz
Eu tenho a seguinte diferença no comportamento:
com a versão 2 (initramfs externo) tudo funciona bem, "Welcome" é exibido e recebo um aviso. Com a versão 1, no entanto (initramfs incorporado) recebo o aviso
unable to open an initial console
"Bem-vindo" não é exibido e recebo minha solicitação.
Tanto quanto eu entendi o processo, essas duas versões do initramfs devem conter os mesmos arquivos, desde que eu construí-lo (ou ter o kernel construí-lo) a partir de uma pasta idêntica.
Gostaria de saber se alguém pode me ajudar com uma explicação para esse comportamento?
* UPDATE *
como mikeserv disse nos comentários, o kernel inclui um mínimo de initramfs incorporados por padrão. Isto ainda está presente quando se usa um externo, mas é sobrescrito se você incorporar o seu próprio. Descobri que, ao contrário da especificação, isso não é realmente vazio, mas contém uma pasta dev, uma pasta raiz e o dispositivo / dev / console. Este dispositivo é usado ao usar um initramfs externo, mas sobrescrito se você incorporar o seu próprio. Portanto, você precisa incluir o dispositivo / dev / console na sua origem initramfs mknod -m 622 initramfs_src/dev/console c 5 1
ao incorporar seus próprios.
Muito obrigado ao mikeserv, frostschutz e JdeBP por me ajudarem a entender isso!