systemd: Como esperar por um dispositivo de rede fornecido dinamicamente em tempo de execução?

systemd: Como esperar por um dispositivo de rede fornecido dinamicamente em tempo de execução?

Temos um servidor (hipervisor) que hospeda diversas máquinas virtuais controladas pela libvirt. libvirt fornece uma rede virtual para comunicação entre as máquinas virtuais e o hipervisor. Esta rede virtual é estabelecida em tempo de execução libvirtd.servicee chamada sys-devices-virtual-net-virbr1.device.

Alguns serviços executados no hipervisor devem estar vinculados a essa rede virtual, como IMAP, banco de dados e assim por diante.

O problema que enfrentamos é que os serviços, executados no hipervisor, são iniciados pelo systemd antes da configuração da rede virtual e, portanto, a inicialização dos serviços falhou. A ordem de inicialização atual é mostrada neste gráfico:

gráfico de ordem de inicialização do systemd

Para casos como este existem diretivas systemd, como

  • After=
  • Required=
  • Wants=

e assim por diante. Mas eles não ajudam no meu caso. Pelo que entendi, a razão para isso é que o sys-devices-virtual-net-virbr1.deviceé criado libvirtd.servicedinamicamente em tempo de execução e não é conhecido pelo systemd na inicialização do sistema. Portanto, a dependência não pode ser resolvida na inicialização pelo systemd, pois a sys-devices-virtual-net-virbr1.deviceinterface de rede não é conhecida.

O systemd fornece técnicas para resolver esses problemas?

Qualquer dica é apreciada. Obrigado.

Responder1

Você pode configurar uma unidade de serviço como dependente de uma unidade de dispositivo mesmo que essa unidade de dispositivo não esteja explicitamente definida em outra unidade (por exemplo, ela vem do udev).

[Unit]
BindsTo=sys-devices-virtual-net-virbr1.device
After=sys-devices-virtual-net-virbr1.device

Como você pode ver em man systemd.unit

Vincula-se a =

 Configures requirement dependencies, very similar in style to
 Requires=. However, this dependency type is stronger: in addition 
 to the effect of Requires= it declares that if the unit bound to 
 is stopped, this unit will be stopped too. 
 When used in conjunction with After= on the same unit the 
 behaviour of BindsTo= is even stronger. In this case, the unit
 bound to strictly has to be in active state for this unit to also 
 be in active state

informação relacionada