Logré crear un CD de Linux en vivo pequeño y completamente funcional que contiene solo kernel (compilado con opciones predeterminadas) y BusyBox (compilado con opciones predeterminadas + estático, todos los applets presentes, incluidos /sbin/init
). No tuve problemas para crear initrd
y completar /dev
, /proc
y /sys
tampoco tuve ningún problema con mi /init
script de shell.
Recientemente leí que BusyBox admite /etc/inittab
configuraciones (al menos hasta cierto nivel) y me gustaría mucho hacer cualquiera de los siguientes:
- Olvídate de mi
/init
script de shell y confía completamente en la/etc/inittab
configuración. - Utilice tanto el
/init
script de shell como la/etc/inittab
configuración.
Ahora el problema real: parece que /etc/inittab
se ignora por completo cuando se inicia mi distribución. Los síntomas son:
- Cuando elimino
/init
y dejo solo/etc/inittab
termino con pánico en el núcleo. Mi suposición es que el kernel no se ejecuta/sbin/init
en absoluto, o que/sbin/init
no encuentra (o lee)/etc/inittab
. - Leí que BusyBox debería funcionar bien incluso sin él
/etc/inittab
. Por lo tanto, me quita tanto/init
y/etc/inittab
y supongo que lo que - de pánico del kernel nuevo. - Traté de ejecutar
/sbin/init
desde mi shell y después de varias conjeturas que incluyeronexec /sbin/init
,setsid /sbin/init
yexec setsid /sbin/init
terminé con kernel panic. Tanto con / sin / etc / inittab como presente en el sistema de archivos.
Aquí está el contenido de mi /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
En este punto no me importa cuál sería el contenido de la /etc/inittab
, siempre y cuando tenga una manera de saber que la configuración allí realmente funciona. Intenté varias /etc/inittab
configuraciones, todas basadas en la información que encontré aquí .
Como mínimo, mi / etc / inittab contenía solo esta línea:
::sysinit:/bin/sh
Una vez más, terminé con kernel panic y parece que /etc/inittab
fue ignorado.
Cualquier sugerencia sobre cómo forzar mi pequeña distribución en vivo para que funcione bien con BusyBox /etc/inittab
es muy apreciada.
Actualizar:
- Solo para aclararlo: no tengo problemas de kernel panic con mi
/init
script de shell actual con y sin/etc/inittab
. Todo funciona bien, mi/bin/ash
consola funciona muy bien y no experimento ningún problema inesperado. El único problema es que/etc/inittab
se ignora por completo, como describí anteriormente. - Examiné 3 distribuciones de Linux en vivo diferentes: Slax, Finnix y SysResCD. Todos tienen
/init
y ninguno tiene/etc/inittab
. Además, este artículo de Wiki concluye mi sospecha de que/sbin/init
no se invoca en absoluto.
Respuestas:
Bien, investigué mucho y descubrí lo que estaba mal. Comencemos uno por uno:
initramfs
el esquema de arranque, el primer proceso que invoca el núcleo es el/init
script. El núcleo nunca intentará ejecutarse/sbin/init
directamente./init
se le asigna el identificador de proceso 1. ¡Esto es muy importante!/sbin/init
solo se puede iniciar comoPID 1
pero ya estamos ejecutando/init
como PID 1.exec /sbin/init
mientras aún estamos dentro/init
. De esta manera, el nuevo proceso (que es/sbin/init
) heredará el PID de su padre (/init
con PID 1) y eso es todo lo que tenemos que hacer.El problema que experimenté con mi configuración inicial (vea la pregunta) se debió al hecho de que lo último que hace mi
/init
script es generar un nuevo/bin/sh
proceso al que se le asigna un PID nuevo. Desde este punto, es imposible ejecutar/sbin/init
directamente desde la consola interactiva porque incluso cuando ejecutamos la línea de comandoexec /sbin/init
, lo mejor que podemos lograr es asignar el mismo PID que ya se ha asignado al shell y este PID definitivamente no es PID 1.Larga historia corta: ejecute la línea de comando
exec /sbin/init
directamente desde/init
y eso es todo.fuente