Systemd: bloquear (o enmascarar) un servicio (unit)

Comparado con el arranque legacy al que todos estábamos acostumbrados, systemd cuenta con funcionalidades interesantes y necesarias debido a su arquitectura y funcionamiento. Una de ellas es el masking de units, o enmascaramiento/bloqueo de servicios.

En systemd, si deshabilitamos un servicio (unit), no significa que ese servicio no vaya a iniciarse. Si forma parte de las dependencias de otro servicio que sí está habilitado, systemd automáticamente lo iniciará cuando corresponda por dependencias, independientemente de que esté deshabilitado o no.

# systemctl disable sshd.service

Nosotros, bajo nuestra propia responsabilidad, y sobre todo, sabiendo que el servicio no es dependencia de otros que sí están activos, tenemos la opción de bloquear ese servicio (mask) para que no se pueda iniciar, incluso aunque forme parte de las dependencias de otro servicio (units).

Las dependencias de un servicio se pueden visualizar con el siguiente comando:

$ systemctl list-dependencies sshd.service
├─system.slice
└─basic.target
  ├─microcode.service
  ├─rhel-autorelabel-mark.service
  ├─rhel-autorelabel.service
[...]

Para enmascarar un servicio:

# systemctl mask sshd.service
# systemctl list-unit-files
kmod-static-nodes.service              static  
ldconfig.service                       static  
mandb.service                          static  
sshd.service                          masked
rc-local.service                       static  
[...]

Si lo quisieramos arrancar tras este cambio:

# systemctl start sshd.service
Failed to start sshd.service: Unit sshd.service is masked.

Para desenmascarar el servicio:

# systemctl unmask sshd.service