我们有一台服务器(虚拟机管理程序)托管许多由 libvirt 控制的虚拟机。libvirt 为虚拟机和虚拟机管理程序之间的通信提供了一个虚拟网络。此虚拟网络在运行时由 建立,libvirtd.service
并称为sys-devices-virtual-net-virbr1.device
。
虚拟机管理程序上运行的少数服务应绑定到该虚拟网络,例如 IMAP、数据库等。
我们面临的问题是,在虚拟机管理程序上运行的服务是在虚拟网络设置之前由 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