systemd: ¿Cómo esperar a que un dispositivo de red se proporcione dinámicamente en tiempo de ejecución?

systemd: ¿Cómo esperar a que un dispositivo de red se proporcione dinámicamente en tiempo de ejecución?

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.servicey 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.devicese crea libvirtd.servicediná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.devicese 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

información relacionada