Todo sobre systemd: Inicia, detén y gestiona servicios
systemd se ha convertido en el sistema de inicio y gestor de servicios por excelencia en la mayoría de las distribuciones Linux modernas. En este artículo profundizaremos en su arquitectura, comandos básicos y avanzados, unidades de servicio, temporizadores, administración de logs, contenedores y buenas prácticas para sacarle el máximo provecho.
1. ¿Qué es systemd
systemd es un sistema de inicialización paralelo y un gestor de servicios que sustituye al tradicional sysvinit
. Aprovecha el modelado de dependencias, la activación bajo demanda, los cgroups (control groups) y un poderoso demonio de registro para ofrecer:
- Arranque más rápido mediante inicialización paralela.
- Gestión centralizada de servicios, sockets y temporizadores.
- Registro estructurado con
journald
. - Control de recursos y aislamiento a través de cgroups.
2. Arquitectura y componentes clave
Demonio systemd
Se invoca como PID 1
y coordina el arranque, la parada y la supervisión de servicios.
systemctl
Herramienta de línea de comandos principal para interactuar con systemd (arrancar/parar servicios, habilitar al inicio, etc.).
journald
Sistema de registro que almacena logs de manera estructurada reemplaza a rsyslog
en muchos casos.
Otros demonios
systemd-logind
: gestión de sesiones de usuario.systemd-networkd
: configuración de red declarativa.systemd-resolved
: resolución DNS local.
3. Tipos de unidades (unit files)
Las unidades describen recursos que systemd controla. Cada archivo termina en .service
, .socket
, .timer
, etc. A continuación un resumen:
Tipo | Descripción | Uso común |
---|---|---|
.service | Define un servicio (daemon). | Apache, MySQL. |
.socket | Activa servicios bajo demanda por sockets. | ssh.socket. |
.target | Agrupa unidades. Equivalente a runlevels. | graphical.target. |
.timer | Temporizador que activa un .service. | Backups periódicos. |
4. Uso básico de systemctl
systemctl start nombre.service
: inicia un servicio.systemctl stop nombre.service
: detiene un servicio.systemctl restart nombre.service
: reinicia.systemctl reload nombre.service
: recarga configuración.systemctl enable nombre.service
: habilita al inicio.systemctl disable nombre.service
: deshabilita al inicio.systemctl status nombre.service
: muestra estado y logs recientes.
5. Administración avanzada de servicios
Para personalizar unidades sin alterar las originales:
- Crear directorio de overrides:
mkdir -p /etc/systemd/system/nombre.service.d/
. - Agregar archivo
override.conf
con secciones [Service] o [Install]. - Recargar demonio:
systemctl daemon-reload
.
Ejemplo de override:
[Service]
Restart=always
RestartSec=5s
6. Programación con timers
Los temporizadores permiten sustituir cron
con ventajas como dependencias y logs unificados.
OnCalendar
para agendar fechas/hora.OnBootSec
oOnUnitActiveSec
para disparos relativos.
[Unit]
Description=Ejecuta backup diario
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
7. Socket Activation
Permite iniciar servicios bajo demanda. El socket queda escuchando y arranca el .service cuando llega tráfico.
8. Targets y dependencias
Los .target
reemplazan a los runlevels. Ejemplos:
multi-user.target
: modo texto multiusuario.graphical.target
: modo gráfico.basic.target
: servicios esenciales.
Dependencias:
After=
yBefore=
para ordenar.Requires=
yWants=
para vínculos fuertes o débiles.
9. Monitorización y logs
journalctl
es la herramienta para consultar journald:
journalctl -u nombre.service
: logs de un servicio.journalctl -xe
: eventos recientes y errores.journalctl --since 2 hours ago
: rango de tiempo.
10. Slices, scopes y watchdog
Slices agrupan cgroups para controlar recursos. Unidades .slice
pueden delimitar CPU, memoria y I/O.
Scopes gestionan procesos externos lanzados fuera de systemd.
Watchdog supervisa servicios y reinicia si no responden en tiempo.
11. systemd-nspawn y contenedores
systemd-nspawn
permite lanzar contenedores ligeros, ideales para pruebas de unidades aisladas. Ejemplo:
sudo debootstrap --arch=amd64 stable /var/lib/machines/test
sudo systemd-nspawn -D /var/lib/machines/test
12. Buenas prácticas y recomendaciones
- Usar overrides (
/etc/systemd/system/.d/
) para personalización. - No editar archivos en
/usr/lib/systemd/system/
directamente. - Revisar logs con
journalctl
antes de reiniciar demonios. - Versionar en git
/etc/systemd
para trazabilidad. - Evitar dependencias circulares en unidades.
13. Ejemplos prácticos
Creemos un servicio sencillo que ejecute un script de mantenimiento cada noche:
/etc/systemd/system/mantenimiento.service
[Unit]
Description=Script de mantenimiento diario
[Service]
Type=oneshot
ExecStart=/usr/local/bin/mantenimiento.sh
[Install]
WantedBy=multi-user.target
/etc/systemd/system/mantenimiento.timer
[Unit]
Description=Temporizador mantenimiento nocturno
[Timer]
OnCalendar=-- 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
Activamos:
systemctl daemon-reload
systemctl enable --now mantenimiento.timer
14. Gestión de VPNs con systemd
Para servicios de red como VPN, systemd ofrece integración nativa con systemd-networkd
y netplan
. Ejemplos:
- OpenVPN: crea un
.service
o usaopenvpn-client@.service
para perfiles. - WireGuard: systemd-networkd puede cargar la interfaz
wg0
al inicio.
Conclusión
systemd es más que un simple init es un ecosistema completo para gestión de servicios, recursos y contenedores. Dominar sus unidades, temporizadores, dependencias y registros garantiza una administración eficiente y fiable de sistemas Linux modernos.
Leave a Reply