Устанавливать пакеты без запуска фоновых процессов и сервисов

43

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

Oxwivi
источник
Интересно, что может привести к нестабильной работе системы при установке пакетов ядра или DKMS с использованием такой конфигурации. Я не знаю много об этой области.
rndrük
@ ændrük Меня это беспокоит. Видите ли, я устанавливаю минимальный Ubuntu на диск, а затем вместо загрузки использую Live CD / USB для chrootустановки необходимых пакетов. Конечно, драйверы, в частности, драйверы графического процессора, отсутствуют и должны быть установлены.
Oxwivi

Ответы:

35

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

Сначала создайте каталог, например /root/fake, который содержит символические ссылки на /bin/trueвызываемые:

initctl
invoke-rc.d
restart
start
stop
start-stop-daemon
service
deb-systemd-helper

Вы также можете сделать их скриптами bash, которые ничего не делают и возвращают успех.

Затем включите этот каталог в начало $PATHпри установке пакетов:

PATH=/root/fake:$PATH apt-get install whatever

Это только предотвращает запуск / перезапуск демонов, в то время как такие вещи, как создание initramfs, все еще выполняются.

объяснение

Сценарии, которые выполняются при установке и удалении пакета, выполняются invoke-rc.dили другие из упомянутых команд для запуска и остановки служб. Однако они не называют их абсолютными путями (по крайней мере, я не встречал того, который делает).

Таким образом, вставляя ложные команды «без операции» в начале $PATH, настоящие команды никогда не будут вызваны.

Поскольку подделываются только команды, используемые для запуска / остановки служб, все остальное, в частности важные задачи, такие как обновление / создание initramfs-образов, все еще работают.

bseibold
источник
Не совсем знакомы с символическими ссылками, можете ли вы рассказать о всех шагах, которые вы делаете?
Oxwivi
Символьная ссылка - это специальный тип файла, который не имеет содержимого, вместо этого он ссылается на другой файл (по пути / имени). Они могут быть созданы с помощью ln -s, в этом случае, например ln -s /bin/true /root/fake/initctl.
bseibold
Как это предотвращает запуск / перезапуск демонов? Согласно ответу @ psusi invoke-rc.dотвечает.
Oxwivi
Помещая каталог с поддельными командами в начале $PATHпеременной, все вызовы invoke-rc.dи другие, которые можно использовать для запуска и остановки демонов, используют поддельные команды. То есть, если они не вызваны с абсолютного пути, но я никогда не сталкивался с этим.
bseibold
Ах, теперь я вижу, как это работает - в основном, символические ссылки ведут в тупик. Но что именно это за /bin/trueвещь? А что из остальных команд, участвующих в пакетах? Разве они не будут сбиты с пути по указанному $PATH?
Oxwivi
27

Фоновые демоны запускаются с invoke-rc.d, что гарантирует, что демон не запускается, если его скрипт rc сообщает, что он не должен работать на текущем уровне запуска системы. Вы можете переопределить его представление о текущем уровне выполнения системы, установив переменную среды RUNLEVEL. Ничто не должно запускаться на уровнях запуска 0 и 6, но, похоже, что invoke-rc.dон глючит и запускает вещи в любом случае, если вы используете эти уровни запуска. Большинство демонов не запускаются на уровне выполнения 1, поэтому вы можете предотвратить их запуск при установке следующим образом:

sudo RUNLEVEL=1 apt-get install redis-server
psusi
источник
Я устанавливаю минимальный Ubuntu на диск, затем вместо загрузки использую Live CD / USB для chrootустановки необходимых пакетов. Из-за того, что все начинает работать, иногда я отключаюсь от сеанса работы с Ubuntu (live CD). Во всяком случае, что я хочу спросить, как я могу использовать это RUNLEVELв chroot?
Oxwivi
@Oxwivi, так же, но он должен автоматически определять, что вы находитесь в chroot, и пропускать стартовые демоны.
Псуси
Возможно ли, что багги invoke-rc.dотвечает за проблемы, с которыми я столкнулся?
Oxwivi
@Oxwivi, это возможно, но более вероятно, что определенный пакет глючит и не использует invoke-rc.d. Что это был за пакет?
Псуси
Понятия не имею, я просто перечислил все пакеты для установки и не возражал против терминала, чтобы посмотреть вывод.
Oxwivi
5

Я считаю, что вам нужно использовать параметр --no-triggersкомандной строки, когда вы делаете dpkgустановку. Что-то вроде этого:

dpkg -i --no-triggers SomeBigPackage.deb

Чтобы сделать этот параметр постоянным, чтобы apt-get installне запускать триггеры, создайте пользовательский файл конфигурации dpkg в /etc/dpkg/dpkg.cfg.d/custom:

# Install packages without starting background processes and services
# See http://askubuntu.com/q/74061  
no-triggers

Обратите внимание, что dpkg по-прежнему регистрирует триггеры как запущенные, хотя они этого не сделали:

$ sudo apt-get install redis-server 
…
Starting redis-server: redis-server.
$ service redis-server status
redis-server is not running

В качестве альтернативы вы можете заставить скрипт установки запустить serviceкоманду, чтобы отключить новую службу:

service name_of_service stop
dan_linder
источник
1
Любой apt-getэквивалент? Или есть способ настроить dpkgзапуск с --no-triggersиспользованием dpkgнапрямую или apt-getдля установки чего-либо?
Oxwivi
dan_linder, я надеюсь, ты не возражаешь, чтобы я отредактировал ответ на вопрос @ Oxwivi. Не стесняйтесь изменять / возвращать его, если он вам не нравится.
rndrük
5
Это неверно Триггеры не имеют ничего общего с запуском демонов. Триггеры - это один пакет, выполняющий какое-то действие для переконфигурации себя в ответ на другой, например, если вы устанавливаете пакет, который добавляет хук initramfs, он запускает пакет initramfs-tools для перестройки ваших initramfs.
psusi
3

В итоге я эмулировал то, что делает debootstrap при установке пакетов, за исключением того, что я использовал dpkg-divert:

Сначала уберите настоящие файлы с пути:

dpkg-divert --add --rename --local /sbin/start-stop-daemon
dpkg-divert --add --rename --local /sbin/initctl

Затем создайте фиктивные версии:

echo \
"#!/bin/sh
echo
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "/sbin/start-stop-daemon"
chmod 755 "/sbin/start-stop-daemon"

echo \
"#!/bin/sh
echo
echo \"Warning: Fake initctl called, doing nothing\"" > "/sbin/initctl"
chmod 755 "/sbin/initctl"

Затем выполните обновления apt-get, установки и т. Д., А затем выполните следующие действия:

rm /sbin/initctl /sbin/start-stop-daemon
dpkg-divert --remove --rename /sbin/initctl
dpkg-divert --remove --rename /sbin/start-stop-daemon

Я знаю, что есть другие команды, которые можно использовать для остановки / запуска служб, но debootstrap заботится только о, start-stop-daemonи initctlпоэтому я последовал их примеру.

Tal
источник
3

Быстрый однострочник:

echo -e '#!/bin/sh\nexit 101' | install -m 755 /dev/stdin /usr/sbin/policy-rc.d && apt-get install **Package** && rm -f /usr/sbin/policy-rc.d
pl1nk
источник
Что касается человека, который поставил «быстрый однострочник», вы забыли установить /usr/sbin/policy-rc.d как исполняемый файл. Иначе будет проигнорировано.