Proceso de inicio de Linux con Systemd

El proceso de inicio con Systemd está siendo adoptado por la mayoría de las distribuciones de Linux tanto para Debian y RedHat como para sus derivados.

A diferencia de los scripts de inicio y los runlevel de SysV el sistema Systemd utiliza “units” y “Targets” para definir el modo de ejecución de procesos y servicios en el arranque del sistema.

El uso de Systemd viene definido por el parámetro del Kernel  init=/bin/systemd Este parámetro hace que el sistema busque los servicios o procesos para iniciar el sistema en el denominado “default target” y no en el inittab como hacía en SysV.

Units

Los units se definen como acciones o servicios en el sistema y son la base de Systemd. La nomenclatura utilizada tiene la estructura siguiente:

nombre.tipo

Existen ocho tipos diferentes dependiendo de la función que realizan:

  • automount
  • device
  • mount
  • path
  • service
  • snapshot
  • socket
  • target

Las unidades de tipo target son agrupaciones de unidades que permiten el inicio de varias unidades a la vez, por ejemplo la unidad network.target que agrupa todas las unidades para iniciar el servicio de red del sistema incluyendo sus tarjetas de red.

Un ejemplo de contenido de un unit para el servicio udev (udev.service)

udev.service

Podemos apreciar que se definen parámetros como cuando iniciar el servicio y que características posee.

Targets

La inicialización del sistema con Systemd utiliza targets de forma similar a los runlevels de SysV, de hecho podemos encontrar todos los niveles de ejecución definidos como targets con la nomenclatura runlevel[num_level].target. Estos targets agrupan a varios units para realizar la función requerida. La relación seria la siguiente:

Nivel de ejecución de SysV

Target de systemd

0

runlevel0.target, poweroff.target

1, s, single

runlevel1.target, rescue.target

2, 4

runlevel2.target, runlevel4.target, multi-user.target

3

runlevel3.target, multi-user.target

5

runlevel5.target, graphical.target

6

runlevel6.target, reboot.target

emergency

emergency.target

Podemos ver el target con el que se ejecuta nuestro sistema con el comando:

# systemctl get-default

systemctl

Ubicación de los units y targets

Todos los targets y unidades por defecto se encuentran bajo el directorio  /usr/lib/systemd, además de esta ubicación podemos añadir los targets propios en /etc/systemd, cualquier script en este directorio tendrá preferencia sobre los ubicados en /usr/lib/systemd.

Hay varias formas de sobreescribir o añadir nuevos escripts, por ejemplo si creamos el script (unit) ssh.server en /etc/systemd este sobreescribira al script con el mismo nombre en /usr/lib/systemd, otra forma es crear una carpeta con el nombre del servicio terminada en «.d», por ejemplo /etc/systemd/system/ssh.server.d/ y dentro de ella agregar uno o varios archivos de configuración con la extensión «.conf».

Por último hay una tercera ubicación que sería en /run/systemd que tiene preferencia sobre /usr/lib/systemd pero no sobre /etc/systemd y las configuraciones aplicadas aquí son borradas en el próximo reinicio.

Se pueden ver todas las sobreescrituras de scripts con el comando systemd-delta

Este comando devolverá los siguientes estados:

  • MASKET: Muesta las unidades que no se pueden iniciar.
  • EQUIVALENT: Sobreescriben otras unidades con el mismo contenido
  • REDIRECT: Symbolic links a otras unidades
  • OVERRIDDEN: Unidades sobreescritas
  • EXTENDED: Unidades extendidas con ficheros .conf

systemd-delta

Comando systemctl

Este comando permite la gestión de los units y targets. A continuación mostramos una lista básica de usos de este comando:

Ver todas las unidades cargadas en memoria 

# systemctl list-units

Activa una unidad

# systemctl start [unidad]

Para una unidad

# systemctl stop [unidad]

Reinicia una unidad

# systemctl restart [unidad]

Recarga una unidad

#systemctl reload [unidad]

Muestra el estado de una unidad

#systemctl status [unidad]

Activa una unidad para iniciarse en el arranque

#systemctl enable [unidad]

Desactiva una unidad para iniciar en el arranque

#systemctl disable [unidad]

Enmascara una unidad para que no se pueda iniciar

#systemctl mask [unidad]

Desenmascara una unidad para que se inicie

#systemctl umask [unidad]

Muesta los tagets presentas

# systemctl list-units –type=target

Muestra el target por defecto

# systemctl get-default

Cambia el target por defecto

# systemctl isolate graphical.target