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.
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.