como iniciar um serviço systemd antes do início da rede?

11

Estou tentando configurar um novo serviço (no Debian Jessie) que precisa instalar algumas montagens nas quais a configuração de rede é armazenada e, portanto, esse serviço deve ser concluído antes do início do networking.service.

Eu tentei o seguinte:

[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

Usando systemd-analyze plotposso ver que meu serviço é iniciado, mas é networking.serviceiniciado cerca de 3 segundos antes:

insira a descrição da imagem aqui

Aparentemente, minha configuração está errada, mas estou tendo dificuldade em encontrar o problema ... Qualquer ajuda muito apreciada ..

Atualizar

No momento, eu o resolvi alterando a configuração do serviço para iniciar antes, em local-fs.targetvez de 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

Ainda assim, gostaria de entender por que minha primeira configuração não funcionou conforme o esperado ...?

Udo G
fonte
Devido à maneira como systemd funciona, a ordem temporal literal na qual as coisas são executadas pode não ser significativa. Quando a rede é criada, ela está de acordo com os arquivos desse diretório?
Tom Hunt
Não sei se entendi sua pergunta. Enfim, /etc/network/interfacestem referências a ip-upscripts que residem em outra partição. Essa partição é montada por um script complexo /opt/intermodul-mounts/start.shque deve ser executado antes da instalação da rede. Atualmente, os ip-upscripts não iniciam efetivamente porque não estão acessíveis no momento da inicialização. A execução service networking restartposterior traz todas as interfaces corretamente.
UD G #
Possível duplicado: superuser.com/questions/1005742/…
Josip Rodin

Respostas:

8

network-pre.target é um destino que pode ser usado para solicitar serviços antes que qualquer interface de rede seja configurada. Seu principal objetivo é o uso com serviços de firewall que desejam estabelecer um firewall antes que qualquer interface de rede seja instalada. É uma unidade passiva: você não pode iniciá-lo diretamente e não é puxado pelo serviço de gerenciamento de rede, mas pelo serviço que deseja executar antes dele.

Você deseja usar network-pre.targetse desejar configurar algo antes do início da rede

Os serviços que desejam ser executados antes da configuração da rede devem colocar Before = network-pre.target e também definir Wants = network-pre.target para acessá-lo.

Você deve colocá-los na [Unit]seção:

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

Referência

Edward Torvalds
fonte
1
Hey @edwardtorvalds, eu estava fazendo exatamente isso para algumas configurações de rede, mas a unidade parece nunca funcionar. A resposta systemctl is-enabled <unit>é sempre static. Claro, não posso habilitá-lo porque não existe WantedBy=. Afinal, o que é procurado? Isso é algo que faz algumas configurações antes que a rede seja carregada.
Deitch
você pode tentar desejado por = remote-fs.target ou mount-fs.target.
Edward Torvalds
2
Obrigado. Acabei fazendo Before=network-pre.targete Wants=network-pre.targete para o [Install]que fizemos WantedBy=network.target. A última seção obrigou a ser exigida pela rede, a primeira colocou em ordem. Mas foi uma dor
deitch 20/04
desde que você definitivamente tem a cabeça no sistema muito melhor do que eu, você pode olhar para o outro q eu tenho? unix.stackexchange.com/questions/277783/… Ainda tentando descobrir como fazê-lo.
Deitch
Estou confuso porque eu não tenho experiência com partição criptografada, se você pode simplesmente me faça isso
Edward Torvalds
3

Como feito no Debian Jessie, o pacote netfilter-persistent (que permite carregar as regras do iptables antes da instalação da rede) tem um netfilter-persistent.service que se parece com:

# 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
user2024640
fonte
Por que está em conflito com o shutdown.target?!
Alexis Wilke
1

O erro é simples e uma das principais coisas que sempre misturo: você mistura Beforee RequiredBy. Isso não vai junto. Os outros estão corretos sobre o alvo.

Bane
fonte
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

Fazer algo nesse sentido garantirá que esta unidade funcione antes da rede, mas após a maioria das outras configurações importantes.

spkane
fonte