Trabajando con Systemd

Desde 2.015, la mayoría de las principales distribuciones Linux adoptaron systemd como el sistema de inicio predeterminado, frente al tradicional SysV. Todo ello a pesar de las opiniones encontradas sobre este sistema de inicio. Sin embargo, muchos todavía no nos hemos acostumbrado a él, o bien, mezclamos parte de nuestras anteriores rutinas con el uso de systemd. Sin embargo, dado el amplio uso de este sistema, es importante conocer su uso y funcionamiento. En este artículo, nos centraremos en systemd y systemctl, que es la herramienta central para controlar el sistema de inicio.

Systemd y Systemctl

¿Que es Systemd?

Según la propia página de Systemd,

systemd es un gestor del sistema y de los servicios para Linux, compatible con los initscript SysV y LSB.

Las unidades

Un elemento fundamental dentro de Systemd son las unidades, que pueden ser:

  • Servicios
  • Puntos de montaje
  • Dispositivos
  • Sockets
  • Puntos de montaje automático
  • Un archivo o partición de intercambio
  • Un unidad de destino
  • Un directorio o archivo monitorizado
  • Un contador de tiempo controlado
  • Grupos de recursos

Básicamente el archivo de una unidad está compuesto de tres partes [Unit], donde se describe la unidad. Una segunda parte que puede ser de diferente tipo [Service] para un servicio, [Socket] para un socket, etc. Y una tercera parte [Install]

Inspeccionar las unidades

Aquí es donde entra en juego la herramienta que he comentado en la introducción, systemctl. Con esta herramienta, podemos ver las unidades activas, para lo que ejecutaremos la orden,

systemctl

Al ejecutar esta orden veremos varias columnas,

  • UNIT donde aparece el nombre de la unidad
  • LOAD si la unidad ha sido procesada por systemd. La configuración de las unidades procesadas está en memoria.
  • ACTIVE en esta columna podemos ver si la unidad se ha ejecutado correctamente o no.
  • SUB nos muestra información detallada sobre la unidad.
  • DESCRIPTION nos muestra el texto configurado en la parte [Unit] de la unidad

Si queremos ver las unidades que han tenido algún tipo de problema, lo ejecutaremos con la opción --failed,

systemctl --failed

Los archivos de las unidades disponibles los podemos encontrar en los directorios /etc/systemd/system/ y /usr/lib/systemd/system. Aunque el primero tiene preferencia sobre el segundo.

Además podemos listar las unidades en función de su estado, systemctl list-units --all --state=inactive o del tipo de unidad systemctl list-units --all --type=service

La opción list-units solo lista las unidades que el sistema ha intentado cargar en memoria. Para ver todas las unidades disponibles en el sistema, la orden a ejecutar es,

systemctl list-unit-files

El registro de Systemd

Si detectamos alguna unidad que falla, podemos revisar el sistema de registro propio de Systemd que se llama journal. Para ello ejecutaremos la siguiente orden,

journalctl

Por supuesto, podemos utilizar journalctl en combinación con grep para localizar aquello que buscamos, pero además nos proporciona algunas herramientas que nos ayudaran en esa tarea.

  • journalctl -b nos muestra los mensajes del arranque
  • journalctl -f permite seguir los mensajes nuevos
  • journalctl -u <unidad> nos muestra los mensajes de una determinada unidad
  • journalctl _PID=<proceso> muestra los mensajes de un proceso específico

El estado de las unidades

Para comprobar el estado de una unidad ejecutaremos la siguiente orden,

systemctl status unidad

Por ejemplo, si queremos conocer si nuestro servidor de bases de datos MariaDB está en funcionamiento, ejecutaremos la orden,

systemctl status mariadb.service

En el caso de los servicios podemos omitir la extensión, es decir, la orden anterior sería equivalente a systemctl status mariadb.

También podemos saber si una determinada unidad está activa ejecutando la orden, systemctl is-active unidad que nos devolverá active o inactive. Mientras que para saber si la unidad está habilitada, ejecutaremos la orden, systemctl is-enabled unidad que nos devolverá el valor enabled o disabled.

Hay un tercer estado en el que pueden estar las unidades, que es el estado fallo. Para averiguar si una unidad está en fallo, ejecutaremos la orden systemctl is-failed unidad que nos devolverá active ó failed; o en el caso de que se halla detenido de forma intencionada nos devolverá el valor unknown o inactive.

Gestionando unidades

Con lo que hemos visto hasta el momento, ya sabemos el estado de una unidad, pero, ¿como podemos cambiar el estado de una unidad?

Para habilitar una unidad ejecutaremos la orden sudo systemctl enable unidad. Una vez habilitada la unidad la podemos iniciar, para lo que ejecutaremos la orden sudo systemctl start unidad. Si queremos detener una unidad ejecutaremos la orden sudo systemctl stop unidad mientras que si lo que queremos hacer es reiniciar la unidad, ejecutaremos la orden sudo systemctl restart unidad.

También es posible marcar una determinada unidad como imposible de iniciar tanto de forma manual como de forma automática. Al marcar la unidad de esta manera se apunta a /dev/null. Esta operación se conoce como enmascarar la unidad y se hace ejecutando la siguiente orden,

sudo systemctl mask unidad

Si una vez enmascarada una unidad, intentas iniciarla ejecutando la orden sudo systemctl start unidad verás un mensaje de error indicándote que la unidad está enmascarada. Para desenmascarar la unidad ejecuta la orden, sudo systemctl unmask unidad que devolverá la unidad a su estado anterior.

Conclusiones

En este primer artículo has visto como trabajar con Systemd. En particular, todo lo referente a las unidades, que tipos de unidades hay, como gestionarlas, etc. Así, en el próximo capítulo veremos como crear nuestras propias unidades y que utilidad les podemos dar.


Más información,

  • Víctor Manuel Sereno

    Gracias por el aporte, desde que cambiaron el sistema ando más perdido que tarzán en un desierto. Apenas he usado alguna vez este comando para ver como estaba mi base de datos. Habrá que hacerle un hueco.

  • Y si primeramente queremos saber si Systemd se está ejecutando en nuestro sistema no tenemos más que hacer:
    # ps -eaf | grep [s]ystemd
    (debe aparecer como demonio padre, esto es, PID=1)
    Además de conocer el conocer el estado de una unidad, de iniciarla o pararla, de habilitarla o deshabilitarla, también se puede la puede “matar”.
    Y se la puede matar de dos formas, haciendo:
    # systemctl kill nombre.service (le manda una señal SIGTERM)
    # systemctl kill -s SIGKILL nombre.service (le manda una señal más severa, SIGKILL)
    Venga, que aproveche.