OK, eu fiz muita pesquisa extensa e descobri o que estava errado. Vamos começar um por um:
- Quando usamos o esquema de inicialização
initramfs
, o primeiro processo invocado pelo kernel é o script/init
. O kernel nunca tentará executar/sbin/init
diretamente. -
/init
é atribuído ao identificador do processo 1. Isso é muito importante! - O problema agora é que
/sbin/init
só pode ser iniciado comoPID 1
, mas já estamos executando/init
como PID 1. - A solução é executar a linha de comando
exec /sbin/init
enquanto ainda estivermos dentro de/init
. Dessa forma, o novo processo (que é/sbin/init
) herdará o PID de seu pai (/init
com PID 1) e isso é tudo o que precisamos fazer.
O problema que experimentei com minha configuração inicial (veja a pergunta) deveu-se ao fato de que a última coisa que meu script /init
faz é gerar novo /bin/sh
processo que é designado a um novo PID. A partir deste ponto, é impossível rodar /sbin/init
diretamente do console interativo, porque mesmo quando executamos a linha de comando exec /sbin/init
, o melhor que conseguimos é atribuir o mesmo PID que já foi atribuído ao shell e este PID definitivamente não é PID 1.
Longa história curta - execute a linha de comando exec /sbin/init
diretamente de /init
e isso é tudo.