Em dependências de configuração de rede systemd
É muito fácil afetar a ordem das unidades do systemd. Por outro lado, você precisa ter cuidado com o que uma unidade concluída garante.
Configure seu serviço
Nos sistemas atuais, o pedido network.target
apenas garante que o serviço de rede foi iniciado, não que exista alguma configuração real. Você precisa pedir depois network-online.target
e puxá-lo para conseguir isso.
[Unit]
Wants=network-online.target
After=network-online.target
Para compatibilidade com sistemas mais antigos, pode ser necessário solicitar também o network.target.
[Unit]
Wants=network-online.target
After=network.target network-online.target
Isso é para o arquivo de unidade do seu serviço e para o systemd.
Implementação nas versões atuais do software
Agora você precisa garantir que network-online.target
funcione conforme o esperado (ou que você pelo menos possa usar network.target
).
A versão atual do NetworkManager oferece o NetworkManager-wait-online.service
que é atraído network-online.target
e, portanto, pelo seu serviço. Esse serviço especial garante que o serviço espere até que todas as conexões configuradas para serem iniciadas tenham êxito, falhem ou atingem o tempo limite automaticamente.
A versão atual do systemd-networkd bloqueia seu serviço até que todos os dispositivos sejam configurados conforme solicitado. É mais fácil, pois atualmente ele suporta apenas configurações aplicadas no momento da inicialização (mais especificamente o tempo de inicialização do `systemd-networkd.service).
Por uma questão de integridade, o /etc/init.d/network
serviço no Fedora, conforme interpretado pelas versões atuais do systemd, bloqueia network.target
e, portanto, indiretamente, bloqueia network-online.target
e seu serviço. É um exemplo de implementação baseada em script.
Se sua implementação, seja baseada em daemon ou baseada em script, se comportar como um dos serviços de gerenciamento de rede acima, isso atrasará o início do seu serviço até que a configuração da rede seja concluída com êxito, falhe por um bom motivo ou tenha atingido o tempo limite após um tempo razoável quadro para concluir.
Você pode verificar se o netctl funciona da mesma maneira e se essas informações seriam uma adição valiosa a esta resposta.
Implementações em versões mais antigas do software
Eu não acho que você verá uma versão suficientemente antiga do systemd, onde isso não funcionaria bem. Mas você pode verificar se pelo menos network-online.target
existe e se é solicitado depois network.target
.
Anteriormente, o NetworkManager garantia apenas que pelo menos uma conexão fosse aplicada. E mesmo para que isso funcione, você teria que ativar o NetworkManager-wait-online.service
explicitamente. Isso foi corrigido por muito tempo no Fedora, mas foi aplicado recentemente apenas a montante.
systemctl enable NetworkManager-wait-online.service
Notas sobre implementações network.target e network-online.target
Você nunca precisa fazer com que seu software dependa de NetworkManager.service
ou de NetworkManager-wait-online.service
nenhum outro serviço específico. Em vez disso, todos os serviços de gerenciamento de rede devem solicitar antes network.target
e opcionalmente network-online.target
.
Um serviço de gerenciamento de rede baseado em script simples deve concluir a configuração da rede antes de sair e deve solicitar-se antes network.target
e, portanto, indiretamente antes network-online.target
.
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Um serviço de gerenciamento de rede baseado em daemon também deve ser solicitado antes, network.target
mesmo que não seja muito útil.
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
Um serviço que aguarda a conclusão do daemon deve solicitar a si próprio após o serviço específico e antes network-online.target
. Ele deve ser usado Requisite
no serviço daemon para que falhe imediatamente se o respectivo serviço de gerenciamento de rede não estiver sendo usado.
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
O pacote deve instalar um link simbólico no serviço em espera no wants
diretório para network-online.target
que seja puxado pelos serviços que desejam aguardar pela rede configurada.
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
Documentação relacionada
Notas finais
Espero não apenas ter ajudado a responder sua pergunta no momento em que você a fez, mas também ter contribuído para melhorar a situação nas distribuições upstream e Linux, para que agora eu possa dar uma resposta melhor do que era possível no momento em que escrevi a original. .