Saltar la navegación

Habilitar, deshabilitar y enmascarar un servicio

Habilitar una unidad systemd, en este caso una unidad de servicio, significa enganchar el servicio a un lugar determinado (hay varios posibles), como por ejemplo, el arranque del sistema, lugar indicado por la opción --system, que es la opción por defecto cuando se habilita una unidad, y normalmente no se pone. Por lo tanto, si queremos hacer que un servicio se inicie cuando arranque el sistema, usaremos la opción enable:

# systemctl enable unidad...

O también, pero más largo:

# systemctl enable unidad... --system

Por ejemplo:

# systemctl enable NetworkManager
Created symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service → /lib/systemd/system/NetworkManager.service.
Created symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service → /lib/systemd/system/NetworkManager-dispatcher.service.
Created symlink /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service → /lib/systemd/system/NetworkManager-wait-online.service.
# systemctl status NetworkManager
● NetworkManager.service - Network Manager
Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; preset: enabled)
Active: active (running) since Wed 2023-11-08 17:36:30 CET; 1h 33min ago
Docs: man:NetworkManager(8)
Main PID: 735 (NetworkManager)
Tasks: 3 (limit: 9190)
Memory: 15.3M
CPU: 374ms
CGroup: /system.slice/NetworkManager.service
└─735 /usr/sbin/NetworkManager --no-daemon

Si queríamos solo comprobar que el servicio está habilitado, en vez de usar la acción status, podríamos haber usado la acción is-enabled:

# systemctl is-enabled NetworkManager
enabled

Pero hay que tener en cuenta que lo que acabamos de hacer es simplemente enganchar el servicio al arranque del sistema, pero no iniciar el servicio (start), que es una cosa diferente. El servicio puede estar ejecutándose o no, y lo podemos habilitar o deshabilitar, son dos cosas diferente.

Ver si el servicio está activo (ejecutándose) o no, también lo podemos ver con status o la acción is-active:

# systemctl status NetworkManager
● NetworkManager.service - Network Manager
Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; preset: enabled)
Active: active (running) since Wed 2023-11-08 17:36:30 CET; 1h 33min ago
Docs: man:NetworkManager(8)
Main PID: 735 (NetworkManager)
Tasks: 3 (limit: 9190)
Memory: 15.3M
CPU: 374ms
CGroup: /system.slice/NetworkManager.service
└─735 /usr/sbin/NetworkManager --no-daemon
# systemctl is-active NetworkManager
active

Se puede usar la opción --now si queremos habilitar el servicio y a la vez activarlo (start) si no lo estuviera:

# systemctl enable NetworkManager --now

La operación contraria a enable es la acción disable, con la cual desenganchamos una unidad systemd de un lugar sugerido, en nuestro caso, el arranque del sistema (--system).

Por ejemplo, para hacer que el servicio NetworkManager no se cargue en el arranque del sistema, ejecutaremos:

# systemctl disable NetworkManager
Removed "/etc/systemd/system/multi-user.target.wants/NetworkManager.service".
Removed "/etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service".
Removed "/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service".
# systemctl status NetworkManager
● NetworkManager.service - Network Manager
Loaded: loaded (/lib/systemd/system/NetworkManager.service; disabled; preset: enabled)
Active: active (running) since Wed 2023-11-08 17:36:30 CET; 1h 58min ago
Docs: man:NetworkManager(8)
Main PID: 735 (NetworkManager)
Tasks: 3 (limit: 9190)
Memory: 15.3M
CPU: 410ms
CGroup: /system.slice/NetworkManager.service
└─735 /usr/sbin/NetworkManager --no-daemon
# systemctl is-enabled NetworkManager
disabled
# systemctl is-active NetworkManager
active

Como vemos, el NetworkManager sigue activo, pero ya no se cargará en el siguiente arranque del sistema.

Si ejecutamos el comando anterior con --now, el servicio se pararía (stop) después de deshabilitarlo:

# systemctl disable NetworkManager --now
Removed "/etc/systemd/system/multi-user.target.wants/NetworkManager.service".
Removed "/etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service".
Removed "/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service".
# systemctl status NetworkManager
○ NetworkManager.service - Network Manager
Loaded: loaded (/lib/systemd/system/NetworkManager.service; disabled; preset: enabled)
Active: inactive (dead) since Wed 2023-11-08 19:42:45 CET; 10s ago
Duration: 2h 6min 14.788s
Docs: man:NetworkManager(8)
Process: 735 ExecStart=/usr/sbin/NetworkManager --no-daemon (code=exited, status=0/SUCCESS)
Main PID: 735 (code=exited, status=0/SUCCESS)
CPU: 432ms
# systemctl is-enabled NetworkManager
disabled
# systemctl is-active NetworkManager
inactive

Como se puede ver en la salida del comando que habilita un servicio, durante dicho proceso, se crean una serie de enlaces simbólicos de ficheros relacionados con el servicio que se encuentran en el directorio /lib/systemd/system (realmente en /usr/lib/systemd/system pues /lib es un enlace simbólico a /usr/lib), y esto lo hace sobre el directorio y subdirectorios de /etc/systemd/system. Pues bien, si los enlaces simbólicos ya existieran, porque el servicio ya estuviera habilitado o se hubiese producido algún error, la acción enable no sobrescribiría los enlaces. Si queremos obligar a que se sobrescriban los enlaces simbólicos que intervienen en la habilitación de un servicio (unidad de forma más genérica), debemos usar la acción reenable, cuya sintaxis es equivalente a enable:

# systemctl reenable unidad...

O su equivalente:

# systemctl reenable unidad... --system

Otra posibilidad que existe es la de enmascarar una unidad, una acción que supera a disable, pues evitará cualquier tipo de activación de la unidad, incluida la habilitación y la activación manual y por dependencia. Esto se consigue creando los enlaces simbólicos de los ficheros de la unidad mencionados anteriormente sobre /dev/null. La acción que lleva a cabo todo esto es mask y tiene la siguiente sintaxis:

# systemctl mask unidad...
# systemctl mask NetworkManager
# systemctl status NetworkManager
● NetworkManager.service
Loaded: masked (Reason: Unit NetworkManager.service is masked.)
Active: active (running) since Thu 2023-11-09 07:14:19 CET; 3h 42min ago
Main PID: 718 (NetworkManager)
CPU: 11.384s
CGroup: /system.slice/NetworkManager.service
└─718 /usr/sbin/NetworkManager --no-daemon

Y con --now se desactivaría también el servicio en el momento de ejecutar el comando:

# systemctl mask unidad... --now

Para deshacer el enmascaramiento está la acción unmask:

# sysemctl unmask unidad...

Con lo visto, tenemos tres formas de dejar de usar un servicio, que aplicaremos según nos interese:

  1. Parar un servicio que está en funcionamiento (stop).
  2. Que el servicio no se ejecute en el siguiente arranque del sistema (disable).
  3. Que el servicio no se pueda usar de ninguna manera después de que se pare (mask).