Em dependências de configuração de rede do systemd
É muito fácil afetar a ordem das unidades do systemd. Por outro lado, você precisa ter cuidado com o que uma unidade completa garante.
Configure seu serviço
Nos sistemas atuais,
ordenar após network.target
apenas garante que o serviço de rede foi iniciado, não que exista alguma configuração real. Você precisa pedir após network-online.target
e puxá-lo para conseguir isso.
[Unit]
Wants=network-online.target
After=network-online.target
Para compatibilidade com sistemas mais antigos, talvez seja necessário fazer o pedido após network.target também.
[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 como esperado (ou que, pelo menos, você possa usar network.target
).
A versão atual do NetworkManager oferece o NetworkManager-wait-online.service
que é puxado por network-online.target
e, portanto, pelo seu serviço. Esse serviço especial garante que seu serviço esperará até que todas as conexões configuradas para serem iniciadas sejam bem-sucedidas, falhem ou expirem automaticamente.
A versão atual do systemd-networkd bloqueia seu serviço até que todos os dispositivos sejam configurados conforme solicitado. É mais fácil porque atualmente suporta apenas configurações que são aplicadas no momento da inicialização (mais especificamente o tempo de inicialização de 'systemd-networkd.service).
Por questões de integridade, o serviço /etc/init.d/network
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 a sua implementação, com base no daemon ou script, se comportar como um dos serviços de gerenciamento de rede acima, isso atrasará o início do serviço até que a configuração da rede seja concluída com êxito, falhe por um bom motivo ou expirada após um prazo razoável para concluir.
Você pode querer verificar se o netctl funciona da mesma maneira e que a informação seria um acréscimo valioso para essa 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 é ordenado depois de network.target
.
Anteriormente, o NetworkManager garantiu 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 só recentemente foi aplicado a upstream.
systemctl enable NetworkManager-wait-online.service
Notas sobre as implementações network.target e network-online.target
Você nunca deve precisar fazer com que seu software dependa de NetworkManager.service
ou NetworkManager-wait-online.service
nem de outros serviços específicos. Em vez disso, todos os serviços de gerenciamento de rede devem se autogerir antes de network.target
e, opcionalmente, network-online.target
.
Um serviço de gerenciamento de rede simples baseado em script deve concluir a configuração de rede antes de sair e deve se autogerir antes de network.target
e, portanto, indiretamente antes de network-online.target
.
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Um serviço de gerenciamento de rede baseado no daemon também deve se ordenar antes de network.target
, mesmo que não seja muito útil.
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
Um serviço que espera que o daemon termine deve fazer o pedido após o serviço específico e antes de network-online.target
. Ele deve usar Requisite
no serviço daemon para que ele 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 para o serviço em espera no diretório wants
para network-online.target
, para que seja puxado pelos serviços que desejam esperar 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 só ter ajudado a responder sua pergunta no momento em que você a solicitou, mas também 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 escrevo o original.