SystemD mount relancer un unit failed avec un Timer

Voir : https://github.com/SSSD/sssd/issues/5074

At boot SystemD type “mount” failed for CIFS when uid is ldap account, because sssd not ready (be started)

Erreur

bad option uid="jean"

Problème avec mount.cifs avec l'option uid= quand le uid n'est pas un uid mais un username.Le username est sur LDAP et le service sssd n'est pas prêt.

Nous faisons un montage réseau CIFS avec pour options : uid=jean. Hors jean est un compte LDAP. Il est préférable d'utiliser les UID, mais dans mon cas j'ai une contrainte d'entreprise.

Le problème se produit au boot. L'Unit SystemD mnt-plop.mount est bien lancée, mais presque en même temps que sssd.service et le LDAP n'est pas encore fonctionnel.

Et donc le montage réseau échoue.

# journalctl -u mnt-plop.mount -u sssd -b
-- Logs begin at Sat 2023-02-18 14:07:02 CET, end at Wed 2023-03-08 19:46:26 CET. --
Mar 08 19:45:55 srv01 systemd[1]: Starting System Security Services Daemon...
Mar 08 19:45:55 srv01 sssd[1367]: Starting up
Mar 08 19:45:55 srv01 sssd_be[1439]: Starting up
Mar 08 19:45:56 srv01 sssd_sudo[1501]: Starting up
Mar 08 19:45:56 srv01 sssd_nss[1499]: Starting up
Mar 08 19:45:56 srv01 sssd_pam[1500]: Starting up
Mar 08 19:45:56 srv01 systemd[1]: Started System Security Services Daemon.
Mar 08 19:45:56 srv01 systemd[1]: Mounting Partage...
Mar 08 19:45:56 srv01 mount[1606]: bad option uid="jean"
Mar 08 19:45:56 srv01 systemd[1]: mnt-plop.mount: Mount process exited, code=exited status=1
Mar 08 19:45:56 srv01 systemd[1]: mnt-plop.mount: Failed with result 'exit-code'.
Mar 08 19:45:56 srv01 systemd[1]: Failed to mount Partage.
Mar 08 19:45:57 srv01 sssd_be[1439]: Backend is online

Pour les montages NAS je préconise de faire systématiquement un Unit automount, mais autre contrainte d'entreprise, je dois trouver une solution sans automount.

/etc/systemd/system/mnt-plop.mount

[Unit] Description=Partage [Mount] What=//127.0.0.1/shared Type=cifs Options=noexec,nosuid,nodev,rw,port=445,uid=jean,gid=jean,file_mode=0644,dir_mode=0755,noperm,credentials=/root/.cifs_plop Where=/mnt/plop ForceUnmount=yes DirectoryMode=755 [Install] WantedBy=remote-fs.target
systemctl stop sssd sss_cache -E rm /var/lib/sss/db/* -f reboot

# systemctl status /mnt/plop
● mnt-plop.mount - Partage
Loaded: loaded (/etc/systemd/system/mnt-plop.mount; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2023-03-08 19:54:45 CET; 36s ago
Where: /mnt/plop
What: //127.0.0.1/shared
Mar 08 19:54:45 srv01 systemd[1]: Mounting Partage...
Mar 08 19:54:45 srv01 mount[1574]: bad option uid="jean"
Mar 08 19:54:45 srv01 systemd[1]: mnt-plop.mount: Mount process exited, code=exited status=1
Mar 08 19:54:45 srv01 systemd[1]: mnt-plop.mount: Failed with result 'exit-code'.
Mar 08 19:54:45 srv01 systemd[1]: Failed to mount Partage.

Solution

/etc/systemd/system/mnt-plop.timer

[Unit] Description=Partage Requires=sssd.service After=sssd.service Conflicts=mnt-plop.mount [Timer] OnBootSec=15 Unit=mnt-plop.mount RemainAfterElapse=False [Install] WantedBy=timers.target
systemctl daemon-reload systemctl enable mnt-plop.timer

Avec un Timer ça fonctionne bien, mais à la condition que le Unit mnt-plop.mount soit disable. En effet si il est enable, il échoue, et le Timer SystemD n'essaie même pas de le relancer.

L'astuce consiste à l'arrêter avant !

C'est grâce à l'option :

[Unit] Conflicts=mnt-plop.mount

En contournement nous avons le choix parmi les possibilités suivantes :

Utiliser des UID/GID numériques à la place des usernames/groupnames

Créer un Unit de type automount

Activer le cache sssd

Utiliser un Unit SystemD de type Service ou de type Timer comme illustré dans cet exemple.

NB : il existe aussi l'option sss_master_map_wait pour le paquet autofs, mais ça n'a pas d'interêt puisque ça fonctionne très bien avec un automount SystemD classique sans paramètre particulier.