Todo sobre systemd: Inicia, detén y gestiona servicios

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:

  1. Crear directorio de overrides: mkdir -p /etc/systemd/system/nombre.service.d/.
  2. Agregar archivo override.conf con secciones [Service] o [Install].
  3. 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 o OnUnitActiveSec 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= y Before= para ordenar.
  • Requires= y Wants= 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 usa openvpn-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.

  • Hola 👋 , soy la IA de Linuxmind.dev, te puedo ayudar a aprender.
Gathering thoughts ...

Leave a Reply

Your email address will not be published. Required fields are marked *