Eu consegui criar um CD Linux ao vivo pequeno e totalmente funcional que contém apenas o kernel (compilado com opções padrão) e o BusyBox (compilado com opções padrão + estático, todos os applets presentes, inclusive /sbin/init
). Eu não tive problemas para criar initrd
e preencher /dev
, /proc
e /sys
, e também eu não tive problemas em tudo com o meu /init
script shell.
Recentemente, li que o BusyBox suporta /etc/inittab
configurações (pelo menos em algum nível) e gostaria muito de fazer o seguinte:
- Esqueça meu
/init
script de shell e confie inteiramente na/etc/inittab
configuração. - Use o
/init
script de shell e a/etc/inittab
configuração.
Agora, o problema real - parece que /etc/inittab
é completamente ignorado quando minha distro é inicializada. Os sintomas são:
- Quando removo
/init
e saio apenas,/etc/inittab
acabo com o kernel panic. Minha suposição é que o kernel não é executado de/sbin/init
todo, ou que/sbin/init
não encontra (ou lê)/etc/inittab
. - Eu li que o BusyBox deve funcionar bem mesmo sem
/etc/inittab
. Então, eu removi ambos/init
e/etc/inittab
e adivinhem - Kernel panic novamente. - Tentei executar a
/sbin/init
partir do meu shell e depois de várias tentativas, que incluíamexec /sbin/init
,setsid /sbin/init
eexec setsid /sbin/init
acabei com o kernel panic. Com e sem o / etc / inittab presente no sistema de arquivos.
Aqui está o conteúdo do meu /init
script de shell:
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh
Neste ponto, eu não me importo com o que seria o conteúdo /etc/inittab
, desde que eu tenha uma maneira de saber que a configuração realmente funciona. Eu tentei várias /etc/inittab
configurações, todas baseadas nas informações que encontrei aqui .
No mínimo, meu / etc / inittab continha apenas esta linha:
::sysinit:/bin/sh
Mais uma vez - acabei com o pânico do kernel e parece que /etc/inittab
foi ignorado.
Todas as sugestões de como forçar minha pequena distribuição ao vivo a funcionar bem com o BusyBox /etc/inittab
são muito apreciadas!
Atualizar:
- Apenas para esclarecer - não tenho problemas de pânico no kernel com meu
/init
script de shell atual, com e sem/etc/inittab
. Tudo funciona bem, meu/bin/ash
console funciona muito bem e não encontro problemas inesperados. O único problema é que/etc/inittab
é completamente ignorado, como descrevi acima. - Examinei 3 diferentes distribuições Linux ao vivo: Slax, Finnix e SysResCD. Todos eles têm
/init
e nenhum deles tem/etc/inittab
. Além disso, este artigo da Wiki conclui minha suspeita de que/sbin/init
não é invocada.
Respostas:
OK, fiz muitas pesquisas extensas e descobri o que estava errado. Vamos começar um por um:
initramfs
o esquema de inicialização, o primeiro processo que o kernel chama é o/init
script. O kernel nunca tentará executar/sbin/init
diretamente./init
recebe o identificador de processo 1. Isso é muito importante!/sbin/init
só pode ser iniciado comoPID 1
mas já estamos sendo executados/init
como PID 1.exec /sbin/init
enquanto ainda estamos dentro/init
. Dessa maneira, o novo processo (que é/sbin/init
) herdará o PID de seu pai (/init
com o PID 1) e é tudo o que precisamos fazer.O problema que tive com minha configuração inicial (veja a pergunta) foi devido ao fato de que a última coisa que meu
/init
script faz é gerar um novo/bin/sh
processo ao qual é atribuído um novo PID. A partir deste ponto, é impossível executar/sbin/init
diretamente do console interativo porque, mesmo quando executamos a linha de comandoexec /sbin/init
, o melhor que conseguimos é atribuir o mesmo PID que já foi atribuído ao shell e esse PID definitivamente não é o PID 1.Longa história - execute a linha de comando
exec /sbin/init
diretamente/init
e é tudo.fonte