Targets en systemd: introducción a objetivos

Bajo systemd, el concepto de runlevel o nivel de corrida solamente se mantiene por compatibilidad con SysVinit. El componente básico de systemd se denomina unidad (unit). Existen varias categorías de unidades: las más conocidas se denominan servicios (services) y objetivos (targets). Las primeras son las que ejecutan los daemons y sus dependencias en el orden apropiado. Por otro lado, las segundas se utilizan para agrupar varias unidades. Estas últimas pueden compararse en cierta forma a los clásicos runlevels. En este post haremos una introducción a los objetivos o targets en systemd.

Targets en systemd

Dentro de /etc/systemd/system podemos encontrar las definiciones de las distintas unidades. Para empezar, cabe aclarar que los archivos de configuración de los targets llevan el sufijo .target. Por ejemplo, podemos encontrar basic.target y multi-user.target. Este último es el objetivo donde se encuentran agrupados la mayoría de los daemons. Para funcionar correctamente, se necesita que basic.target esté activado. Dicho de otra forma, antes de entrar en multi-user.target, todos los servicios agrupados en basic.target deben haberse iniciado. A su vez, basic.target requiere sysinit.target.

El objetivo basic.target en esencia cubre todo lo relacionado con el inicio del sistema. Luego, podemos decir lo siguiente en general: Si en A.target se indica Requires=B.target, hablamos que el objetivo B es una dependencia del A.

Wants y After

En los archivos .target podemos llegar a encontrar líneas que comienzan con las palabras Wants y After. En la Fig. 1 podemos apreciar el contenido de /lib/systemd/system/basic.target:

Targets en systemd: inspeccionando basic.target
Figura 1 – Targets en systemd: inspeccionando basic.target

El significado de las mismas es el siguiente:

  • Wants es similar a Requires. Se utiliza para indicar las unidades que se deben iniciar. Si alguna de ellas produce algún error, eso no ocasiona una falla en el funcionamiento del target considerado.
  • After se utiliza para indicar un orden deseado más que una lista de dependencias (también existe un Before, aunque no aparece en nuestro ejemplo actual).

De esta manera, basic.target indica que se deben iniciar sockets.target, timers.target, paths.target, y slices.target. Además, basic.target se iniciará luego (after) de sysinit.target, sockets.target, paths.target, slices.target, y tmp.mount.

Espero que este post les haya resultado útil. ¡Nos leemos en el próximo!

¡Aprovechá la oportunidad de suscribirte al blog para recibir en tu correo el post nuestro de cada día, novedades, y promociones exclusivas!