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

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

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

我所做的是在脚本中添加以下三行postinst

systemctl --system daemon-reload
systemctl enable my_service.service
systemctl start my_service.service

这一切都进行得很顺利,直到我们尝试在初始图像创建过程中加载这个包,debootstrap这时才发现systemctl似乎需要设置很多环境内容,而这些内容通常不会在该过程中出现。

答案1

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

ln -s /etc/systemd/system/multi-user.target.wants/ssh.service \
      /lib/systemd/system/ssh.service

在安装到 debootstrap chroot 中时,您不想执行另外两个步骤(daemon-reload和),但我猜您的问题是在 debootstrap 环境中时如何执行符号链接,否则以正常方式执行......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

相关内容