Назад | Перейти на главную страницу

Можно ли остановить dpkg-reconfigure перезапуском сервисов

Я создаю ключ установки для системы на основе 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 но оставлю это для других.