sábado, 9 de diciembre de 2023

Init y systemd

Posted by q3it on sábado, diciembre 09, 2023 in

Hablar sobre el proceso de arranque en Linux es algo complicado explicar y de entender, pero es importante saber que es init y systemd y, cuáles son los cambios históricos.
 
Antes se utilizaba init que era el primer proceso que se ejecutaba y, todos los servicios que se iban a ejecutar a continuación dependían de init. Imaginemos que nos conectamos por SSH y al salir de la sesión se acababa su ejecución, entonces lo que hacía era asociar este proceso como hijo del proceso init. Las distribuciones más recientes han reemplazado init por systemd que es más moderno en el sentido de que trabaja mejor con eventos cuando se está arrancando el sistema, también es más robusto, pero ambos se ejecutan cuando se arranca la distribución y van a tener el PID 1.
 
 
Como vemos en la imagen anterior que se ejecuta init y siempre con el PID 1. En una versión más nueva vamos a tener como PID 1 systemd.
 
 
Y qué es lo que hacen estos procesos, pues estos procesos son los que van a gestionar los otros procesos, es decir, nosotros cuando arrancamos el equipo se va a arrancar init y systemd, va a leer ciertas configuraciones y va a arrancar los servicios de red, base de datos, servidor web, etc. Y ambos contienen los denominados niveles de ejecución. 
 
Estos niveles de ejecución son una fase cuando nosotros estamos arrancando apagando o reiniciando el equipo. Si nosotros queremos apagar nuestro equipo cambiaremos este nivel de ejecución del que estamos actualmente.
 
 
Imaginemos que nosotros estamos trabajando, hemos tenido algún problema en el sistema y necesitamos arreglarlo, lo más conveniente es pasar a modo Mono usuario, entonces podemos ejecutar init indicándole el nivel, por ejemplo al nivel 1 nos cambiaremos al mono usuario. Automáticamente los demás usuarios se desconectaran y no podrán acceder al equipo.
 
Si nosotros utilizamos systemd podemos utilizar systemctl isolate y por ejemplo para mono usuario rescue.target, o si nos acordamos de los números de init podemos utilizar runlevel1.target y lo que hará es lo mismo, ambos lo que cambiarán es el nivel de ejecución a uno de mono usuario. Con esto pedemos arreglar los problemas y luego volver al usuario ya sea con el número 3 o ponerlo en un level 5 Multi User graphical.target.