Búsqueda de sitios web

Cómo crear y ejecutar nuevas unidades de servicio en Systemd


Hace unos días me encontré con una distro Centos 8 de 32 bits y sentí el deseo de probarla en una máquina antigua de 32 bits. Después de arrancar, me di cuenta de que tenía un error y estaba perdiendo la conexión de red, que tenía que activar manualmente cada vez que arrancaba. Entonces, la pregunta era ¿cómo podría configurar un script que haga este trabajo y que se ejecute cada vez que inicio mi máquina?

Bueno, esto es muy simple y te mostraré la forma del sistema usando unidades de servicio. Pero primero una pequeña introducción a las unidades de servicio.

En este artículo, voy a explicar qué es una “unidad de servicio” en systemd y lo fácil que es crear y ejecutar una. Intentaré simplificar qué son los “objetivos”, por qué los llamamos “conjuntos de unidades” y cuáles son sus “deseos”. Finalmente, aprovechamos una unidad de servicio para ejecutar nuestro propio script después del procedimiento de arranque.

Es obvio que su computadora es útil debido a los servicios que ofrece y para tener esta funcionalidad, se deben llamar a muchos servicios a medida que la computadora arranca y alcanza diferentes niveles.

Otros servicios son llamados para ser ejecutados cuando el ordenador alcanza, por ejemplo, el nivel de rescate (runlevel 0) y otros cuando alcanza el nivel multiusuario (runlevel 3) . Puedes imaginar estos niveles como objetivos.

De forma sencilla, objetivo es un conjunto de unidades de servicio. Si desea ver las unidades de servicio que se ejecutan en su nivel graphical.target, escriba:

systemctl --type=service

Como puede ver, algunos servicios están activos y “ejecutándose” todo el tiempo, mientras que otros se ejecutan una sola vez y finalizan (salen).

Si desea verificar el estado de un servicio, puede usar el comando systemctl como se muestra.

systemctl status firewalld.service

Como puedes ver, verifiqué el estado de firewalld.service (consejo: puedes usar la función de autocompletar para el nombre del servicio ). Me informa que el servicio firewalld se está ejecutando todo el tiempo y está habilitado.

Habilitado y deshabilitado significa que el servicio se cargará permanentemente o no, durante el próximo inicio, respectivamente. Por otro lado, iniciar y detener un servicio tiene la limitación de la sesión presente y no es permanente.

Por ejemplo, si escribe:

systemctl stop firewalld.service
systemctl status firewalld.service

Puede ver que firewalld.service está inactivo (inactivo) pero aún está habilitado, lo que significa que durante el próximo arranque se cargará. Entonces, si queremos que un servicio se cargue durante el tiempo de arranque en el futuro, debemos habilitarlo. ¡Qué gran conclusión! Creemos uno, es fácil.

Si vas a la carpeta:

cd /etc/systemd/system
ls -l

Puede ver algunos archivos de enlaces de servicios de la unidad y algunos directorios de los “deseos” de un objetivo. Por ejemplo, lo que el destino multiusuario quiere que se cargue cuando el procedimiento de arranque alcance su nivel, aparece en el directorio con el nombre /etc/systemd/system/multi-user.target.wants/ .

ls multi-user.target.wants/

Como puede ver, no contiene sólo servicios sino también otros objetivos que también son colecciones de servicios.

Creemos una unidad de servicio con el nombre conexión.servicio.

vim connection.service

y escriba lo siguiente (presione “i ” para el modo de inserción), guárdelo y salga (con “esc ” y “:wq! ” ):

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

Para explicar lo anterior: hemos creado una unidad de tipo de servicio (también puede crear unidades de tipo de destino) y la hemos configurado para que se cargue después de network.target (puede entender que el El procedimiento de arranque alcanza los objetivos con un orden definido) y queremos que cada vez que se inicie el servicio ejecute un script bash con el nombre conup.sh que vamos a crear.

La diversión comienza con la última parte [instalación]. Dice que será buscado por “multi-user.target ”. Entonces, si habilitamos nuestro servicio, se creará un enlace simbólico a ese servicio dentro de la carpeta multi-user.target.wants. ¿Entiendo? Y si lo desactivamos ese enlace se eliminará. Tan sencillo.

Simplemente habilítelo y verifique:

systemctl enable connection.service

Nos informa que se ha creado el enlace simbólico en la carpeta multi-user.target.wants. Puede confirmar ejecutando el comando ls como se muestra.

ls multi-user.target.wants/

Como puede ver, “connection.service” está listo para el próximo inicio, pero primero debemos crear el archivo de script.

cd /root
mkdir scripts
cd scripts
vim conup.sh

Agregue la siguiente línea dentro de Vim y guárdela:

#!/bin/bash
nmcli connection up enp0s3

El comando nmcli para abrir la conexión de red para la interfaz enp0s3.

Por supuesto, si desea que su script ejecute algo más, puede escribir lo que quiera en lugar de la segunda línea.

Por ejemplo,

#!/bin/bash
touch /tmp/testbootfile

eso crearía un archivo dentro de la carpeta /tmp (solo para verificar que su servicio esté funcionando).

También debemos hacer que el script sea ejecutable ejecutando el comando chmod como se muestra.

chmod +x conup.sh

Ahora estamos listos. Si no desea esperar hasta el próximo inicio (ya está habilitado), podemos iniciar el servicio para la sesión actual escribiendo:

systemctl start connection.service

¡Voilá! ¡Mi conexión está activa y funcionando!

Si ha elegido escribir el comando “touch /tmp/testbootfile ” dentro del script, solo para comprobar su funcionalidad, verá este archivo creado dentro de la carpeta /tmp. .

Realmente espero ayudarlo a descubrir de qué se tratan los servicios, deseos, objetivos y ejecución de scripts durante el arranque.