Estoy creando una distribución de Linux y ahora necesito un programa init. Puedo codificar en c muy bien y sé bastante sobre Linux (no mucho, pero he estado usando Arch Linux para el desarrollo durante 4 años), así que pensé que debería intentar escribir mi propio script de inicio básico en C. Estaba Me pregunto, ¿qué tareas hace init para configurar el sistema para un shell simple? (Cuando pregunto "¿qué hace init?", Sé qué es init y para qué sirve. Simplemente no sé qué tareas hace).
No necesito código y posiblemente ni siquiera necesito comandos básicos, pero sí necesito el orden en que se ejecutan.
Respuestas:
El sistema 5
init
solo te contará una pequeña parte de la historia.Hay una especie de miopía que afecta el mundo de Linux. Las personas piensan que usan una cosa llamada "Sistema 5
init
", y eso es lo que es tradicional y el mejor lugar para comenzar. Ninguno de los dos es el caso.La tradición no es, de hecho, lo que esas personas dicen que es, para empezar. El Sistema 5
init
y el Sistema 5rc
datan del Sistema 5 de AT&T UNIX, que estaba casi tan lejos después del primer UNIX como ahora (digamos) después de la primera versión de Linux-Mandrake.1ª Edición UNIX solo tenía
init
. No tuvorc
. El lenguaje ensamblador de la primera edicióninit
( cuyo código ha sido restaurado y puesto a disposición por Warren Toomey et al. ) Generó y reapareció 12getty
procesos directamente , montó 3 sistemas de archivos cableados desde una tabla integrada y ejecutó directamente un programa desde el directorio de inicio de un el usuario llamadomel
. Lagetty
tabla también estaba directamente en la imagen del programa.Fue otra década después del Sistema 5 de UNIX que apareció el llamado sistema de inicio Linux "tradicional". En 1992, Miquel van Smoorenburg (re) escribió un Linux
init
+rc
, y sus herramientas asociadas, que las personas ahora denominan "Sistema 5init
", aunque en realidad no es el software del Sistema 5 de UNIX (y no es soloinit
)El sistema 5
init
/rc
no es el mejor lugar para comenzar, e incluso si se agrega conocimiento del sistema que no cubre la mitad de lo que hay que saber. Ha habido mucho trabajo en el área del diseño del sistema de inicio (para Linux y los BSD) que ha sucedido solo en las últimas dos décadas. Se han discutido, tomado, diseñado, implementado y practicado todo tipo de decisiones de ingeniería. Los Unices comerciales también hicieron mucho.Sistemas existentes para estudiar y aprender de
Aquí hay una lista incompleta de algunos de los principales sistemas de inicio distintos de esos dos, y uno o dos de sus (varios) puntos destacados:
init
comienzan.getty
desove y la cosecha de zombis) en un administrador de servicios separado, y solo manejar dispositivos / enlaces simbólicos / directorios y eventos del sistema específicos de la API del sistema operativo./bin/rc.init
trabajo de quién es iniciar programas, montar el sistema de archivos, etc. Para esto, puede usar algo como minirc .Además, hace aproximadamente 10 años, hubo discusión entre los usuarios de Daemontools y otros sobre el uso
svscan
como proceso n. ° 1, lo que condujo a proyectos como el svscan de Paul Jarc como estudio de proceso 1 , las ideas de Gerrit Pape y el svscan de Laurent Bercot como proceso 1 .Lo que nos lleva a lo que hacen los programas de proceso # 1.
¿Qué proceso hacen los programas n. ° 1?
Las nociones de qué proceso "1" se supone que debe hacer son, por naturaleza, subjetivas. Un criterio de diseño objetivo significativo es lo que debe hacer el proceso # 1 como mínimo . El núcleo le impone varios requisitos. Y siempre hay algunas cosas específicas del sistema operativo de varios tipos que tiene que hacer. Cuando se trata de lo que el proceso # 1 ha hecho tradicionalmente , entonces no estamos en ese mínimo y nunca lo hemos estado realmente.
Hay varias cosas que varios núcleos del sistema operativo y otros programas exigen del proceso # 1 que uno simplemente no puede escapar.
La gente te dirá que
fork()
la función principal del proceso n. ° 1 es actuar como padre de los procesos huérfanos. Irónicamente, esto no es cierto. Lidiar con los procesos huérfanos es (con los núcleos Linux recientes, como se explica en https://unix.stackexchange.com/a/177361/5132 ) una parte del sistema que se puede descartar en gran medida del proceso n. ° 1 en otros procesos, como Un gerente de servicio dedicado . Todos estos son gerentes de servicio, que se quedan sin el proceso # 1:srcmstr
programa IBM AIX , el controlador de recursos del sistemarunsvdir
de runitsvscan
de daemontools, Adam Sampsonsvscan
de freedt , Bruce Guentersvscan
de daemontools-encore y Laurent Bercots6-svscan
de s6perpd
de perpservice-manager
de noshDel mismo modo, como se explica en https://superuser.com/a/888936/38062 , la
/dev/initctl
idea no necesita estar cerca del proceso n. ° 1. Irónicamente, es el systemd altamente centralizado que demuestra que se puede sacar del proceso # 1.Por el contrario, las cosas obligatorias para
init
que la gente suele olvidar en sus diseños fuera de la parte superior-de-la-cabeza, son cosas tales como la manipulaciónSIGINT
,SIGPWR
,SIGWINCH
, y así enviados desde el núcleo y la promulgación de las diversas peticiones de cambio de estado del sistema enviados de programas que "saben" que ciertas señales para procesar # 1 significan ciertas cosas. (Por ejemplo: como se explica en https://unix.stackexchange.com/a/196471/5132 , los conjuntos de herramientas BSD "saben" queSIGUSR1
tiene un significado específico).También hay tareas de inicialización y finalización que no se pueden escapar, o sufrirán mucho al no hacerlo, como montar sistemas de archivos "API" o vaciar el caché del sistema de archivos.
Los conceptos básicos para tratar con los sistemas de archivos "API" son un poco diferentes al funcionamiento de
init
rom 1st Edition UNIX: uno tiene una lista de información incluida en el programa y uno simplementemount()
contiene todas las entradas de la lista. Encontrará este mecanismo en sistemas tan diversos como BSD (sic!)init
, A través de la narizsystem-manager
, hasta systemd."configurar el sistema para un shell simple"
Como ha observado,
init=/bin/sh
no se montan los sistemas de archivos "API", se bloquea de forma desgarbada sin vaciado de caché cuando uno escribeexit
( https://unix.stackexchange.com/a/195978/5132 ), y en general lo deja al (súper) usuario para que realice manualmente las acciones que hacen que el sistema sea mínimamente utilizable.Para ver lo que uno realmente no tiene más remedio que hacer en los programas del proceso n. ° 1, y así establecer un buen rumbo para su objetivo de diseño establecido, su mejor opción es mirar las superposiciones en la operación de la runa de Gerrit Pape, Felix von Minit de Leitner y el
system-manager
programa del paquete nosh. Los dos primeros muestran dos intentos de ser minimalistas, pero aún manejan las cosas que es imposible evitar.Esto último es útil, sugiero, por su extensa entrada manual para el
system-manager
programa, que detalla exactamente qué sistemas de archivos "API" están montados, qué tareas de inicialización se ejecutan y qué señales se manejan; en un sistema que, por diseño, el administrador del sistema solo generó otras tres cosas (el administrador del servicio, un registrador que lo acompaña y el programa para ejecutar los cambios de estado) y solo hace lo inevitable en el proceso # 1.fuente
launchd
. A veces la gente olvida por completo que OSX es un (excelente) miembro de la gran familia * nix.System V init en Debian (hay otras variantes y variaciones) hace lo siguiente:
/etc/rcX.d/S*
orden alfanumérico, dondeX
está el nivel de ejecución. Estos scripts deberían configurar el nivel de ejecución. La configuración típica es iniciar demonios y realizar tareas de configuración para ese nivel de ejecución. Esto se realiza una sola vez al ingresar al nivel de ejecución./etc/inittab
que necesitan estar activos durante ese nivel de ejecución. Si esos demonios dejan de ejecutarse, los reinicia. Si bien puede tener cualquier daemon que desee administrarinit
, como mínimo desea unos pocosgetty
para poder iniciar sesión.getty
Sale una vez que se completa un inicio de sesión, luego loinit
reinicia, proporcionando un nuevo inicio de sesión.init
automáticamente intente mantenerlo en ejecución. Debe especificar eso por separado en el/etc/inittab
./etc/rcX.d/K*
orden alfanumérico, dondeX
está el nivel de ejecución. Una forma de implementar el apagado o el reinicio es definir un nivel de ejecución para esos eventos y hacer que la última tarea ejecute el comandohalt
oreboot
.Por lo tanto, puede usarlo
init
como administrador de servicio rudimentario si lo desea, pero su tarea principal en estos días es mantenerlogetty
disponible para que un usuario pueda iniciar sesión y comenzar las transiciones de nivel de ejecución.Lo que quieras. En Debian, en cada
/etc/rcX.d
directorio hay un enlace simbólico a un script/etc/init.d
y puede personalizarlo o eliminarlo por completo. El orden se establece mediante anterior a cada secuencia de comandos con una00
,01
, etc.También puede especificar una
-b
opción parainit
(es decir, a través de la línea de comando del núcleo) si solo deseainit
generar un shell. Cuando sale de la cáscara,init
muere y cuandoinit
muere, el núcleo entrará en pánico.fuente
El mínimo absoluto que debe hacer init es ejecutar al menos otro programa y nunca salir. Si init sale, el sistema se bloquea. Supongo que incluso ejecutar el otro programa no es estrictamente necesario, pero si no lo hace, init tendría que ser responsable de hacer todo lo que se espera que haga el sistema, o no sería muy útil.
fuente
init
puedes hacer lo que quierasinit es un ejecutable arbitrario llamado por el kernel de Linux al final del proceso de arranque (y el único ejecutable de este tipo).
Normalmente se implementa como un ejecutable ELF, pero incluso puede ser un script de shell con
chmod +x
: Init como un script de shellLas implementaciones típicas como sysemd leerán los archivos de configuración, a menudo
/etc/initrc
, y luego bifurcarán un montón de procesos de usuario basados en esas configuraciones, para implementar varios aspectos del sistema.Sin embargo, esto es completamente específico de la implementación y, por lo tanto, su pregunta no puede ser respondida sin especificar una implementación específica. Por ejemplo, he estado jugando con un
init
proceso que simplemente hace unareboot
llamada al sistema con fines educativos.El kernel de Linux simplemente busca el ejecutable en la ruta
/init
de forma predeterminada, pero esto puede ser anulado por elinit=
parámetro de línea de comando del kernel de Linux.Una excelente manera de jugar
init
es usar QEMU, ya que puede pasar los parámetros de la línea de comando del kernel a QEMU desde la línea de comando de QEMU con la-append
opción, y sin temor a bloquear su escritorio.Aquí está mi configuración mínima totalmente automatizada de Buildroot + QEMU que hace que sea muy fácil jugar con sus propios inits para desmitificar el asunto.
fuente
Si está comprometido con el principio modular de "hacer una cosa y hacerlo bien", entonces un
init
programa debe iniciar procesos.Iniciar procesos
Debe ejecutarse una vez que el núcleo se haya descomprimido con éxito, cuidando todas las tareas rudimentarias involucradas en la inicialización de todos los procesos iniciales que un sistema requiere para operar (como montar unidades encontradas en / etc / fstab, abrir interfaces de red, y pronto).
Dado que el proceso de arranque y apagado son esencialmente inversos entre sí, es común que un programa init también garantice que los procesos se detengan con un comando de apagado.
Detener procesos
Esto significa que debe detener los procesos de acuerdo con la página de manual de ese proceso (en otras palabras, no solo una flagrante
kill -9
, sino que debe detener el proceso de la forma en que se quiere finalizar), desmontar unidades y finalmente emitir el comando de apagado final .Referencias
Una buena referencia de cómo lo hacen otros es mirar los scripts /etc/rc.d de Slackware , y también un sistema de inicio simple que ya existe, como ninit (un sucesor para minit). Tiene supervisión de proceso (lo que significa que si un proceso muere, se relanza), lo que posiblemente no sea el trabajo de init, pero sigue siendo bastante básico y simple de entender, especialmente a través de los scripts de muestra del autor.
fuente