我有一个 debian 软件包,其中包含systemd-networkd
例如我配置接口 IP 的配置。
systemd-networkd
这只有在运行时才有意义。
因此,我想确保该服务已启用并正在运行。但把它放在 postinst 中感觉不对:
systemctl enable systemd-networkd
systemctl start systemd-networkd
解决这个问题的正确方法是什么?
答案1
在您的包部署的服务中systemctl enable
使用通常没有问题。postinst
许多 Debian 软件包使用deb-systemd-helper
它来处理一些细节(例如尊重供应商预设和明确禁用或屏蔽的服务)。
systemd-networkd.service
是systemd
自行部署的。如果我们检查systemd.postinst
,我们已经看到systemd
用于systemctl
管理该单元。
$ dpkg -S /lib/systemd/system/systemd-networkd.service
systemd: /lib/systemd/system/systemd-networkd.service
$ grep systemd-networkd.service -C3 /var/lib/dpkg/info/systemd.postinst
if [ -n "$2" ]; then
_systemctl daemon-reexec || true
...
_systemctl try-restart systemd-networkd.service || true
_systemctl try-restart systemd-journald.service || true
fi
然而,启用另一个包拥有的服务是不常见的。 相反,请考虑使用单位关系。
如果您的软件包部署了自己的 systemd 单元(取决于此网络配置),那么只需将以下内容添加到您的[Unit]
部分即可:
[Unit]
Requires=systemd-networkd.service
After=systemd-networkd.service
这将确保您的设备启动时启动,如果启动失败systemd-networkd.service
,您的设备将不会启动。systemd-networkd.service
如果您的包中没有任何单元,请考虑简单地创建一个目标来为您执行此操作:
# /lib/systemd/system/mypackage.target
[Unit]
Description=MyPackage unit dependency management
Requires=systemd-networkd.service
After=systemd-networkd.service
[Install]
WantedBy=multi-user.target
然后在维护者脚本中管理它:
# postinst
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
deb-systemd-helper unmask 'mypackage.target' >/dev/null || true
if deb-systemd-helper --quiet was-enabled 'mypackage.target'; then
deb-systemd-helper enable 'mypackage.target' >/dev/null || true
else
deb-systemd-helper update-state 'mypackage.target' >/dev/null || true
fi
fi
# prerm
if [ "$1" = remove ] ; then
deb-systemd-invoke stop 'mypackage.target' >/dev/null || true
fi
# postrm
if [ "$1" = remove ] ; then
systemctl --system daemon-reload >/dev/null || true
fi
if [ "$1" = "purge" ]; then
deb-systemd-helper purge 'mypackage.target' >/dev/null || true
fi
如果您正在使用debian/rules
debhelper 来创建包,那么请考虑使用dh_installsystemd
这会自动将其添加到您的维护者脚本中的@DEBHELPER@
占位符中。