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创建,而 systemd 在系统启动时不知道。因此,由于网络接口未知libvirtd.service,systemd 无法在启动时解决依赖关系。sys-devices-virtual-net-virbr1.device

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

相关内容