Systemd es el corazón de las distribuciones Linux modernas. Cada vez que enciendes tu ordenador, systemd arranca el sistema, monta discos, inicia servicios, gestiona la red y supervisa que todo siga funcionando. Dominar systemd es imprescindible para cualquier administrador de sistemas, y esta guía te enseña desde los comandos básicos hasta la creación de servicios y timers profesionales.
⚙️ ¿Qué es systemd?
Systemd es un sistema de inicialización (PID 1) y gestor de servicios creado por Lennart Poettering y Kay Sievers en 2010. Reemplazó a SysVinit en prácticamente todas las distribuciones principales: Ubuntu, Debian, Fedora, RHEL, Arch, openSUSE y muchas más.
A diferencia de SysVinit, que arrancaba los servicios secuencialmente mediante scripts de shell, systemd arranca servicios en paralelo, gestiona dependencias automáticamente, supervisa procesos, ofrece activación por socket y por bus, y centraliza los logs con journald. El resultado es un arranque significativamente más rápido y una gestión de servicios más robusta y predecible.
| Característica | SysVinit (antiguo) | Systemd (moderno) |
|---|---|---|
| Arranque | Secuencial (lento) | Paralelo (rápido) |
| Configuración | Scripts de shell | Unit files declarativos |
| Dependencias | Manual (números de orden) | Automáticas (After=, Requires=) |
| Supervisión | No (si falla, queda muerto) | Sí (Restart=on-failure) |
| Logs | Archivos de texto dispersos | journald centralizado y estructurado |
| Activación | Solo en arranque | Socket, bus, timer, path, dispositivo |
🎛️ systemctl: comandos esenciales
systemctl es el comando principal para interactuar con systemd. Con él gestionas servicios, consultas estados, habilitas arranque automático y mucho más.
📄 Anatomía de un unit file
Los unit files son archivos de configuración declarativos que describen los recursos que systemd gestiona. Cada unit file tiene extensión según su tipo: .service, .timer, .mount, .socket, .target, etc.
| Directiva | Sección | Significado |
|---|---|---|
After= | [Unit] | Arrancar después de estas unidades |
Requires= | [Unit] | Dependencia fuerte: falla si la dependencia falla |
Wants= | [Unit] | Dependencia débil: preferible pero no obligatoria |
Type= | [Service] | simple, forking, oneshot, notify, idle |
ExecStart= | [Service] | Comando para iniciar el servicio |
Restart= | [Service] | no, on-failure, on-abnormal, always |
User= | [Service] | Usuario con el que se ejecuta (no usar root) |
WantedBy= | [Install] | Target que activa este servicio |
🔧 Crear servicios personalizados
Crear tu propio servicio systemd es la forma profesional de ejecutar aplicaciones en un servidor. En lugar de lanzar procesos manualmente con nohup o screen, un servicio systemd arranca automáticamente, se reinicia si falla y queda registrado en los logs.
ProtectSystem=strict (sistema de archivos de solo lectura), ProtectHome=true (sin acceso a /home), NoNewPrivileges=true (no puede escalar privilegios) y ReadWritePaths= para permitir solo los directorios que necesita. Esto limita el daño si el servicio es comprometido.
🎯 Targets y niveles de arranque
Los targets de systemd reemplazan los antiguos runlevels de SysVinit. Un target agrupa un conjunto de servicios que deben estar activos para un estado concreto del sistema.
| Target systemd | Runlevel SysVinit | Descripción |
|---|---|---|
poweroff.target | 0 | Apagar el sistema |
rescue.target | 1 | Modo rescate (un solo usuario, sin red) |
multi-user.target | 3 | Multiusuario con red, sin interfaz gráfica |
graphical.target | 5 | Multiusuario con interfaz gráfica |
reboot.target | 6 | Reiniciar el sistema |
emergency.target | — | Shell de emergencia mínimo |
📋 journalctl: logs del sistema
journalctl es la herramienta de consulta de logs de systemd. Centraliza todos los mensajes del kernel, servicios, arranque y aplicaciones en un formato estructurado y consultable con filtros potentes.
⏱️ Timers: alternativa moderna a cron
Los timers de systemd son la alternativa moderna a cron. Un timer es una unidad .timer que activa un servicio .service en momentos o intervalos definidos. Sus ventajas: logs integrados con journalctl, ejecución recuperable si el sistema estaba apagado, y dependencias de systemd.
daily (cada día), weekly (cada lunes), hourly (cada hora), *-*-* 03:00:00 (cada día a las 3), Mon *-*-* 09:00:00 (cada lunes a las 9). Puedes verificar la expresión con systemd-analyze calendar "Mon *-*-* 09:00:00".
🚀 Análisis y optimización del arranque
Systemd incluye herramientas para analizar el arranque del sistema y detectar cuellos de botella. Esto es especialmente útil en servidores donde cada segundo de arranque importa.
✏️ Ejercicios prácticos
Ejercicio 1: Servicio de monitorización
Enunciado: Crea un servicio systemd que ejecute un script cada vez que se inicia. El script debe registrar en /var/log/monitor.log la fecha, el uso de disco y la memoria libre. Configúralo para que se reinicie automáticamente si falla.
▶ Ver solución
Ejercicio 2: Timer para limpieza de temporales
Enunciado: Crea un timer systemd que ejecute un script de limpieza de archivos temporales cada domingo a las 4:00 AM. El script debe eliminar archivos de más de 7 días en /tmp.
▶ Ver solución
⚠️ Errores frecuentes y soluciones
| Error | Causa | Solución |
|---|---|---|
Failed to start: Unit not found | Typo en nombre o archivo no existe | Verificar nombre en /etc/systemd/system/ |
Main process exited, code=exited, status=203 | El binario no existe o sin permisos | Verificar ruta en ExecStart y chmod +x |
code=exited, status=217/USER | El usuario especificado en User= no existe | Crear el usuario: sudo useradd -r usuario |
| Cambios en unit file no se aplican | Falta recargar la configuración | sudo systemctl daemon-reload |
| El servicio se reinicia en bucle | Restart= sin StartLimitBurst | Añadir StartLimitBurst=5 y StartLimitIntervalSec=60 |
| Timer no se ejecuta | Timer habilitado pero servicio no existe | El .timer y el .service deben tener el mismo nombre base |
/etc/systemd/system/ es para servicios del administrador (los tuyos). /lib/systemd/system/ es para servicios de paquetes (no editar directamente). Si necesitas modificar un servicio de paquete, crea un override: sudo systemctl edit nginx abrirá un archivo de sobreescritura parcial sin tocar el original.
❓ Preguntas frecuentes sobre Systemd en Linux: guía completa de gestión de servicios
Las dudas más comunes respondidas de forma clara y directa.
💬 Foro de discusión
¿Tienes dudas sobre Systemd en Linux: guía completa de gestión de servicios? Comparte tu pregunta con la comunidad.
Todavía no hay mensajes. ¡Sé el primero en participar!
Guía de iniciación a Linux
Las cuatro lecciones más consultadas del curso, en un PDF de 35 páginas que puedes leer sin conexión: qué es Linux, cómo descargarlo y verificar la descarga, qué distribución elegir y la instalación completa de Linux Mint paso a paso.
🎓 ¿Se puede aprender Linux con un curso bonificado por FUNDAE?
Sí. La administración de sistemas y servidores Linux es formación 100 % bonificable por FUNDAE para trabajadores de empresas españolas. Ciberaula, centro acreditado desde 1997, la imparte con tutor personal.
Administración de Servidores Linux para Empresas: de Cero a Nivel Avanzado (40 h) →
También te puede encajar: Administración de Sistemas Linux y Shell Script para Empresas → · Bash Scripting y Terminal Linux: Automatización de Sistemas →
Ver todos los cursos de Linux bonificados del catálogo → · Ciberaula · Centro acreditado FUNDAE (Reg. 99000171) · 91 530 33 87 · admision@ciberaula.com
💻 Formación en Linux y sistemas, bonificable por tu empresa
Si trabajas en una empresa española puedes formarte con coste bonificado a través del crédito de formación FUNDAE. Consulta el catálogo completo de cursos bonificados para empresas en Ciberaula, centro acreditado desde 1997.