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.
