Proceso de inicio de GNU/Linux: systemd

Publicado por Diego Córdoba en

Con este artículo cerramos una serie que inició con el arranque de la computadora, seguido del sistema de inicio SysV Init en GNU/Linux. Veremos ahora el proceso de inicio de systemd para complementar la documentación de inicio del sistema requerida para el curso de certificación LPIC-1.

Así como en SysV el proceso init era el PID=1 del sistema, aquí systemd es la madre de todos los procesos y es el responsable de llevar al núcleo Linux a un estado utilizable. Algunas de sus funciones, que son más extensas que las del viejo programa init, son administrar muchos aspectos del sistema Linux que está corriendo, incluyendo el montaje de sistemas de archivos, y el inicio y gestión de los servicios requeridos por el host.

Si bien systemd lleva a cabo varias tareas, muchas tareas (demasiadas tareas!) muchas de las cuales no están relacionadas con el inicio del sistema, aquí solo nos centraremos en aquellas que tienen que ver con el arranque de GNU/Linux.

Proceso de inicio systemd

Primero, systemd monta los sistemas de archivos especificados en /etc/fstab, incluyendo la partición o archivo de intercambio (swap). Para ello como es de esperarse accede a las configuraciones de /etc.

Primero lee el archivo /etc/systemd/system/default.target para determinar qué estado o traget debería lanzar el proceso de inicio.default.target es un enlace simbólico al target verdadero que se lanzará. Para un ordenador de usuario generalmente será un target de inicio gráfico del sistema, llamado graphical.target, equivalente al runlevel 5 del viejo SysV init. Para un servidor será usualmente el multi-user.target, equivalente al runlevel 3. Igualmente, el equivalente al runlevel de modo single-user es denominado emergency.target.

Cabe aclarar que todos los tagets de systemd representan unidades, o units, tema del que ya hemos hablado en https://juncotic.com/systemd-ejecutando-un-script-al-inicio-de-gnu-linux/

Targets vs runlevels

En la siguiente tabla muestro algunas equivalencias entre los targets de systemd y los runlevels de SysV init. Los alias de los targets de systemd son un recurso que utiliza este sistema para proveer compatibilidad hacia atrás con el sistema anterior. Así, muchos administradores de sistemas podemos utilizar comandos como «init 6» para cambiar runlevels dentro de sistemas que poseen inicio systemd, y estos comandos llaman luego a utilidades de systemd para su ejecución. Esta tabla está extraída directamente desde el man bootup (sí, en GNU/Linux todo está documentado en un man :D) y de aquí.

Runlevel (SysV)Target (systemd)DescripciónAlias
halt.targetApaga el sistema sin desconectar la energía
0poweroff.targetApaga el sistema y lo desconectarunlevel0.target
Semergency.targetModo usuario único. No ejecuta servicios, ni monta sistemas de archivos. Es el modo más básico de operación del sistema con solo un shell de emergencia corriendo.
1rescue.taargetUn sistema Linux básico con los sistemas de archivos montadosy los servicios esenciales, y un shell de rescate.runlevel1.target
2Modo multiusuario con todos los servicios no-GUI corriendo.runlevel2.target
3multi-user.targetTodos los servicios corriendo en modo CLI (Command Line Interface)runlevel3.target
4No utilizadorunlevel4.target
5runlevel3.targetModo multi-usuario con GUI (Graphical User Interface)runlevel5.target
6reboot.targetModo de reiniciorunlevel6.target
default.targetEste target es un enlace simbólico o al multi-user.target o al graphical.target. systemd siempre usa el default.target para iniciar el sistema. El default.target nunca deberia ser enlazado al halt.target, poweroff.target o reboot.target, obviamente 🙂

`man bootup`

Por cierto, el man bootup además muestra la secuencia general de inicio de los eventos durante el arranque del sistema systemd, y los requerimientos básicos de orden para asegurar un inicio limpio y sin complicaciones. La siguiente imagen es una captura de dicha página de manual:

boot boostrap systemd man target proceso de inicio

Algunos targets del proceso de inicio

Los targets sysinit.target y basic.target pueden ser considerados como puntos de partida del proceso de inicio. A pesar de que systemd tiene como uno de sus objetivos de diseño la posibilidad de iniciar servicios en paralelo, hay ciertos procesos y targets que deben ser ejecutados antes que otros por una cuestión de dependencia.

Después de ejecutar el sysinit.target, systemd arranca el basic.target, iniciando todas las units requeridas. El basic.target provee algunas funcionalidades adicionales e inicia algunas units que serán necesarias más adelante, entre las que se incluyen la configuración de rutas/paths de ejecutables, creación de sockets de comunicación, timers, etc.

Finalmente se inicializan los targets de user-level, multi-user o graphical, también siguiendo un orden particular… notar que el multi-user.target debe iniciarse antes que el graphical.target, y las dependencias deben cumplirse.

Los targets que en la figura están en la última línea son los que generalmente se ejecutan. Cuando uno de estos targets se lleva a cabo, el inicio del sistema está completo. Por ejemplo, si el target por defecto es multi-user.target, al finalizar la ejecución dispondremos de una terminal de comandos multiusuario. Si por su parte es el graphical.target el predeterminado, tendremos un login gráfico, cuya ventana dependerá del manejador de escritorio que tengamos instalado.

Targets y dependencias

Cada target tiene un conjunto de dependencias descriptas en su archivo de configuración. systemd inicia las dependencias requeridas antes de lanzar un target determinado. Estas dependencias son los servicios necesarios para que Linux corra con algún nivel de funcionalidad puntual. Cuando todas las dependencias listadas en la configuración del target pueden ejecutarse, el sistema se inicia en un nivel de target específico.

Además, systemd verifica los directorios de init de Systemv para ver si contienen archivos de inicio. Si es así, systemd usa esos archivos de configuración para iniciar cada servicio descripto en sus propias configuraciones.

Conclusiones

Hemos hecho una breve introducción al proceso de inicio de systemd. Como comenté arriba, systemd no solamente es un sistema de inicio como el anterior SysV init, sino que es casi un segundo kernel, un monstruo de casi 1.5 millones de líneas de código que va adquiriendo funcionalidades adicionales como la gestión de logs, o incluso la gestión de tareas programadas, rompiendo de esta forma la filosofía original de Linux, la filosofía Unix de mantener todo lo más simple posible, el viejo «haz una sola cosa, pero hazla bien«.

Igual, no es el momento de hablar mal de systemd, se encuentra en muchas de las distros más reconocidas, y conocerlo es indispensable para poder aplicar a casi todas las certificaciones GNU/Linux actuales, incluida la LPIC-1.

Espero les sirva!! Hasta la próxima!

Categorías: Linux

Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador