从 Debian 软件包安装启用 systemd.service 的首选/惯用方法

Tra*_*ggs 7 linux debian systemd

我有一个自定义的 Debian 软件包,我为我们的软件构建了一个创建 systemd 服务的软件包。在安装时启用/启动服务的首选/惯用方法是什么?

我所做的是将以下三行添加到我的postinst脚本中:

systemctl --system daemon-reload
systemctl enable my_service.service
systemctl start my_service.service
Run Code Online (Sandbox Code Playgroud)

这工作得很好,直到我们尝试在我们最初运行的图像创建中包含加载这个包,debootstrap在这一点上,结果systemctl似乎需要设置很多通常不会在该过程中设置的环境内容。

Tho*_*ols 1

我正在考虑类似的情况,我想在 debootstrap rootfs 中配置服务。它似乎只是读取单元文件部分systemctl enable中的目标并创建正确的符号链接。[Install]因此,如果您知道要在哪些目标下启动哪些服务,我认为正确的答案可能是创建正确的符号链接。例如

ln -s /etc/systemd/system/multi-user.target.wants/ssh.service \
      /lib/systemd/system/ssh.service
Run Code Online (Sandbox Code Playgroud)

当安装到 debootstrap chroot 中时,您不想执行另外两个步骤(daemon-reload和),但我猜您的问题是如何在 debootstrap env 中执行符号链接,否则以正常方式执行......start

编辑debootstrap

碰巧我也在使用debootstrap,并且我发现systemctl enable只要调用用户root(以避免 Failed to connect to bus警告), 调用就可以正常工作daemon-reload,并且start在 chroot 下安装期间可能没有意义,因为您不在现场环境。所以你postinst可能想要检测 chroot 并跳过这些行。或者设置一个环境变量或传递一些安装程序脚本可以读取的标志。

IM_DEBOOTSTRAPPING=yes dpkg -i mypackage.deb  # tells postinst to skip systemctl start
Run Code Online (Sandbox Code Playgroud)