systemd: 런타임에 동적으로 제공되는 네트워크 장치를 기다리는 방법은 무엇입니까?

systemd: 런타임에 동적으로 제공되는 네트워크 장치를 기다리는 방법은 무엇입니까?

libvirt에 의해 제어되는 많은 가상 머신을 호스팅하는 서버(하이퍼바이저)가 있습니다. libvirt는 가상 머신과 하이퍼바이저 간의 통신을 위한 가상 네트워크를 제공합니다. 이 가상 네트워크는 런타임 시 에 의해 설정되고 libvirtd.service호출됩니다 sys-devices-virtual-net-virbr1.device.

하이퍼바이저에서 실행되는 몇 가지 서비스는 IMAP, 데이터베이스 등과 같은 가상 네트워크에 바인딩되어야 합니다.

우리가 직면한 문제는 하이퍼바이저에서 실행되는 서비스가 가상 네트워크가 설정되기 전에 systemd에 의해 시작되어 서비스 시작이 실패한다는 것입니다. 현재 시작 순서는 다음 그래프에 표시됩니다.

systemd 시작 순서 그래프

이와 같은 경우에는 다음과 같은 systemd 지시문이 있습니다.

  • After=
  • Required=
  • Wants=

등등. 하지만 내 경우에는 도움이 되지 않습니다. 내가 이해하는 한, 런타임에 동적 sys-devices-virtual-net-virbr1.device으로 생성되고 libvirtd.service시스템 시작 시 시스템에 알려지지 않는 이유가 있습니다 . 따라서 sys-devices-virtual-net-virbr1.device네트워크 인터페이스를 알 수 없으므로 시작 시 systemd로 종속성을 해결할 수 없습니다.

systemd는 이러한 문제를 해결하는 기술을 제공합니까?

어떤 힌트라도 감사하겠습니다. 감사해요.

답변1

해당 장치 단위가 다른 장치에 명시적으로 정의되지 않은 경우에도(예: udev에서 제공됨) 서비스 단위를 장치 장치에 종속되도록 구성할 수 있습니다.

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

man systemd.unit에서 볼 수 있듯이

바인딩 대상=

 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

관련 정보