Я создаю ключ установки для системы на основе Debian. Ключ установки в основном копирует образ диска в систему, а затем в chroot устанавливает ряд пакетов, которые копируются на ключ установки во время процесса сборки.
Одна из вещей, которую делает ключ установки, - это стирание существующих ключей ssh (чтобы мы не создавали кучу «идентичных» серверов ssh). Чтобы попытаться придерживаться метода debian, я запускаю dpkg-reconfigure openssh-server для восстановления ключей, но в конце перенастройки он пытается перезапустить сервер, который, конечно, не работает в chroot установочного ключа.
Можно ли указать debconf перенастроить, но не перезапускать службы?
От чего этот документ говорит, вы должны создать /usr/sbin/policy-rc.d
скрипт в chroot, который делает exit 101
.
Стоит отметить: служба не будет запущена с помощью invoke-rc.d, если вы не находитесь на уровне выполнения, на котором эта служба не должна работать. Итак, одна из идей может заключаться в том, чтобы убедить chroot, что он находится в однопользовательском режиме.
То, что вы спрашиваете, не является напрямую функцией debconf или dpkg-reconfigure. Если вы загрузите .deb для openssh-server и извлечете файлы из 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
}
Я использую следующий сценарий, который я вставил /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
но оставлю это для других.