Points de montage NFS absents au démarrage sous Fedora 27 avec NetworkManager


Le contexte

Un de mes postes de travail @ home tourne sous Fedora 27 et utilise de multiples points de montages définit dans mon fichier de configuration /etc/fstab tels que :
192.168.11.90:/volume1/backup /mnt/nas/backup nfs4 auto,hard,intr,async,noatime,rsize=8192,wsize=8192,_netdev 0 0

Depuis quelques temps, je me suis aperçu que mes points de montage était régulièrement indsponibles au démarrage.

Le problème

Systemd et NetworkManager n'ont pas bonne presse chez beaucoup de personne. Je ne cherche pas le troll ou une guerre enflammée, mais personnellement je les trouve plutôt bien conçus, surtout pour des machines postes de travail.
Dans mon cas, le problème est que l'unité systemd en charge des montage NFS étaient régulièrement lancées avant que ma connexion réseau soit pleinement disponible (comprenez que j'ai une adresse fournit par mon DHCP).

Le point de démarrage était alors impossible.

Le coupable : NetworkManager-wait-online

Une unité de service systemd est en charge de s'assurer que le réseau bien configuré pour déclaré la cible Network est bien atteinte.

Dans le cas de l'utilisation c'est l'unité NetworkManager-wait-online.service qui prend cela en charge. Voyons voire ce qu'elle à dans le ventre :

[Unit]
Description=Network Manager Wait Online
Documentation=man:nm-online(1)
Requires=NetworkManager.service
After=NetworkManager.service
Before=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/nm-online -s -q --timeout=30
RemainAfterExit=yes

[Install]
WantedBy=network-online.target

Tout est donc basé sur l'execution d'un binaire : nm-online. Voici ce que l'on obtient on lui demandant de l'aide :

# nm-online --help
Utilisation :
  nm-online [OPTION…]

Attend que NetworkManager finisse d'activer les connexion réseau de démarrage.

Options de laide :
  -h, --help                  Affiche les options de laide

Options de lapplication :
  -t, --timeout=<timeout>     Temps d'attente de connexion en secondes (sans l'option, la valeur par défaut est 30)
  -x, --exit                  Quitter immédiatement si NetworkManager n'exécute pas ou n'est pas en cours d'exécution
  -q, --quiet                 Ne rien imprimer
  -s, --wait-for-startup      Attend que NetworkManager démarre au  lieu d'une connexion

L'option "-s" parait un peu cryptique, et de fait en se renseignant un peu sur le web, j'apprends que ce qui se cache derrière est exactement la source de mon problème : Avec l'option -s, nm-online n'attend pas que les interfaces soit réellement configurée mais seulement que l'ensemble des unité systemd de toute nos interfaces soient bien lancé et qu'une connexion physique ait été detecté.

La solution

Il faut donc trouver le bon moyen de supprimer cette option. Cette unité étant fournit par ma distribution (fichier /usr/lib/systemd/system/NetworkManager-wait-online.service) et afin d'éviter les problème lors des mises à jour, je vais utiliser un répertoire "drop-in" pour surcharger mon unité de service.

Je créer donc un répertoir "drop-in" dans le repertoire de configuration systemd local et je met ma surcharge :

# mkdir /etc/systemd/system/NetworkManager-wait-online.service.d/
# cat > /etc/systemd/system/NetworkManager-wait-online.service.d/10-exec-start-without-s.conf <<EOF
[Service]
ExecStart=/usr/bin/nm-online -q --timeout=30
EOF

Et voilà, mon drop-in sera utilisé au prochain démarrage et nm-online attendra que mon réseau soit up avant de continuer.
_Note: Si l'on souhaite utiliser un drop-in sans redémarrer, il faut recharger le daemon systemd via # systemctl daemon-reload mais ça ne fait pas de sens de ce cas