Impostare il servizio systemd per l'esecuzione dopo il montaggio di fstab


33

Sto lavorando su una systemd .servicesceneggiatura che dovrebbe iniziare dopo un percorso di rete CIFS è montato tramite /etc/fstabper /mnt/il boot-up.

Lo script attende che venga avviato per primo uno script di dipendenza OpenVPN, ma desidero anche attendere il completamento del montaggio.

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

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

Ho provato ad aggiungere systemd.mountalla linea:, After=network.target vpn-launch.service systemd.mountma non ha dato i risultati che speravo.


Funziona se aggiungi systemd-remount-fsalla tua Afterlista?
Eric Renouf,

Risposte:


40

un percorso di rete CIFS è montato tramite /etc/fstabdi /mnt/all'avvio.

No non lo è. Prendi questo, e il resto va a posto naturalmente.

Il montaggio è gestito da un'unità (generata) di montaggio del sistema che verrà chiamata in modo simile mnt-wibble.mount. Puoi vedere il suo vero nome nell'output del systemctl list-units --type=mountcomando. Puoi guardarlo in dettaglio come qualsiasi altra unità con systemctl status.

Molto semplicemente, quindi: è necessario ordinare l'avvio dell'unità dopo l'avvio dell'unità di montaggio.

After = network.target vpn-launch.service mnt-wibble.mount

Ulteriori letture


10
La lista viene montata con "systemctl list-units --type = mount"
nijave il

Per i follower, "wibble" è solo un nome fittizio, come "foobar"
rogerdpack

17

Scusa ma non posso ancora commentare.

Come ha detto JdeBP, dovresti ordinare sul mount del filesystem. È possibile prevedere il nome dell'unità di montaggio o, in alternativa, è possibile utilizzare (nella sezione unità):

RequiresMountsFor = / assoluto / percorso / di / mount

Questa opzione crea le dipendenze alle unità * .mount appropriate per rendere accessibile il percorso prima di avviare il servizio. Potrebbe non essere su tutte le versioni di systemd, ma lo sto usando in una macchina CentOS 7 da circa 6 mesi.


(E le tue differenze rispetto al sistema vaniglia sono qui .) RequiresMountsFor=Viene fornito con un proprio set di avvertimenti. Con RedHat bug # 1088057 e Chris Siebenmann in mano, dovresti essere in grado di rispondere a superuser.com/questions/988734 . È anche una montatura CIFS in questa domanda. Ma l'implicazione è che lo è auto, per fortuna.
JdeBP,

@JdeBP Grazie per il commento. Non ero a conoscenza degli avvertimenti e dei problemi relativi a quella funzione.
miguelbernadi,

14

Sebbene entrambe le risposte siano corrette, voglio aggiungere i miei due centesimi alla discussione, perché quando l'ho cercata mi mancavano alcune istruzioni ed esempi su come procedere.

  1. Aggiungi il filesystem a /etc/fstab
  2. Tipo mount -ache monta tutti i filesystem menzionati in fstab
  3. Cerca l'unità systemd che è stata generata con:

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

    (dovrebbe restituire qualcosa che termina con .mount)
  4. Aggiungi l'unità di montaggio trovata After=all'istruzione nel *.servicefile

Ecco un esempio di avvio del my-daemonservizio all'avvio ma dopo che la rete è pronta, viene montata una condivisione CIFS /mnt/cifse il vpn-launchservizio è stato avviato:

/ Etc / fstab

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

Nota: è possibile che si desideri aggiungere nofailalle opzioni fstab (ad es. Quando si utilizza un'unità esterna). In caso contrario, il computer non si avvierà se il dispositivo non è collegato. Vedi l'articolo fstab di 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

Non dimenticare di abilitare il servizio in modo che venga avviato all'avvio: systemctl enable my-daemon

Nota che questo funziona anche con altri filesystem (NFS, HDD, ecc.).

Come già accennato, entrambe le risposte sono corrette e incoraggio tutti a leggerle ma per me un paio di esempi mi avrebbero risparmiato un po 'di tempo.

Aggiornamento (25/06/2019):

  • aggiunta una nota relativa alle opzioni di fstab per impedire il blocco dell'avvio quando si utilizzano unità esterne
  • aggiunto mnt-cifs.mountalla Requires=lista che fa sì che il my-daemon.servicenon riuscire a start-up quando i CIFS mount non è stato montato con successo

Per essere chiari, "mnt-cifs.mount" è il nome dell'unità di mount per il tuo mount-point specifico da systemctl list-units --type=mount?
smdvlpr

1

@ bm-bergmotte: grazie per le tue istruzioni che mi hanno aiutato molto. Per me funziona, se lo metto

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

Se non inserisco "mnt-cifs.mount" all'interno di "Richiede" (e in questo ordine) funziona per il riavvio / avvio, ma il servizio si avvia comunque, se il dispositivo non è montato. Dopo averlo inserito ulteriormente in "" Richiede "il servizio monta il dispositivo prima di avviarlo, se il dispositivo non è stato montato.


Hai ragione. Se il montaggio non riesce, il my-daemon.service viene comunque avviato. After=detta solo l'ordine. Requires=rende obbligatorio che sia presente il mount cifs (vedi risposta Sufiyan Ghori su quello). Aggiornerò la mia risposta.
bm-bergmotte,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.