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 5 rc
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 tuvo rc
. El lenguaje ensamblador de la primera edición init
( cuyo código ha sido restaurado y puesto a disposición por Warren Toomey et al. ) Generó y reapareció 12 getty
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 llamado mel
. La getty
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 5 init
", aunque en realidad no es el software del Sistema 5 de UNIX (y no es solo init
)
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:
- El finito de Joachim Nilsson fue la ruta del uso de un archivo de configuración más legible para los humanos.
- El minit de Felix von Leitner eligió un sistema de configuración de sistema de archivos es la base de datos, pequeñas huellas de memoria y dependencias de inicio / detención entre las cosas que
init
comienzan.
- La runa de Gerrit Pape fue por lo que describí anteriormente como el enfoque de solo generar cuatro guiones de shell .
- InitNG tenía como objetivo tener dependencias, destinos con nombre, múltiples archivos de configuración y una sintaxis de configuración más flexible con una carga completa de más configuraciones para procesos secundarios.
- la nueva empresa se rediseñó por completo, modelando el sistema no como servicios e interdependencias, sino como eventos y trabajos desencadenados por ellos.
- El diseño de nosh incluye empujar toda la administración del servicio (incluso el
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.
- sinit es un init muy simple. Ejecuta el
/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:
Del 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ón SIGINT
, 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" que SIGUSR1
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 simplemente mount()
contiene todas las entradas de la lista. Encontrará este mecanismo en sistemas tan diversos como BSD (sic!) init
, A través de la nariz system-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 escribe exit
( 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.