我正在为基于 Debian 的系统构建安装密钥。安装密钥基本上将磁盘映像复制到系统上,然后在 chroot 中安装一些在构建过程中复制到安装密钥上的软件包。
安装密钥所做的一件事是擦除现有的 ssh 密钥(这样我们就不会创建一堆“相同”的 ssh 服务器)。为了尝试坚持使用 debian 的做事方式,我运行 dpkg-reconfigure openssh-server 来重新生成密钥,但在重新配置结束时,它会尝试重新启动服务器,而该服务器当然不会在安装密钥 chroot 中运行。
是否可以告诉 debconf 重新配置但不重新启动服务?
答案1
您所问的不是 debconf 或 dpkg-reconfigure 的直接功能。如果您下载 openssh-server 的 .deb 并从 control.tar.gz 中提取文件,您将看到“postinst”脚本执行了invoke-rc.d 或 /etc/init.d/ssh:
第 418 行:
setup_init() {
if [ -x /etc/init.d/ssh ]; then
update-rc.d ssh start 16 2 3 4 5 . stop 84 1 . >/dev/null
if [ -x /usr/sbin/invoke-rc.d ]; then
invoke-rc.d ssh restart
else
/etc/init.d/ssh restart
fi
fi
}
答案2
从何而来这个文件说,你应该/usr/sbin/policy-rc.d
在 chroot 中创建一个执行的脚本exit 101
。
答案3
值得注意的是:如果您未处于不应运行该服务的运行级别,则服务将不会由invoke-rc.d启动。因此,一个想法可能是让chroot确信它处于单用户模式。
答案4
我正在使用以下脚本/usr/sbin/policy-rc.d
#!/bin/sh
SERVICE_NAME="$(ps -o command= --ppid $PPID | cut -d ' ' -f 3 )"
for service in service1 service2 service3
do
if [ $SERVICE_NAME = $service ]
then
exit 101 # Prevent service from running
fi
done
exit 0 # allow service
ps -o command= --ppid $PPID
应该返回完整的调用命令,例如/bin/sh /usr/sbin/invoke-rc.d service1 start
cut -d ' ' -f 3
cut 将分割并选择第三项,因此这里是“service1”。
该脚本将避免运行invoke-rc.d
和service1
,service2
但service3
将保留其他的。