如何打包系统服务?


12

我正在尝试打包一个单声道应用程序以作为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

但是,生成给出以下林田警告和错误:

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错误令人担忧,我想深入探究它们。


您的postrm脚本包含什么?它有debhelper样板吗?
muru

它在哪里?它是什么?说明没有说要创建一个,而链接的示例没有一个。因此,它要么是由dh-systemd自动生成的,要么不存在
流浪汉

2
参见debian.org/doc/debian-policy/ch-maintainerscripts.htmlwiki.debian.org/MaintainerScripts。如果您不知道这些是什么,请使用debhelper(akadh)应该会生成适当的代码。运行dpkg-deb --control所产生的deb文件,并查看新创建DEBIAN的目录postinstpostrm文件。
muru

OK将按照以下说明进行操作:“重建后,您的软件包将在postinst,prerm和postrm维护者脚本中包含其他代码。” 鉴于这些都是自动生成的,所以我几乎没有机会将它们塞满。
蹦床

最新的问题与postrm和prerm生成的脚本
蹦床

Answers:


5

我也遇到了这个问题。这是我想出的:

您将要覆盖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作为参考。

希望这能使您如愿以偿,因为我花了一些时间才弄清楚这一点。


4

如果不包括SysV或Upstart初始化脚本,请指示dh_installinit不要修改postinst/postrm / prerm脚本。dh_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> =,此问题已得到修复。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.