Systemd
This content is not available in your language yet.
5.2 Deep Dive en systemd: Gestión de Servicios y Arranque Moderno
Sección titulada «5.2 Deep Dive en systemd: Gestión de Servicios y Arranque Moderno»Introducción
Sección titulada «Introducción»En sistemas Linux modernos, systemd es el núcleo que orquesta el arranque del sistema, la gestión de servicios, el control de recursos y la supervisión de procesos. Sustituyendo al antiguo sistema SysVinit, systemd introduce un modelo declarativo, paralelo y altamente eficiente que permite a los Sysadmins gestionar infraestructuras complejas con precisión y consistencia.
Comprender systemd no es opcional en entornos profesionales: es esencial para diagnosticar fallos de arranque, gestionar servicios críticos, automatizar despliegues y aplicar políticas de control avanzadas.
Objetivos de aprendizaje
Sección titulada «Objetivos de aprendizaje»Al finalizar este capítulo serás capaz de:
- Entender la arquitectura interna de systemd.
- Gestionar servicios con
systemctl. - Interpretar unidades (units) y sus tipos.
- Analizar logs con
journalctl. - Crear y modificar servicios personalizados.
- Diagnosticar problemas de arranque y dependencias.
Conceptos Teóricos
Sección titulada «Conceptos Teóricos»1. ¿Qué es systemd?
Sección titulada «1. ¿Qué es systemd?»-systemd* es un sistema de init y gestor de servicios que:
- Es el proceso PID 1.
- Inicializa el sistema durante el arranque.
- Gestiona servicios (daemon), sockets, dispositivos y mounts.
- Permite ejecución paralela para reducir el tiempo de boot.
2. Tipos de Unidades (Units)
Sección titulada «2. Tipos de Unidades (Units)»Las unidades son la base de systemd. Cada recurso se define como una unit file.
Principales tipos:
- .service → servicios (nginx, sshd)
- .socket → sockets IPC o network
- .target → agrupaciones lógicas (similar a runlevels)
- .mount → puntos de montaje
- .timer → tareas programadas (sustituto de cron en algunos casos)
Ejemplo de ruta estándar:
/usr/lib/systemd/system/→ unidades del sistema/etc/systemd/system/→ overrides del administrador
3. Targets (Runlevels modernos)
Sección titulada «3. Targets (Runlevels modernos)»Systemd reemplaza los runlevels clásicos:
| Runlevel | systemd target |
|---|---|
| 0 | poweroff.target |
| 3 | multi-user.target |
| 5 | graphical.target |
Consultar target actual:
systemctl get-default4. Ciclo de Vida de un Servicio
Sección titulada «4. Ciclo de Vida de un Servicio»Estados típicos:
- active (running)
- inactive
- failed
- activating
Ver estado:
systemctl status nginx5. Dependencias y Orden de Arranque
Sección titulada «5. Dependencias y Orden de Arranque»systemd permite definir relaciones:
- Requires= → dependencia fuerte
- After= → orden de arranque
- Wants= → dependencia débil
Ejemplo conceptual:
[Unit]Requires=network.targetAfter=network.targetLaboratorio Práctico
Sección titulada «Laboratorio Práctico»Escenario
Sección titulada «Escenario»Tienes una aplicación propia (/opt/app/app.sh) que debe ejecutarse como servicio:
- Debe arrancar automáticamente.
- Debe reiniciarse si falla.
- Debe registrar logs correctamente.
Paso 1: Crear archivo de servicio
Sección titulada «Paso 1: Crear archivo de servicio»sudo nano /etc/systemd/system/app.serviceContenido:
[Unit]Description=Aplicación personalizadaAfter=network.target
[Service]Type=simpleExecStart=/opt/app/app.shRestart=alwaysUser=www-data
[Install]WantedBy=multi-user.targetExplicación línea por línea
Sección titulada «Explicación línea por línea»- Description → descripción del servicio.
- After=network.target → espera red disponible.
- Type=simple → proceso principal.
- ExecStart → comando a ejecutar.
- Restart=always → autoreinicio.
- User → usuario de ejecución.
- WantedBy → target donde se habilita.
Paso 2: Recargar configuración
Sección titulada «Paso 2: Recargar configuración»sudo systemctl daemon-reexecsudo systemctl daemon-reloadPaso 3: Iniciar servicio
Sección titulada «Paso 3: Iniciar servicio»sudo systemctl start appPaso 4: Habilitar en arranque
Sección titulada «Paso 4: Habilitar en arranque»sudo systemctl enable appPaso 5: Verificar estado
Sección titulada «Paso 5: Verificar estado»systemctl status appOutput esperado
Sección titulada «Output esperado»● app.service - Aplicación personalizada Loaded: loaded (/etc/systemd/system/app.service) Active: active (running)Paso 6: Ver logs
Sección titulada «Paso 6: Ver logs»journalctl -u app -fErrores Comunes y Troubleshooting
Sección titulada «Errores Comunes y Troubleshooting»1. Servicio falla al iniciar
Sección titulada «1. Servicio falla al iniciar»systemctl status appBusca:
- errores de permisos
- rutas incorrectas
- scripts sin shebang (
#!/bin/bash)
2. Cambios no aplicados
Sección titulada «2. Cambios no aplicados»-Causa:* no recargaste daemon.
sudo systemctl daemon-reload3. Servicio en estado failed
Sección titulada «3. Servicio en estado failed»journalctl -xeRevisa:
- errores de dependencias
- variables de entorno faltantes
4. Permisos incorrectos
Sección titulada «4. Permisos incorrectos»Si el servicio usa User=:
chmod +x /opt/app/app.sh5. Servicio en bucle de reinicio
Sección titulada «5. Servicio en bucle de reinicio»Si usas:
Restart=alwaysPuede generar loops.
Solución alternativa:
Restart=on-failureRestartSec=5Buenas Prácticas (Nivel Senior)
Sección titulada «Buenas Prácticas (Nivel Senior)»1. Usa override en vez de editar unidades nativas
Sección titulada «1. Usa override en vez de editar unidades nativas»systemctl edit nginxEsto crea:
/etc/systemd/system/nginx.service.d/override.conf2. Centraliza logs con journalctl
Sección titulada «2. Centraliza logs con journalctl»journalctl -u nginx --since "1 hour ago"3. Control de recursos (cgroups)
Sección titulada «3. Control de recursos (cgroups)»Ejemplo:
[Service]MemoryLimit=500MCPUQuota=50%4. Usa timers en lugar de cron cuando sea posible
Sección titulada «4. Usa timers en lugar de cron cuando sea posible»systemctl list-timersVentajas:
- mejor integración
- logs automáticos
- dependencias
5. Diagnóstico de arranque
Sección titulada «5. Diagnóstico de arranque»systemd-analyze blameMuestra servicios lentos.
systemd-analyze critical-chainCadena crítica de arranque.
6. Seguridad en servicios
Sección titulada «6. Seguridad en servicios»- No ejecutar como root si no es necesario.
- Usar:
NoNewPrivileges=truePrivateTmp=true7. Validación previa
Sección titulada «7. Validación previa»systemd-analyze verify /etc/systemd/system/app.serviceResumen y Siguiente Paso
Sección titulada «Resumen y Siguiente Paso»Ahora dominas systemd como un Sysadmin profesional: sabes cómo crear, gestionar y diagnosticar servicios, interpretar logs y controlar el arranque del sistema.
Este conocimiento es esencial para gestionar infraestructuras modernas y garantizar alta disponibilidad.
El siguiente paso natural es automatizar tareas recurrentes:
5.3 Tareas Programadas (Cron y systemd timers) donde aprenderás a programar ejecuciones periódicas de forma robusta y controlada.
