如何打包 systemd 服务?

如何打包 systemd 服务?

我正在尝试打包一个 Mono 应用程序以作为 systemd 服务运行。

我已遵循此处的说明: https://wiki.debian.org/Teams/pkg-systemd/Packaging

我已将 dh-systemd (>= 1.5) 添加到我的 debian 控制文件构建依赖项中。

我已将 --with=systemd 添加到我的规则文件中,如下所示:

%:
    dh $@ --with=cli --with=systemd

我已将我的服务文件添加到名为 mypackage.service 的 debian 文件夹中,其内容如下:

[Unit]
Description=My Service Description
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/mono /usr/lib/mypackage/myservice.exe

[Install]
WantedBy=multi-user.target

然而,构建时会出现以下 lintian 警告和错误:

Now running lintian...
E: mypackage: postrm-does-not-call-updaterc.d-for-init.d-script     etc/init.d/mypackage
W: mypackage: init.d-script-not-marked-as-conffile etc/init.d/mypackage
E: mypackage: init.d-script-not-included-in-package etc/init.d/mypackage

这让我很困惑,原因如下

  1. 这些警告是关于 init.d 的,它是被 systemd 替换的旧系统,这些错误和警告是错误的吗?debuild 是否会认为我正在使用 init.d,因为我错误地配置了我的包?
  2. 我印象中 --with=systemd 会为我创建这些脚本。

更新

生成的postrm文件如下:

#!/bin/sh
set -e
# Automatically added by dh_systemd_start
if [ -d /run/systemd/system ]; then
    systemctl --system daemon-reload >/dev/null || true
fi
# End automatically added section
# Automatically added by dh_systemd_enable
if [ "$1" = "remove" ]; then
    if [ -x "/usr/bin/deb-systemd-helper" ]; then
        deb-systemd-helper mask mypackage.service >/dev/null
    fi
fi

if [ "$1" = "purge" ]; then
     if [ -x "/usr/bin/deb-systemd-helper" ]; then
        deb-systemd-helper purge mypackage.service >/dev/null
        deb-systemd-helper unmask mypackage.service >/dev/null
    fi
fi
# End automatically added section

生成的prerm文件如下:

#!/bin/sh
set -e
# Automatically added by dh_systemd_start
if [ -d /run/systemd/system ]; then
    deb-systemd-invoke stop mypackage.service >/dev/null
fi
# End automatically added section
# Automatically added by dh_installinit
if [ -x "/etc/init.d/mypackage" ] || [ -e "/etc/init/mypackage.conf" ]; then
    invoke-rc.d mypackage stop || exit $?
fi
# End automatically added section

该软件包实际上安装得很好,服务也正常启动。lintian 错误令人担忧,我想弄清楚到底是什么原因。

答案1

我也遇到了这个问题。这是我得出的结论:

您将需要覆盖 dh_installinit 和 dh_systemd_start,这是我的网络桥接服务的一个示例:

#!/usr/bin/make -f

PKGDIR=debian/tmp

%:
    dh $@ --with systemd

override_dh_installinit:
    dh_systemd_enable -popenstack --name=openstack openstack.service
    dh_installinit -popenstack --no-start --noscripts
    dh_systemd_start -popenstack --no-restart-on-upgrade

override_dh_systemd_start:
    echo "Not running dh_systemd_start"

我的软件包的完整源代码可以在这里找到:https://github.com/Ubuntu-Solutions-Engineering/openstack-deb/tree/master/debian

我也用过https://github.com/lxc/lxd-pkg-ubuntu/blob/dpm-xenial/debian/rules作为参考。

希望这可以帮到你,因为我确实花了一点时间才弄清楚。

答案2

当不包括 SysV 或 Upstart 初始化脚本时,指示dh_installinit不要修改postinst//脚本。将处理它postrmprermdh_systemd

override_dh_installinit:
    dh_installinit --noscripts

这适用于debhelper兼容级别 < 10 和 10,即使dh_systemd已合并到debhelper

根据https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=800043 debhelper兼容级别 11 >= 这将修复此问题。

相关内容