我创建了一个德布安装服务的包。
在我们的嵌入式设备上,我希望这个包能够自动启用该服务。在我们的开发人员工作站上,我希望开发人员systemctl start foo
手动操作(这是一项繁重的服务,因此如果一直在桌面环境上运行,它只会消耗资源)。
我如何在该步骤中提示用户做出决定apt-get
?这是最好的解决方案吗?
请注意,我已使用dh_make
和创建了该包,debhelper
并通过以下方式启用了它:
%:
dh $@ --with=systemd
override_dh_systemd_enable:
dh_systemd_enable --name=foo foo.service
答案1
您可以使用系统预设影响 systemd 服务在安装时默认启用还是禁用。
Debian 预设默认在安装时启用所有服务,因此您只需将预设发送到开发工作站(默认行为与您希望在生产中发生的情况相匹配),方法是发送一个文件,例如/etc/systemd/system-preset/80-foo.preset
包含以下行的文件:说
disable foo.service
如果您使用 Puppet、Chef、Ansible 等系统管理开发人员工作站,则可以使用它们来提供此类 systemd 预设配置,这样您就可以轻松地将策略仅应用于开发人员工作站而不是生产环境机器。
您的 .deb 包应使用该systemctl preset
命令来启用该服务,因为该命令将遵循预设配置。
作为@JdeBP和@sourcejedi指出,deb-helpers 中的 Debian 宏(例如dh_systemd_enable
)已经这样做了,它们调用默认情况下deb-systemd-helper
将使用的宏systemctl preset
(有一个小警告,如果您删除(但不清除)软件包,然后重新安装它,即使您删除预设文件,它也不会启用该服务。)请参阅deb-systemd-helper
操作enable
中的这条评论:
# 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 功能的更多信息,请参阅手册页系统预设和命令的systemctl preset
它实现了它。
答案2
如果您想在安装过程中提示用户,你应该使用debconf
。即使您不在 Debian 政策相关的环境中,这也有很多优点:它提供一致的最终用户体验,支持各种前端;它支持不同的“级别”;它支持预播种。预播种意味着可以预先配置包,在这种情况下它根本不会提示。不同级别意味着可以将提示设置为仅在某些情况下显示;然后,您可以在默认情况下不提示安装软件包(对于您的嵌入式目标),并指示您的开发人员在安装软件包时适当设置其前端,以便他们看到提示。
但是,我认为最好尽可能避免完全提示。对于具有其他方式处理最终用户首选项的服务来说尤其如此,并且处理用户首选项使维护者脚本变得复杂(请参阅包中生成的脚本,它们已经处理了许多微妙的问题,使用deb-systemd-helper
- 您必须复制所有这些,并将您的偏好处理放在首位)。
如果您的开发人员永远不需要运行该服务,他们可以在安装包之前屏蔽它,并且该服务将永远不会启用:
sudo systemctl mask foo
如果您的开发人员有时需要使用 systemd 单元运行该服务,他们可以在第一次安装软件包后禁用它,后续安装将记住这一点:
sudo apt install foo
sudo systemctl disable --now foo
默认情况下将启用该服务。