Tenemos un servidor (hipervisor) que aloja muchas máquinas virtuales controladas por libvirt. libvirt proporciona una red virtual para la comunicación entre las máquinas virtuales y el hipervisor. Esta red virtual se establece en tiempo de ejecución libvirtd.service
y se llama sys-devices-virtual-net-virbr1.device
.
Algunos servicios que se ejecutan en el hipervisor deben estar vinculados a esa red virtual, como IMAP, base de datos, etc.
El problema al que nos enfrentamos es que los servicios que se ejecutan en el hipervisor son iniciados por systemd antes de que se configure la red virtual y, por lo tanto, el inicio de los servicios falló. El orden de inicio actual se muestra en este gráfico:
gráfico de orden de inicio de systemd
Para casos como este existen directivas systemd, como
After=
Required=
Wants=
etcétera. Pero en mi caso no ayudan. Hasta donde tengo entendido, la razón de esto es que sys-devices-virtual-net-virbr1.device
se crea libvirtd.service
dinámicamente en tiempo de ejecución y systemd no lo sabe al iniciar el sistema. Por lo tanto, systemd no puede resolver la dependencia al inicio, ya que sys-devices-virtual-net-virbr1.device
se desconoce la interfaz de red.
¿Systemd proporciona técnicas para resolver estos problemas?
Se agradece cualquier pista. Gracias.
Respuesta1
Puede configurar una unidad de servicio como dependiente de una unidad de dispositivo incluso si esa unidad de dispositivo no está definida explícitamente en otra unidad (por ejemplo, proviene de udev).
[Unit]
BindsTo=sys-devices-virtual-net-virbr1.device
After=sys-devices-virtual-net-virbr1.device
Como puedes ver en man systemd.unit
Se une 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