Minimal Linux com kernel e BusyBox: / etc / inittab é ignorado, somente / init é executado

9

Eu consegui criar um CD Linux pequeno e totalmente funcional que contém apenas kernel (compilado com opções padrão) e BusyBox (compilado com opções padrão + static, todos os applets presentes, incluindo /sbin/init ). Não tive problemas para criar initrd e preencher /dev , /proc e /sys e também não tive nenhum problema com o meu script de shell /init .

Recentemente eu li que o BusyBox suporta /etc/inittab configurações (pelo menos em algum nível) e gostaria muito de fazer o seguinte:

  • Esqueça o meu script /init e confie inteiramente na configuração /etc/inittab .
  • Use o script de shell /init e a configuração /etc/inittab .

Agora, o problema real - parece que /etc/inittab é completamente ignorado quando minha distro é ativada. Os sintomas são:

  • Quando eu removo /init e deixo apenas /etc/inittab , acabo com o kernel panic. Minha suposição é que o kernel não executa /sbin/init , 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 os dois /init e /etc/inittab e adivinhem - kernel panic novamente.
  • Tentei executar /sbin/init do meu shell e depois de várias suposições que incluíram exec /sbin/init , setsid /sbin/init e exec setsid /sbin/init acabei com o kernel panic. Ambos com e sem o / etc / inittab estando presente no sistema de arquivos.

Aqui está o conteúdo do meu script de shell /init :

#!/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, não me importo com o conteúdo do /etc/inittab , desde que eu saiba como a configuração realmente funciona. Eu tentei várias configurações /etc/inittab , todas com base nas informações que encontrei aqui .

Como mínimo, meu / etc / inittab continha apenas esta linha:

::sysinit:/bin/sh

Mais uma vez - acabei com o kernel panic e parece que /etc/inittab foi ignorado.

Qualquer sugestão de como forçar minha pequena distribuição ao vivo a funcionar bem com /etc/inittab do BusyBox é muito apreciada!

Atualização:

  • Só para deixar claro - eu não tenho problemas de kernel panic com meu atual script shell /init com e sem /etc/inittab . Tudo funciona bem, meu console /bin/ash funciona muito bem e não tenho problemas inesperados. O único problema é que /etc/inittab é completamente ignorado, como descrevi acima.
  • Eu 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 é invocado.
por Ivan Davidov 24.07.2014 / 09:26

1 resposta

9

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 como PID 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.

    
por 31.07.2014 / 17:36