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

Как я могу установить пакеты, не запуская связанные с ними службы?

Как вы, вероятно, знаете, по умолчанию при установке пакета в системе на основе Debian или Ubuntu, если пакет содержит службу, эта служба обычно включается и запускается автоматически при установке пакета.

Для меня это проблема.

Я обнаружил, что мне нужно управлять шаблонами для создания контейнеров LXC. Существует несколько контейнеров, каждый из которых соответствует выпуску Debian или Ubuntu. (Существуют также контейнеры на основе Red Hat, но они здесь не актуальны.)

/var/lib/libvirt/filesystems/debian6_template
/var/lib/libvirt/filesystems/debian7_template
/var/lib/libvirt/filesystems/ubuntu1004_template
/var/lib/libvirt/filesystems/ubuntu1204_template

Иногда я обнаруживаю, что в шаблонах отсутствует пакет или требуются другие изменения, поэтому я подключаюсь к ним, чтобы установить пакет. К сожалению, когда я это делаю, у меня запускается несколько копий службы пакета!

В качестве примера я обнаружил, что в шаблонах нет демона системного журнала, поэтому я его установил:

for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
    chroot $template apt-get install rsyslog
done

И сразу же запустил четыре копии rsyslog. Не говоря уже о двух копиях exim4. Ой!


Я где-то читал (хотя сейчас не могу найти его снова), что он не должен запускать службы при работе в chroot, но здесь этого явно не происходит.

Один потенциально жизнеспособный противный взлом призывает к временной замене различных команд, которые фактически запускают службы, такие как start-stop-daemon и initctl, хотя это намного больше, чем я действительно хотел. Но если у меня нет другого выбора ...

Идеальным решением здесь было бы, чтобы системы на основе Debian перестали делать эту чушь, но в противном случае, возможно, неясный или недокументированный параметр командной строки для apt-get?

На случай, если это непонятно, я действительно хочу оставить все, что связано с управлением шаблонами вне шаблоны, если возможно.

Для Debian это можно сделать с помощью policy-rc.d. Вот одно объяснение:

Предполагается, что сценарии сопровождающего пакета взаимодействуют с системой инициализации только с помощью invoke-rc.d, update-rc.d и заголовков сценария инициализации LSB ... invoke-rc.d перед выполнением своего действия проверяет, действительно ли /usr/sbin/policy-rc.d является исполняемым, вызовет его с соответствующим именем службы и номером текущего уровня выполнения в командной строке и будет действовать в соответствии с кодом выхода. Например, возвращаемое значение 101 предотвратит выполнение запланированного действия. Это включает в себя автоматический запуск службы при установке пакета, а также остановку службы при удалении пакета и сокращает ритуал остановки-обновления-перезапуска во время обновления пакета до простого выполнения обновления, которое может оставить старую версию службы работающей.

Поскольку вы не хотите, чтобы какие-либо службы запускались, ваш сценарий policy-rc.d можно просто

#!/bin/sh
exit 101

Это метод, используемый такими инструментами, как pbuilder и Docker. mkimage-debootstrap.

К сожалению, эта техника не работает с Ubuntu chroots. Пакеты, которые интегрируются с системой инициализации выскочки, вызывают / usr / sbin / initctl вместо invoke-rc.d во время установки, а initctl не обращается к policy-rc.d. По словам автора выскочки обходной путь - заменить / sbin / initctl символической ссылкой на / bin / true в chroot. Вы также можете увидеть это в mkimage-debootstrap, они делают

dpkg-divert --local --rename --add /sbin/initctl
ln -sf /bin/true sbin/initctl

Ты можешь сделать:

export RUNLEVEL=1
for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
    chroot $template apt-get install rsyslog
done
exit

Я не тестировал его с помощью chroot, но он должен работать. Сначала он устанавливает переменную среды RUNLEVEL, поэтому процессы, инициированные apt-get не начнется любые службы, потому что они будут «думать», что система работает в одиночном режиме. Поскольку среда изменяется так, как это может повлиять на будущие команды, требуется выйти из оболочки, когда измененная среда больше не нужна, это достигается с помощью выход команда в конце. Там может быть некоторые (редкие?) пакеты, которые не устанавливаются должным образом в одиночном режиме (но, AFAIK, это не должно быть проблемой в большинстве случаев).