Dipendenze dalla configurazione di rete del sistema
È molto facile influenzare l'ordinamento delle unità di systemd. D'altra parte è necessario fare attenzione a ciò che garantisce un'unità completata.
Configura il tuo servizio
Sui sistemi attuali, ordinare dopo network.target
garantisce solo che il servizio di rete è stato avviato, non che ci sia una configurazione effettiva. È necessario ordinare dopo network-online.target
ed estrarlo per raggiungere questo obiettivo.
[Unit]
Wants=network-online.target
After=network-online.target
Per compatibilità con i sistemi più vecchi, potrebbe essere necessario ordinare anche dopo network.target.
[Unit]
Wants=network-online.target
After=network.target network-online.target
Questo è per il file unitario del tuo servizio e per systemd.
Implementazione nelle versioni attuali del software
Ora devi assicurarti che network-online.target
funzioni come previsto (o che almeno puoi usare network.target
).
La versione attuale di NetworkManager offre ciò NetworkManager-wait-online.service
che viene richiamato da network-online.target
e quindi dal tuo servizio. Questo servizio speciale garantisce che il servizio attenderà fino a quando tutte le connessioni configurate per l'avvio avranno esito positivo, non riusciranno o scadranno.
La versione corrente di systemd-networkd blocca il servizio fino a quando tutti i dispositivi sono configurati come richiesto. È più semplice in quanto attualmente supporta solo le configurazioni che vengono applicate al momento dell'avvio (in particolare il tempo di avvio di `systemd-networkd.service).
Per completezza, il /etc/init.d/network
servizio in Fedora, come interpretato dalle attuali versioni di systemd, blocca network.target
e quindi blocca indirettamente network-online.target
e il vostro servizio. È un esempio di implementazione basata su script.
Se l'implementazione, sia basata su demone o basata su script, si comporta come uno dei servizi di gestione della rete di cui sopra, ritarderà l'avvio del servizio fino a quando la configurazione della rete non viene completata correttamente, non è riuscita per una buona ragione o è scaduta dopo un tempo ragionevole cornice da completare.
Potresti voler controllare se netctl funziona allo stesso modo e che le informazioni sarebbero una preziosa aggiunta a questa risposta.
Implementazioni nelle versioni precedenti del software
Non credo che vedrai una versione sufficientemente vecchia di systemd in cui questo non funzionerebbe bene. Ma puoi controllare che almeno network-online.target
esista e che venga ordinato dopo network.target
.
In precedenza NetworkManager garantiva solo l'applicazione di almeno una connessione. E anche perché funzioni, dovresti abilitare NetworkManager-wait-online.service
esplicitamente. Questo è stato a lungo risolto in Fedora ma è stato applicato solo di recente a monte.
systemctl enable NetworkManager-wait-online.service
Note sulle implementazioni di network.target e network-online.target
Non dovresti mai aver bisogno di far dipendere il tuo software NetworkManager.service
o di NetworkManager-wait-online.service
altri servizi specifici. Invece, tutti i servizi di gestione della rete dovrebbero ordinare se stessi prima network.target
e opzionalmente network-online.target
.
Un semplice servizio di gestione della rete basato su script dovrebbe completare la configurazione della rete prima di uscire e dovrebbe ordinarsi prima network.target
e quindi indirettamente prima network-online.target
.
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Un servizio di gestione della rete basato su demoni dovrebbe anche ordinarsi prima, network.target
anche se non è molto utile.
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
Un servizio che attende il completamento del demone dovrebbe ordinarsi dopo il servizio specifico e prima network-online.target
. Dovrebbe essere utilizzato Requisite
sul servizio daemon in modo che fallisca immediatamente se non viene utilizzato il rispettivo servizio di gestione della rete.
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Il pacchetto dovrebbe installare un collegamento simbolico al servizio di attesa nella wants
directory in network-online.target
modo che venga richiamato dai servizi che desiderano attendere la rete configurata.
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
Documentazione correlata
Note finali
Spero non solo di aver contribuito a rispondere alla tua domanda al momento in cui l'hai fatta, ma anche di aver contribuito a migliorare la situazione nelle distribuzioni upstream e Linux, in modo che ora posso dare una risposta migliore di quanto fosse possibile al momento della stesura di quella originale .