通过Debian打包有条件地启用系统文件


8

我创建了一个安装服务的Deb包。

在我们的嵌入式设备上,我希望此软件包自动启用该服务。在我们的开发人员工作站上,我希望开发人员systemctl start foo手动进行操作(这是一项繁重的服务,因此,如果始终在桌面环境中运行,它只会消耗资源)。

如何在apt-get步骤中提示用户做出他们的决定?那是最好的解决方案吗?

注意,我已经使用dh_make和创建了包,debhelper并通过以下方式启用了该包:

%:
    dh $@ --with=systemd

override_dh_systemd_enable:
    dh_systemd_enable --name=foo foo.service

Answers:


11

您可以使用systemd预设来影响systemd服务在安装时默认是启用还是禁用。

Debian预设默认情况下会在安装所有服务时启用所有服务,因此您只需通过运送文件(例如/etc/systemd/system-preset/80-foo.preset包含以下内容的行)将预设发送到开发工作站(默认行为与您要在生产中发生的行为相匹配)。说

disable foo.service

如果您使用Puppet,Chef,Ansible等系统管理开发人员工作站,则可以使用它们来发送这样的系统预设配置,这将使您轻松地将策略仅应用于开发人员工作站而不是生产环境机器。

您的.deb软件包应使用该systemctl preset命令来启用服务,因为该命令将遵循预设配置。

正如@JdeBP@sourcejedi指出的那样,deb-helpers中的Debian宏(例如dh_systemd_enable)已经做到了,它们deb-systemd-helpersystemctl preset默认调用(使用一个小警告,即删除(但不清除)该软件包),并且稍后重新安装它,即使您删除了预设文件,它也不会启用该服务。)请参阅操作中的注释deb-systemd-helperenable

    # We use 'systemctl preset' on the initial installation only.
    # On upgrade, we manually add the missing symlinks only if the
    # service already has some links installed. Using 'systemctl
    # preset' allows administrators and downstreams to alter the
    # enable policy using systemd-native tools.

有关预设的systemd功能的更多信息,请参见systemd预设及其systemctl preset实现命令的手册页。


1
这正是我所需要的。我通过元软件包部署开发环境,因此我可以将这些*.preset文件安装为该软件包的一部分。
斯图尔特

4
要知道的一个重要怪癖是,仅deb-systemd-helper在首次安装软件包时才查询预设。之后,改为查询由Debian工具维护的并行数据库,直到清除软件包为止。 news.ycombinator.com/item?id=18320131
JdeBP

1
因此deb-systemd-helper似乎使用预设。这应该可以工作,而无需在.deb软件包中使用手动的systemctl预设命令。如果删除(但不清除)软件包,则会发生Debian特定的怪癖。如果以后重新安装该软件包,则即使删除了预设文件,它也不会启用该服务。salsa.debian.org/debian/init-system-helpers/blob/debian/1.56/...
sourcejedi

@sourcejedi将您的评论合并到答案中,并链接到deb-systemd-helper评论。谢谢!
filbranden

5

如果要在安装过程中提示用户,则应使用debconf。即使您不在与Debian Policy相关的环境中,它也具有许多优点:它提供一致的最终用户体验,并支持各种前端;它支持不同的“级别”;它支持预播。预先播种意味着可以对软件包进行预配置,在这种情况下,它根本不会提示。不同的级别意味着可以设置提示以仅在某些情况下显示;然后,您可以安装软件包而无需默认提示(针对嵌入式目标),并指示开发人员在安装软件包时适当地设置前端,以便他们看到提示。

但是,我认为最好尽可能避免完全提示。对于具有其他方式处理最终用户首选项的服务,以及在处理用户首选项使维护者脚本复杂化的服务中,这尤其如此(请参阅包中生成的脚本,它们已经处理了许多细微的问题,使用deb-systemd-helper-则必须复制所有内容,并在您的首选项处理之上)。

如果您的开发人员永远不需要运行该服务,则可以在安装该软件包之前将其屏蔽,并且永远不会启用该服务:

sudo systemctl mask foo

如果您的开发人员有时需要使用systemd单元运行该服务,则可以在首次安装该软件包后将其禁用,随后的安装将记住这一点:

sudo apt install foo
sudo systemctl disable --now foo

然后,默认设置为启用服务。


好答案。 debconf看起来像我的想法,但我同意最好避免在可能的情况下进行提示。我了解systemctl disable,但是我试图帮助用户避免在安装过程中“跳过步骤”。在*.presets通过Filippe建议的解决方法解决这个问题。
斯图尔特

确实,预设完全符合要求!
史蒂芬·基特
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.