Встановлюйте пакети без запуску фонових процесів та служб


43

Іноді встановлення деяких додатків запускає процес або послугу з програми, яка автоматично запускається при встановленні. Як встановити, не запускаючи їх?


Цікаво, який потенціал може залишити систему в нестабільному стані при встановленні ядер або пакетів DKMS, використовуючи таку конфігурацію. Я мало знаю про цю область.
ændrük

@ ændrük Це мене хвилювало. Ви бачите, що я встановлюю мінімальний Ubuntu на диск, тоді замість завантаження в нього я використовую Live CD / USB chrootі встановлюю необхідні мені пакунки. Звичайно, драйверів, зокрема, драйверів GPU немає, і їх потрібно встановити.
Oxwivi

Відповіді:


35

Існує трохи хакітний, але досить надійний спосіб зробити це, який я деякий час використовував в сценарії автоматизованої установки.

Спочатку створіть, наприклад /root/fake, каталог , який містить символьні посилання на /bin/trueвиклик:

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

Ви також можете зробити їх скриптовими сценаріями, які нічого не роблять і не повертають успіх.

Потім включіть цей каталог внизу, $PATHколи встановлюєте пакети:

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

Це лише запобігає запуску / перезапуску демонів, тоді як такі речі, як створення initramfs, все ще робляться.

Пояснення

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

Отже, вставляючи підроблені команди "без операції" на початку $PATH, справжні команди ніколи не викликаються.

Оскільки підробляються лише команди, що використовуються для запуску / зупинки служб, все інше, зокрема важливі завдання, такі як оновлення / створення initramfs-зображень, все ще працюють.


Не зовсім знайомі із посиланнями, чи можете ви детально розібратися з усіма кроками?
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

Я встановлюю мінімальний Ubuntu на накопичувач, потім замість завантаження в нього використовую Live CD / USB для chrootвстановлення потрібних пакетів. Через те, що речі починають працювати, іноді мене виключають із сеансу ubuntu (живий CD). У всякому разі, що я хочу запитати, як я можу використовувати це RUNLEVELв chroot?
Oxwivi

@Oxwivi, точно так само, але передбачається автоматично визначити, що ви знаходитесь в chroot і пропустити стартові демони.
psusi

Чи можливо баггі invoke-rc.dвідповідає за проблеми, з якими я стикався?
Oxwivi

@ Oxwivi, можливо, але більш імовірно, що певний пакет є помилковим і не використовується invoke-rc.d. Який це був пакет?
psusi

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

1
Будь-який apt-getеквівалент? Або є спосіб налаштувати dpkgзапуск із --no-triggersвикористанням dpkgбезпосередньо чи apt-getінсталюванням?
Oxwivi

dan_linder, я сподіваюся, що ви не заперечуєте проти моєї редагування у відповіді на запитання @ Oxwivi. Не соромтесь змінювати / повертати його, якщо це вам не подобається.
ændrük

5
Це неправильно. Тригери не мають нічого спільного із запуском демонів. Тригери - це один пакет, який виконує певну дію, щоб перенастроїти себе у відповідь на інший, наприклад, якщо встановити пакет, який додає гачок initramfs, він запускає пакет інструментів initramfs для відновлення вашого 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тому я слідував за цим прикладом.


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

Що стосується людини, яка поставила "швидкий однолінійний", ви забули встановити /usr/sbin/policy-rc.d як виконуваний файл. Інакше це буде проігноровано.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.