come avviare un servizio systemd prima dell'inizio della rete?


11

Sto cercando di impostare un nuovo servizio (sotto Debian Jessie) che deve impostare alcuni montaggi in cui è memorizzata la configurazione di rete e quindi questo servizio deve essere completato prima dell'avvio di network.service.

Ho provato quanto segue:

[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
#Before=network-pre.target
Before=networking.service

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=networking.service

Utilizzando systemd-analyze plotposso vedere che il mio servizio inizia, ma networking.serviceinizia circa 3 secondi prima:

inserisci qui la descrizione dell'immagine

Apparentemente la mia configurazione è sbagliata, ma ho difficoltà a trovare il problema ... Qualsiasi aiuto è stato molto apprezzato ...

Aggiornare

Al momento l'ho risolto cambiando la configurazione del servizio per iniziare prima local-fs.targetinvece di networking.service:

[Unit]
DefaultDependencies=no
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
Before=local-fs.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=local-fs.target

Tuttavia, vorrei capire perché la mia prima configurazione non ha funzionato come previsto ...?


A causa del modo in cui systemd funziona, l'ordine temporale letterale in cui funzionano le cose potrebbe non essere significativo. Quando la rete si presenta, è correttamente conforme ai file in quella directory?
Tom Hunt,

Non sono sicuro di aver capito la tua domanda. Comunque, /etc/network/interfacesha riferimenti a ip-upscript che risiedono in un'altra partizione. Quella partizione è montata da uno script complesso /opt/intermodul-mounts/start.shche deve essere eseguito prima di configurare la rete. Attualmente, gli ip-upscript non si avviano effettivamente perché non sono accessibili al momento dell'avvio. L'esecuzione service networking restartsuccessiva mostra correttamente tutte le interfacce.
Udo G,

Risposte:


8

network-pre.target è una destinazione che può essere utilizzata per ordinare servizi prima di configurare qualsiasi interfaccia di rete. Il suo scopo principale è l'utilizzo con i servizi firewall che desiderano stabilire un firewall prima che qualsiasi interfaccia di rete sia attiva. È un'unità passiva: non è possibile avviarla direttamente e non viene inserita dal servizio di gestione della rete, ma dal servizio che desidera eseguirlo prima.

Si desidera utilizzare network-pre.targetse si desidera impostare qualcosa prima dell'avvio della rete

I servizi che devono essere eseguiti prima della configurazione della rete devono essere inseriti in Before = network-pre.target e impostare anche Wants = network-pre.target per richiamarlo.

Dovresti metterli nella [Unit]sezione:

Before=network-pre.target
Wants=network-pre.target

Riferimento


1
Ehi, @edwardtorvalds, stavo facendo esattamente questo per alcune impostazioni di configurazione della rete, ma l'unità sembra non funzionare mai. La risposta systemctl is-enabled <unit>è sempre static. Certo, non posso abilitarlo perché non c'è WantedBy=. Dopotutto, cosa vuole? Questo è qualcosa che esegue alcune impostazioni prima che la rete venga caricata.
Deitch

puoi provare desiderato con = remote-fs.target o mount-fs.target.
Edward Torvalds,

2
Grazie. Ho finito per fare Before=network-pre.targete Wants=network-pre.targete per quello che [Install]abbiamo fatto WantedBy=network.target. L'ultima sezione ha imposto che fosse richiesto dal networking, il primo lo ha messo in ordine. È stato un dolore, però
deitch il

dal momento che hai la testa intorno al sistema molto meglio di me, puoi guardare l'altro q che ho? unix.stackexchange.com/questions/277783/… Sto ancora cercando di capire come farlo.
Deitch

Sono confuso perché non ho esperienza con la partizione crittografata, se puoi semplicemente me per favore fallo
Edward Torvalds

3

Come fatto in Debian Jessie, il pacchetto netfilter-persistent (che consente di caricare le regole di iptables prima che la rete sia attiva ) ha un netfilter-persistent.service che assomiglia a:

# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
# based on the netfilter-persistent package
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no

Before=network-pre.target
Wants=network-pre.target

Wants=systemd-modules-load.service local-fs.target
After=systemd-modules-load.service local-fs.target

Conflicts=shutdown.target
Before=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/netfilter-persistent start
ExecStop=/usr/sbin/netfilter-persistent stop

[Install]
WantedBy=multi-user.target

Perché è in conflitto con il shutdown.target?!
Alexis Wilke,

1

L'errore è semplice e una delle cose principali che mescolo sempre: mescoli Beforee RequiredBy. Questo non va insieme. Gli altri hanno ragione sul bersaglio.


0
[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=basic.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=basic.target

Fare qualcosa del genere assicurerà che questa unità sia stata eseguita prima della rete, ma dopo che si è verificata la maggior parte delle altre importanti impostazioni.

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.