web-dev-qa-db-fra.com

Définir le service systemd pour qu'il s'exécute après le montage fstab

Je travaille sur un systemd.service script censé démarrer après un emplacement réseau CIFS est monté via /etc/fstab à /mnt/ au démarrage.

Le script attend le lancement d'un script de dépendance OpenVPN en premier, mais je veux également qu'il attende la fin du montage.

/ etc/systemd/system/my-daemon.service:

[Unit]
Description=Launch My Daemon
After=network.target vpn-launch.service
Requires=vpn-launch.service

J'ai essayé d'ajouter systemd.mount à la ligne: After=network.target vpn-launch.service systemd.mount, mais cela n'a pas donné les résultats que j'espérais.

36
Winterflags

un emplacement réseau CIFS est monté via /etc/fstab à /mnt/ au démarrage.

Non, ça ne l'est pas. Faites les choses correctement et le reste se met en place naturellement.

Le montage est géré par une unité de montage (générée) systemd qui sera nommée quelque chose comme mnt-wibble.mount. Vous pouvez voir son nom réel dans la sortie de systemctl list-units --type=mount commande. Vous pouvez le regarder en détail comme n'importe quelle autre unité avec systemctl status.

Très simplement, alors: vous devez commander le démarrage de votre unité après le démarrage de cette unité de montage.

Après = network.target vpn-launch.service mnt-wibble.mount

Lectures complémentaires

51
JdeBP

Désolé mais je ne peux pas encore commenter.

Comme l'a dit JdeBP, vous devriez commander sur le support du système de fichiers. Vous pouvez prédire le nom de l'unité de montage ou, alternativement, vous pouvez utiliser (dans la section unité):

RequirementsMountsFor =/absolu/chemin/de/montage

Cette option crée les dépendances des unités * .mount appropriées pour rendre le chemin accessible avant de démarrer le service. Il n'est peut-être pas sur toutes les versions de systemd, mais je l'utilise dans une machine CentOS 7 depuis environ 6 mois.

17
miguelbernadi

Bien que les deux réponses soient correctes, je veux ajouter mes deux cents à la discussion, car lorsque je l'ai recherchée, il me manquait des instructions et des exemples de procédure.

  1. Ajoutez le système de fichiers à /etc/fstab
  2. Tapez mount -a qui monte tous les systèmes de fichiers mentionnés dans fstab
  3. Recherchez l'unité systemd qui a été générée avec:

    systemctl list-units | grep '/path/to/mount' | awk '{ print $1 }'

    (devrait renvoyer quelque chose qui se termine par .mount)
  4. Ajoutez l'unité de montage trouvée au After= instruction dans le *.service fichier

Voici un exemple de démarrage de my-daemon service au démarrage mais une fois le réseau prêt, un partage CIFS est monté sur /mnt/cifs, et le vpn-launch le service a démarré:

/etc/fstab

//servername/sharename /mnt/cifs cifs defaults,some,other,options 0 0

Remarque: vous souhaiterez peut-être ajouter nofail à vos options fstab (par exemple lorsque vous utilisez un lecteur externe). Sinon, votre machine ne démarrera pas si l'appareil n'est pas connecté. Voir article fstab d'ArchWiki


/etc/systemd/system/my-daemon.service

[Unit]
Description=Launch My Daemon
Requires=vpn-launch.service mnt-cifs.mount
After=network.target vpn-launch.service mnt-cifs.mount

[Service]
ExecStart=/path/to/my-daemon

[Install]
WantedBy=multi-user.target

N'oubliez pas d'activer le service pour qu'il démarre au démarrage: systemctl enable my-daemon

Notez que cela fonctionne également pour d'autres systèmes de fichiers (NFS, disques durs, etc.).

Comme déjà mentionné, les deux réponses sont correctes et j'encourage tout le monde à les lire, mais pour moi, quelques exemples m'auraient fait gagner du temps.

Mise à jour (2019-06-25):

  • ajout d'une note concernant les options de fstab pour empêcher le verrouillage du démarrage lors de l'utilisation de disques externes
  • ajoutée mnt-cifs.mount à la Requires= liste qui provoque le my-daemon.service échec au démarrage lorsque le montage cifs n'a pas été correctement monté
16
bm-bergmotte

@ bm-bergmotte: merci pour vos instructions qui m'ont beaucoup aidé. Pour moi ça marche, si je mets

After=network.target vpn-launch.service mnt-cifs.mount
Requires=vpn-launch.service mnt-cifs.mount

Si je ne mets pas "mnt-cifs.mount" à l'intérieur du "Requiert" (et dans cet ordre) cela fonctionne pour le redémarrage/démarrage, mais le service démarre quand même, si le périphérique n'est pas monté. Après l'avoir ajouté à l'intérieur "" Requiert ", le service monte l'appareil avant de le démarrer, si l'appareil n'a pas été monté.

1
tmade