¿Puede el proceso de inicio ser un script de shell en Linux?

Pregunta:

Estaba pasando por un tutorial sobre cómo configurar un initramfs personalizado donde dice:

Lo único que falta es / init, el ejecutable en la raíz de initramfs que ejecuta el kernel una vez cargado. Debido a que sys-apps / busybox incluye un shell completamente funcional, esto significa que puede escribir su binario / init como un script de shell simple (en lugar de convertirlo en una aplicación complicada escrita en Assembler o C que debe compilar).

y da un ejemplo de init como un script de shell que comienza con #!/bin/busybox sh

Hasta ahora, tenía la impresión de que init es el proceso principal que se inicia y que todos los demás procesos de espacio de usuario son eventualmente hijos de init. Sin embargo, en el ejemplo dado, el primer proceso es en realidad bin/busybox/ sh partir del cual se genera el init posterior.

¿Es esta una interpretación correcta? Si, por ejemplo, tuviera un intérprete disponible en ese momento, podría escribir init como un script de Python, etc.

Respuesta:

init no se "genera" (como un proceso hijo), sino que al exec gustaría esto:

# Boot the real thing.
exec switch_root /mnt/root /sbin/init

exec reemplaza todo el proceso en su lugar. El init final sigue siendo el primer proceso (pid 1), a pesar de que fue precedido por los de Initramfs.

El Initramfs /init , que es un script de shell Busybox con pid 1, exec s a Busybox switch_root (por lo que ahora switch_root es pid 1); este programa cambia sus puntos de montaje por lo que /mnt/root será el nuevo / .

switch_root luego de nuevo exec s a /sbin/init de su sistema de archivos raíz real; por lo tanto, hace que su sistema de inicio real sea el primer proceso con pid 1, que a su vez puede generar cualquier número de procesos secundarios.

Ciertamente, también podría hacerse con un script de Python, si de alguna manera lograras convertir Python en tus Initramfs. Aunque si no planea incluir busybox de todos modos, tendrá que switch_root a switch_root cuidadosamente algunas de sus funciones (como switch_root y todo lo demás que normalmente haría con un comando simple).

Sin embargo, no funciona en kernels que no permiten binarios de script ( CONFIG_BINFMT_SCRIPT=y ), o más bien, en tal caso, tendría que iniciar el intérprete directamente y hacer que cargue su script de alguna manera.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım