Définir le service systemd à exécuter après le montage fstab

33

Je travaille sur un systemd .servicescript qui est censé démarrer après le montage d'un emplacement réseau CIFS via /etc/fstabau /mnt/démarrage.

Le script attend qu'un script de dépendance OpenVPN soit lancé en premier, mais je souhaite également l'attente de 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 quelque chose systemd.mount: After=network.target vpn-launch.service systemd.mountmais cela n'a pas donné les résultats escomptés.

Drapeaux d'hiver
la source
Cela fonctionne-t-il si vous ajoutez systemd-remount-fsà votre Afterliste?
Eric Renouf

Réponses:

40

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

Non ce n'est pas. Obtenez ce droit, et le reste tombe naturellement en place.

Le montage est géré par une unité de montage systemd (générée) qui porte le nom suivant mnt-wibble.mount. Vous pouvez voir son nom actuel dans le résultat de la systemctl list-units --type=mountcommande. 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

JdeBP
la source
10
Les montages de liste avec "systemctl list-units --type = mount"
nijave
Pour les adeptes, "wibble" est juste un nom factice, comme "foobar"
rogerdpack
17

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

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

RequiertMountsFor = / absolu / chemin / de / montage

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

miguelbernadi
la source
(Et vos différences avec vanilla systemd sont ici .) RequiresMountsFor=Vient avec ses propres mises en garde. Avec le bogue RedHat n ° 1088057 et Chris Siebenmann en main, vous devriez pouvoir répondre à superuser.com/questions/988734 . C'est également un montage CIFS dans cette question. Mais l'implication est que c'est auto, heureusement.
JdeBP
@JdeBP Merci pour le commentaire. Je n'étais pas au courant des mises en garde et des problèmes liés à cette fonctionnalité.
miguelbernadi
14

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

  1. Ajouter le système de fichiers à /etc/fstab
  2. Type mount -aqui monte tous les systèmes de fichiers mentionnés dans fstab
  3. Recherchez l'unité systemd 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. Ajouter l'unité de montage trouvée à l' After=instruction dans le *.servicefichier

Voici un exemple de démarrage du my-daemonservice au démarrage mais une fois le réseau prêt, un partage CIFS est monté sur /mnt/cifset le vpn-launchservice a démarré:

/ etc / fstab

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

Remarque: vous souhaiterez peut-être ajouter des nofailoptions à votre fstab (par exemple, lorsque vous utilisez un lecteur externe). Sinon, votre ordinateur ne démarrera pas si le périphérique n'est pas connecté. Voir l'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 soit démarré au démarrage: systemctl enable my-daemon

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

Comme on l'a déjà mentionné, les deux réponses sont correctes et j'encourage tout le monde à les lire, mais quelques exemples m'auraient permis de 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 lecteurs externes
  • ajouté mnt-cifs.mountà la Requires=liste qui provoque l' my-daemon.serviceéchec du démarrage lorsque le montage cifs n'a pas été monté correctement
bm-bergmotte
la source
Juste pour clarifier, "mnt-cifs.mount" est le nom de l'unité de montage pour votre point de montage spécifique systemctl list-units --type=mount?
smdvlpr
1

@ bm-bergmotte: merci pour votre instruction qui m'a beaucoup aidé. Pour moi, ça fonctionne, 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" dans "Nécessite" (et dans cet ordre), cela fonctionne pour le redémarrage / le 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 de "" Requis ", le service monte l'appareil avant de le démarrer, si l'appareil n'a pas été monté.

tmade
la source
Vous avez raison. Si le montage échoue, le service my-daemon.service est néanmoins démarré. After=dicte simplement l'ordre. Requires=rend obligatoire la présence de la monture cifs (voir la réponse de Sufiyan Ghori à ce sujet). Je mettrai à jour ma réponse.
bm-bergmotte le