Устанавливать пакеты без запуска фоновых процессов и сервисов
43
Иногда при установке некоторых приложений запускается процесс или служба из приложения, которое автоматически запускается при установке. Как мне установить без запуска их?
Интересно, что может привести к нестабильной работе системы при установке пакетов ядра или 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-образов, все еще работают.
Не совсем знакомы с символическими ссылками, можете ли вы рассказать о всех шагах, которые вы делаете?
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, поэтому вы можете предотвратить их запуск при установке следующим образом:
Я устанавливаю минимальный Ubuntu на диск, затем вместо загрузки использую Live CD / USB для chrootустановки необходимых пакетов. Из-за того, что все начинает работать, иногда я отключаюсь от сеанса работы с Ubuntu (live CD). Во всяком случае, что я хочу спросить, как я могу использовать это RUNLEVELв chroot?
Oxwivi
@Oxwivi, так же, но он должен автоматически определять, что вы находитесь в chroot, и пропускать стартовые демоны.
Псуси
Возможно ли, что багги invoke-rc.dотвечает за проблемы, с которыми я столкнулся?
Oxwivi
@Oxwivi, это возможно, но более вероятно, что определенный пакет глючит и не использует invoke-rc.d. Что это был за пакет?
Псуси
Понятия не имею, я просто перечислил все пакеты для установки и не возражал против терминала, чтобы посмотреть вывод.
Я считаю, что вам нужно использовать параметр --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команду, чтобы отключить новую службу:
Любой apt-getэквивалент? Или есть способ настроить dpkgзапуск с --no-triggersиспользованием dpkgнапрямую или apt-getдля установки чего-либо?
Oxwivi
dan_linder, я надеюсь, ты не возражаешь, чтобы я отредактировал ответ на вопрос @ Oxwivi. Не стесняйтесь изменять / возвращать его, если он вам не нравится.
rndrük
5
Это неверно Триггеры не имеют ничего общего с запуском демонов. Триггеры - это один пакет, выполняющий какое-то действие для переконфигурации себя в ответ на другой, например, если вы устанавливаете пакет, который добавляет хук initramfs, он запускает пакет initramfs-tools для перестройки ваших initramfs.
psusi
3
В итоге я эмулировал то, что делает debootstrap при установке пакетов, за исключением того, что я использовал dpkg-divert:
Я знаю, что есть другие команды, которые можно использовать для остановки / запуска служб, но debootstrap заботится только о, start-stop-daemonи initctlпоэтому я последовал их примеру.
Что касается человека, который поставил «быстрый однострочник», вы забыли установить /usr/sbin/policy-rc.d как исполняемый файл. Иначе будет проигнорировано.
chroot
установки необходимых пакетов. Конечно, драйверы, в частности, драйверы графического процессора, отсутствуют и должны быть установлены.Ответы:
Есть немного хакерский, но довольно надежный способ сделать это, который я использовал некоторое время в сценарии автоматической установки.
Сначала создайте каталог, например
/root/fake
, который содержит символические ссылки на/bin/true
вызываемые:Вы также можете сделать их скриптами bash, которые ничего не делают и возвращают успех.
Затем включите этот каталог в начало
$PATH
при установке пакетов:Это только предотвращает запуск / перезапуск демонов, в то время как такие вещи, как создание initramfs, все еще выполняются.
объяснение
Сценарии, которые выполняются при установке и удалении пакета, выполняются
invoke-rc.d
или другие из упомянутых команд для запуска и остановки служб. Однако они не называют их абсолютными путями (по крайней мере, я не встречал того, который делает).Таким образом, вставляя ложные команды «без операции» в начале
$PATH
, настоящие команды никогда не будут вызваны.Поскольку подделываются только команды, используемые для запуска / остановки служб, все остальное, в частности важные задачи, такие как обновление / создание initramfs-образов, все еще работают.
источник
ln -s
, в этом случае, напримерln -s /bin/true /root/fake/initctl
.invoke-rc.d
отвечает.$PATH
переменной, все вызовыinvoke-rc.d
и другие, которые можно использовать для запуска и остановки демонов, используют поддельные команды. То есть, если они не вызваны с абсолютного пути, но я никогда не сталкивался с этим./bin/true
вещь? А что из остальных команд, участвующих в пакетах? Разве они не будут сбиты с пути по указанному$PATH
?Фоновые демоны запускаются с
invoke-rc.d
, что гарантирует, что демон не запускается, если его скрипт rc сообщает, что он не должен работать на текущем уровне запуска системы. Вы можете переопределить его представление о текущем уровне выполнения системы, установив переменную среды RUNLEVEL. Ничто не должно запускаться на уровнях запуска 0 и 6, но, похоже, чтоinvoke-rc.d
он глючит и запускает вещи в любом случае, если вы используете эти уровни запуска. Большинство демонов не запускаются на уровне выполнения 1, поэтому вы можете предотвратить их запуск при установке следующим образом:источник
chroot
установки необходимых пакетов. Из-за того, что все начинает работать, иногда я отключаюсь от сеанса работы с Ubuntu (live CD). Во всяком случае, что я хочу спросить, как я могу использовать этоRUNLEVEL
вchroot
?invoke-rc.d
отвечает за проблемы, с которыми я столкнулся?invoke-rc.d
. Что это был за пакет?Есть лучшее решение :
источник
Я считаю, что вам нужно использовать параметр
--no-triggers
командной строки, когда вы делаетеdpkg
установку. Что-то вроде этого:Чтобы сделать этот параметр постоянным, чтобы
apt-get install
не запускать триггеры, создайте пользовательский файл конфигурации dpkg в/etc/dpkg/dpkg.cfg.d/custom
:Обратите внимание, что dpkg по-прежнему регистрирует триггеры как запущенные, хотя они этого не сделали:
В качестве альтернативы вы можете заставить скрипт установки запустить
service
команду, чтобы отключить новую службу:источник
apt-get
эквивалент? Или есть способ настроитьdpkg
запуск с--no-triggers
использованиемdpkg
напрямую илиapt-get
для установки чего-либо?В итоге я эмулировал то, что делает debootstrap при установке пакетов, за исключением того, что я использовал dpkg-divert:
Сначала уберите настоящие файлы с пути:
Затем создайте фиктивные версии:
Затем выполните обновления apt-get, установки и т. Д., А затем выполните следующие действия:
Я знаю, что есть другие команды, которые можно использовать для остановки / запуска служб, но debootstrap заботится только о,
start-stop-daemon
иinitctl
поэтому я последовал их примеру.источник
Быстрый однострочник:
источник