Administrar servicios de Systemd con Systemctl en Ubuntu (Parte 2)
Aunque en la primera parte de este artículo hablamos únicamente de los servicios, lo cierto es que Systemd administra una gran variedad de recursos. Estos recursos reciben el nombre genérico de unidades. y se utilizar para representar de forma abstracta servicios, dispositivos, recursos de red, etc.
La forma más sencilla de identificar el tipo al que pertenece una unidad es a través del sufijo incluido al final de su nombre. Veamos algunos de los tipos de unidades que puede administrar Systemd, aunque la lista no pretende ser exhaustiva, nos da una idea de su finalidad:
- .service: Las unidades de este tipo describen cómo administrar una aplicación o un servicio: cómo iniciarlo o pararlo, en qué condiciones debe iniciarse automáticamente o la dependencia de otro software.
- .socket: Cada unidad de este tipo describe un socket de red o IPC (Inter-Process Communication), o un buffer FIFO para la activación basada en sockets. Siempre tienen asociado un archivo .service que se activará cuando haya actividad en el socket correspondiente.
- .mount: Las unidades de este tipo definen puntos de montaje administrados por Systemd. De este modo, las entradas definidas en /etc/fstab pueden disponer de unidades que se creen automáticamente.
- .automount: Definen puntos de montaje automáticos. Cada unidad de este tipo tendrá otra unidad .mount donde se definan los detalles de montaje particulares.
- .device: Estas unidades describen dispositivos que deben ser administrados con Systemd. No todos los dispositivos se encuentran en este grupo.
- .swap: Describen áreas de intercambio del sistema.
La palabra socket identifica un mecanismo de intercambio ordenado y fiable de un flujo de datos entre dos componentes software distintos.
Estos componentes software pueden estar en diferentes ordenadores, o en el mismo.
Los archivos que definen las diferentes unidades suelen almacenarse en el directorio /lib/systemd/system. Por ejemplo, en la siguiente imagen se muestra el contenido del directorio y la unidad que representa al servicio systemd-networkd.service que usábamos en la primera parte del artículo.
Todos los archivos contenidos en el directorio /lib/systemd/system están escritos en formato de texto plano.
Sin embargo, si queremos hacer modificaciones, lo ideal es crear un nuevo archivo en /etc/systemd/system. Estos archivos tendrán prioridad sobre los anteriores, que actuarán como una copia de respaldo en el caso de que un archivo nuevo no funcione como esperábamos.
Si necesitamos modificar sólo una parte de la definición, podemos crear un directorio con el nombre de la unidad, terminada en .d. En su interior, incluiremos un archivo con extensión .conf que anule o extienda las definiciones del archivo original.
Por ejemplo, para modificar la definición de systemd-networkd.service crearemos el directorio /etc/systemd/system/systemd-networkd.service.d y, en su interior, un archivo que podríamos llamar ajustes.conf donde crearemos las nuevas opciones o las nuevas versiones de las opciones existentes.
Cuando el sistema necesita crear archivos de unidades de forma temporal, los almacena en /run/systemd/system, aunque éstos se perderán en el siguiente reinicio.
Formato general de un archivo de unidad
Como puedes ver en la imagen anterior, un archivo de unidad puede contener diferentes tipos de líneas:
- Las que van precedidas por un carácter almohadilla representan comentarios y no serán tenidas en cuenta por Systemd.
- Las que contienen una palabra entre corchetes ([]) representan el comienzo de una sección. En ellas se diferencia entre mayúsculas y minúsculas.
- Debajo de cada inicio de sección, podemos encontrar directivas. Están formadas por una palabra clave y un valor separados por un signo igual (=).
Veamos un ejemplo (incompleto) extraído del archivo systemd-networkd.service:
# This file is par of systemd. [Unit] Description=Network Service Documentation=man:systemd-networkd.service(8) ConditionCapability=CAP_NET_ADMIN DefaultDependencies=no
Cuando necesitemos redefinir una directiva, bastará con incluirla en el archivo .conf asignándole un nuevo valor. Si lo que necesitamos es anularla, la incluiremos, pero sin escribir nada después del signo igual.
Al escribir este artículo, sólo pretendemos ofrecerte una visión general sobre el funcionamiento de Systemd, pero si necesitas profundizar más en la construcción de archivos de unidad, te recomiendo la documentación ofrecida por RedHat: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files.
Algunos comandos útiles.
En la primera parte de este artículo, hemos aprendido algunos usos de systemctl para manejar los servicios del sistema. Sin embargo, también podemos utilizarlo para obtener información general sobre las unidades en general.
Por ejemplo, si queremos saber qué unidades se encuentran activas, basta con usar el siguiente comando:
systemctl list-units
list-units es la opción predeterminada de systemctl por lo que, si nos limitamos a ejecutarlo sin opciones, obtendremos el mismo resultado:
systemctl
Como vemos en la imagen, la información ofrecida para cada unidad es mucho mayor de lo que cabe en una línea de texto y es complicado interpretarla.
Por esto, quizás sea mejor idea redireccionar la salida a un archivo de texto que podamos analizar de una forma más ordenada:
systemctl list-units > salida.txt
nano salida.txt
Si queremos incluir también en la lista las que no se encuentren activas en estos momentos, bastará con añadir el modificador –all:
systemctl list-units --all
Para obtener un listado de todas las unidades instaladas en el sistema, incluyendo las que systemd no ha tratado de cargar en memoria, bastará con este comando:
systemctl list-unit-files
Si necesitamos conocer las dependencias de una determinada unidad, por ejemplo, del servicio escribiremos lo siguiente:
systemctl list-dependencies systemd-networkd.service
Por último, si necesitas saber qué unidades han producido algún problema durante su inicio, basta con utilizar el siguiente comando:
systemctl --failed
… Y hasta aquí el artículo de hoy. Espero que te haya parecido interesante.