Linux mínimo com kernel e BusyBox: / etc / inittab é ignorado, apenas / init é executado

12

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 initrde preencher /dev, /proce /sys, e também eu não tive problemas em tudo com o meu /initscript shell.

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

  • Esqueça meu /initscript de shell e confie inteiramente na /etc/inittabconfiguração.
  • Use o /initscript de shell e a /etc/inittabconfiguração.

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

  • Quando removo /inite saio apenas, /etc/inittabacabo com o kernel panic. Minha suposição é que o kernel não é executado de /sbin/inittodo, ou que /sbin/initnão encontra (ou lê) /etc/inittab.
  • Eu li que o BusyBox deve funcionar bem mesmo sem /etc/inittab. Então, eu removi ambos /inite /etc/inittabe adivinhem - Kernel panic novamente.
  • Tentei executar a /sbin/initpartir do meu shell e depois de várias tentativas, que incluíam exec /sbin/init, setsid /sbin/inite exec setsid /sbin/initacabei com o kernel panic. Com e sem o / etc / inittab presente no sistema de arquivos.

Aqui está o conteúdo do meu /initscript 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/inittabconfiguraçõ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/inittabfoi ignorado.

Todas as sugestões de como forçar minha pequena distribuição ao vivo a funcionar bem com o BusyBox /etc/inittabsão muito apreciadas!

Atualizar:

  • Apenas para esclarecer - não tenho problemas de pânico no kernel com meu /initscript de shell atual, com e sem /etc/inittab. Tudo funciona bem, meu /bin/ashconsole 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 /inite nenhum deles tem /etc/inittab. Além disso, este artigo da Wiki conclui minha suspeita de que /sbin/initnão é invocada.
Ivan Davidov
fonte
Se você veio aqui, dê uma olhada Minimal Linux vivo que parece fazer o que os desejos, e apenas funciona: github.com/ivandavidov/minimal
Ciro Santilli新疆改造中心法轮功六四事件
Ah, o OP escreveu o Minimal Linux Live! Cara, você é demais.
Ciro Santilli #

Respostas:

11

OK, fiz muitas pesquisas extensas e descobri o que estava errado. Vamos começar um por um:

  • Quando usamos initramfso esquema de inicialização, o primeiro processo que o kernel chama é o /initscript. O kernel nunca tentará executar /sbin/initdiretamente.
  • /init recebe o identificador de processo 1. Isso é muito importante!
  • O problema agora é que isso /sbin/initsó pode ser iniciado como PID 1mas já estamos sendo executados /initcomo PID 1.
  • A solução é executar a linha de comando exec /sbin/initenquanto ainda estamos dentro /init. Dessa maneira, o novo processo (que é /sbin/init) herdará o PID de seu pai ( /initcom 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 /initscript faz é gerar um novo /bin/shprocesso ao qual é atribuído um novo PID. A partir deste ponto, é impossível executar /sbin/initdiretamente 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 esse PID definitivamente não é o PID 1.

Longa história - execute a linha de comando exec /sbin/initdiretamente /inite é tudo.

Ivan Davidov
fonte