Guía técnica de gestión de servicios en systemd para administradores de sistemas

Systemd ya es de facto el sistema de inicio para la gran mayoría de distros Linux, con Gentoo resistiendo como una aldea de galos frente a un asedio romano.

Distribuciones Linux con systemd

Distribuciones Linux con systemd

Para bien o para mal -personalmente desde un punto de vista de la administración prefiero el nuevo sistema- habrá que ir haciéndose a la idea de que estos cambios se van a mantener a largo plazo.

El artículo pretende ser una guía técnica con los comandos y opciones más comunes. Para una guía más teórica y explicación del funcionamiento interno de systemd qué menos hacer una visita al blog de su creador Lennart Poettering.

Gestión de servicios con systemctl

Para administrar servicios utilizaremos el comando systemctl:

#	Listar todos los servicios activos (ejecutándose) del sistema
systemctl list-units --type service

#	Listar todos los servicios activos y también los inactivos
systemctl list-units --type service --all

#	Iniciar, parar o reiniciar un servicio
systemctl start nombre.service
systemctl stop nombre.service
systemctl restart nombre.service

#	Reiniciar únicamente si el servicio está ya iniciado
systemctl try-restart nombre.service

#	Recargar configuración
systemctl reload nombre.service

#	Comprobar el estado de un servicio o si se está habilitado (enabled)
systemctl status nombre.service
systemctl is-enabled nombre.service

#	Comprobar si un servicio está activado (ejecutándose)
systemctl is-active nombre.service

#	Habilitar un servicio (para que se inicie al arrancar el sistema)
systemctl enable nombre.service

#	Deshabilitar servicio
systemctl disable nombre.service

#	Hacer kill a un servicio (por defecto SIGTERM)
systemctl kill nombre.service

#	Podemos especificar la señal que enviamos para hacer el kill con -s. 
#	Por ejemplo enviar SIGKILL
systemctl kill -s SIGKILL nombre.service

La cantidad de señales que le podemos pasar a la opción kill darían para un artículo entero.

También podemos hacer un reinicio, halt o apagado del sistema:

systemctl reboot 
systemctl halt
systemctl poweroff

A mencionar dos opciones bastante interesantes:

#	Enmascarar
systemctl mask nombre.service

#	Desenmascarar
systemctl unmask nombre.service

Cuando enmascaramos un servicio, no sólo lo deshabilitamos sino que evitamos que se pueda iniciar manual o automáticamente.

En otro orden de cosas, podemos analizar el tiempo de inicio de cada uno de los servicios al arrancar el sistema con systemd-analyze blame:

systemd-analyze blame

También podemos ver el árbol de procesos iniciados por cada servicio:

systemd-cgls

He encontrado alguna que otra herramienta gráfica para gestionar los servicios como systemd-ui para entornos GTK o Kcmsystemd en KDE… pero sinceramente, no merecen la pena teniendo en cuenta la flexibilidad que nos ofrece la terminal.

Gestión de logs con journalctl

Todos esos servicios de sistema también generan registros/logs. Con systemd, estos logs podemos gestionarlos de manera centralizada con otro componente llamado journalctl. El fichero de configuración principal lo encontramos en /etc/systemd/journald.conf.

#	Listar todos los registros
journalctl

#	Mostrar mensajes del kernel
journalctl -k

#	Seguir el journal en tiempo real (como tail -f)
journalctl -f

#	Listar log del último arranque del sistema (boot)
journalctl -b

#	Cada arranque (boot) de sistema tiene un nº (0 para el actual) e ID asignado
journalctl --list-boots

#	Log de arranque de hace dos inicios, bien con el parámetro -b o con su ID		
journalctl -b -2

#	Mostrar cuánto ocupan los registros de journald
journalctl --disk-usage

#	Limpiar registros reteniendo como máximo 2GB
journalctl --vacuum-size=2G

#	Limpiar registros y retener sólo los 2 últimos años
journalctl --vacuum-time=2years

#	Ver registros por PID de proceso, UID de usuario o ID arranque (boot)
journalctl _PID=pid
journalctl _UID=uid
journalctl _BOOT_ID=identificador_de_boot

#	Ver registro de un servicio en concreto
journalctl -u nombre.service

#	Filtrar por prioridad, siendo 0 la mayor y 7 la menor
#	debug (7), info (6), notice (5), warning (4), err (3), crit (2), alert (1), and emerg (0) 
journalctl -p 1
journalctl -p alert
...

#	Filtro por horas, fechas...
#	Utilizando formato YYYY-MM-DD HH:MM:SS
#	o comodines como yesterday, today, tomorrow o now
journalctl --since "2014-03-15 18:20:00"
journalctl --since "2014-03-15" --until "2014-08-20 05:00"
journalctl --since=09:00 --until=16:30
journalctl --since=yesterday

#	Mostrar registros a partir de binarios (no siempre es posible)
journalctl /sbin/sshd

#	Finalmente, podemos utilizar filtros combinados a partir de las distintas opciones que hemos visto anteriormente
journalctl -p warning --since "2014-03-15 18:20:00" _UID=1000
journalctl -u sshd --since=00:00 --until=9:30

¿Quién puede ver los registros que va recopilando journald?

En un principio y como es tradición en los sistemas Linux, root tiene acceso a todo. Un usuario normal únicamente podrá ver los registros propios, pero nada más a nivel de sistema. Para tener acceso a estos datos tendremos que añadir al usuario al grupo adm:

usermod -a -G adm [usuario]

Persistencia de datos

La persistencia de datos de journald está activada por defecto en las últimas versiones de distros que utilizan systemd. Podemos comprobar si en nuestra distro está activada esa persistencia viendo si existe el siguiente directorio:

/var/log/journal

Si no está, lo creamos:

mkdir /var/log/journal

Reiniciamos la máquina y vemos que en el directorio /var/log/journal ya tendremos algún registro guardado.