如何从 debian 软件包启动 3rdparty systemd 服务

如何从 debian 软件包启动 3rdparty systemd 服务

我有一个 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.servicesystemd自行部署的。如果我们检查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/rulesdebhelper 来创建包,那么请考虑使用dh_installsystemd这会自动将其添加到您的维护者脚本中的@DEBHELPER@占位符中。

相关内容