Systemd gestiona los recursos del sistema mediante unidades, cuyas configuraciones se almacenan en directorios específicos con una jerarquía de prioridades bien definida. Comprender estas rutas es fundamental para administrar correctamente los servicios en CentOS 8.
1. Jerarquía de Directorios de Configuración
El sistema busca los archivos de unidad en tres ubicaciones principales, procesándolas en el siguiente orden de prioridad:
- /etc/systemd/system: Directorio con la máxima prioridad. Aquí se encuenrtan las configuraciones personalizadas por el administrador y los enlaces simbólicos generados al habilitar servicios. Los archivos en esta ubicación prevalecen sobre los demás.
- /run/systemd/system: Contiene archivos de configuración generados dinámicamente durante el tiempo de ejecución. Su prioridad es intermedia.
- /usr/lib/systemd/system: Ubicación por defecto donde se instalan los archivos de unidad proporcionados por los paquetes de software. Tiene la prioridad más baja.
2. Clasificación de Unidades (Unit Types)
Las unidades se identifican por su extensión, la cual define el tipo de recurso que representan. Las extensiones más comunes incluyen:
- .service: Define la configuración de un servicio o daemon del sistema.
- .target: Agrupa otras unidades, sirviendo como punto de sincronización; es el equivalente moderno a los niveles de ejecución (runlevels) de SysVinit.
- .socket: Gestiona sockets de red o IPC para la activación basada en sockets, separando la definición del socket del proceso del servicio.
- .mount: Controla los puntos de montaje del sistema de archivos.
- .device: Representa dispositivos de hardware detectados por el kernel.
- .swap: Define el uso de áreas de intercambio (swap).
- .path: Monitorea cambios en el sistema de archivos para activar servicios bajo demanda.
3. Anatomía de un Archivo .service
Un archivo de configuración de servicio típico se divide en tres secciones principales: [Unit], [Service] e [Install].
Sección [Unit]
Esta sección contiene metadatos y define las relaciones de dependencia con otras unidades, independientemente del tipo de unidad.
- Description: Descripción legible del servicio.
- After / Before: Define el orden de arranque.
Afterindica que este servicio debe iniciarse después del especificado. - Requires: Dependencia fuerte. Si la unidad requerida falla, esta unidad también fallará.
- Wants: Dependencia débil. El fallo de la unidad dependiente no impide el inicio de esta.
- Conflicts: Indica unidades que no pueden estar activas simultáneamente con esta.
Sección [Service]
Especifica los comandos y parámetros específicos para el proceso del sevricio.
- Type: Define el comportamiento de inicio.
- simple: El proceso iniciado por
ExecStartes el proceso principal del servicio. - forking: El proceso padre inicia un hijo y luego termina, indicando que el servicio está listo (común para daemons tradicionales).
- oneshot: El proceso debe terminar antes de considerar el servicio activado (para tareas únicas).
- simple: El proceso iniciado por
- ExecStart: Comando completo para iniciar el servicio.
- ExecStop: Comando para detener el servicio.
- Restart: Política de reinicio automático (ej.
on-failure). - EnvironmentFile: Ruta a un archivo que define variables de entorno.
Sección [Install]
Define cómo se comporta la unidad cuando se habilita o deshabilita.
- WantedBy: Define en qué objetivo (target) se instalará el enlace simbólico. Por ejemplo,
multi-user.targetindica que el servicio debe iniciarse en el modo multiusuario.
Ejemplo de Configuración
A continuación se muestra un ejemplo de definición de un servicio personalizado:
[Unit]
Description=Servidor de Aplicaciones Backend
Requires=network-online.target
After=network-online.target
[Service]
Type=simple
User=appuser
Group=appgroup
WorkingDirectory=/opt/backend
ExecStart=/usr/bin/java -jar backend-app.jar
ExecStop=/bin/kill -WINCH ${MAINPID}
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target
4. Recarga de Configuración
Cualquier modfiicación manual en los archivos de unidad requiere notificar a systemd para que recargue las configuraciones y aplique los cambios:
systemctl daemon-reload