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.service
e 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.service
dinamicamente 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.device
interface 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