我为我们的软件构建了一个自定义 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