Tabla de contenidos
“Uuno on numero yksi” (Slogan for a series of Finnish movies.)
En este capítulo se describe al proceso init, el cual es el primer proceso a nivel de usuario iniciado por el kernel. init tiene muchos deberes importantes, tales como iniciar getty (para que los usuario puedan ingresar al sistema), implementar niveles de ejecución, y adoptar (take care) procesos huérfanos. En este capítulo se explica como init es configurado y como utiliza los diferentes niveles de ejecución.
init es uno de esos programas que son absolutamente esenciales para la operación de un sistema GNU/Linux, pero que tal vez pueda ignorar (you still can mostly ignore). Una buena distribución GNU/Linux viene con una configuración para init que trabaja en la mayoría de los sistemas, por lo que no habrá necesidad de hacer absolutamente nada con respecto a init. Usualmente, solo necesita preocuparse de init si se conecta a través de terminales seriales, modems que auto atiendan llamadas (dial-in, not dial-out), o si desea cambiar el nivel de ejecución por defecto.
Cuando el kernel se inicia a si mismo (es decir, se cargue en memoria, comience a ejecutarse, inicialice todos los controladores de dispositivos y establezca las estructuras de datos necesarias), finaliza sus tareas dentro del proceso de arranque del sistema al momento de iniciar la ejecución de un programa a nivel de usuario llamado init. Por lo tanto, init es siempre el primer proceso en comenzar su ejecución dentro del sistema (su número de proceso es siempre 1).
El kernel busca el archivo binario correspondiente a
init en una pocas ubicaciones que fueron históricamente
utilizadas para este fin, pero la ubicación correcta para init (en un sistema
GNU/Linux) es /sbin/init
. Si el kernel no puede encontrar a
init, intenta ejecutar /bin/sh
, y si
esta ejecución también falla, el inicio del sistema es abortado.
Cuando init comienza su ejecución, finaliza el proceso
de arranque del sistema realizando una serie de tareas administrativas. La lista
exacta de tareas que init realiza puede variar en distintos
sistemas GNU/Linux. De todas maneras, es común que init realice el chequeo de
los sistemas de archivos, borre el contenido del directorio
/tmp
, comience la ejecución de varios servicios, e inicie
un getty para cada terminal o consola virtual a través de los
cuales los usuarios pueden ingresar al sistema (lea el Capítulo 10, Entrando y saliendo del sistema para mayor información).
Después de que el sistema haya iniciado correctamente, init reinicia a getty para cada terminal en la que que un usuario finaliza su sesión (para que un próximo usuario pueda ingresar al sistema). init también adopta procesos huérfanos: cuando un proceso inicia un proceso hijo y muere antes que este, el proceso hijo pasa a ser un hijo de init inmediatamente. Esto es importante por varias razones técnicas, pero es bueno saberlo, debido a que facilita el entendimiento de la lista de los procesos y los grafos de árboles de procesos. [26] Existen unas pocas variantes disponibles para init. La mayoría de las distribuciones GNU/Linux utilizan sysvinit (escrito por Miquel van Smoorenburg), el cual está basado en el diseño de init de System V. Las versiones BSD de Unix tienen un init diferente. La principal diferencia se encuentra en los niveles de ejecución: System V los implementa, mientras que BSD no (al menos tradicionalmente). Esta diferencia no es esencial, y nosotros examinaremos a sysvinit únicamente.
[26] init por si mismo no tiene permitido morir (finalizar su ejecución). No puede matar a init ni aún con SIGKILL.