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

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

41
задан 31 October 2011 в 18:24

10 ответов

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

Сначала создайте каталог, например /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

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

Объяснение

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

Итак, вставив поддельные команды «без операции» в начале $PATH, реальный

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

33
ответ дан 25 May 2018 в 17:22
  • 1
    Не совсем знакомы с символическими ссылками, можете ли вы подробно описать все шаги, которые вы предпринимаете? – Oxwivi 10 November 2011 в 00:47
  • 2
    Символьная ссылка - это особый тип файла, который не имеет содержимого, вместо этого он ссылается на другой файл (по пути / имени). Они могут быть созданы с помощью ln -s, в данном случае, например, ln -s /bin/true /root/fake/initctl. – bseibold 10 November 2011 в 02:18
  • 3
    Как это предотвращает запуск / перезапуск демонов? В соответствии с ответом @ psusi отвечает invoke-rc.d. – Oxwivi 10 November 2011 в 13:08
  • 4
    Поместив каталог с поддельными командами в начале переменной $PATH, все вызовы invoke-rc.d и другие, которые можно использовать для запуска и остановки демонов, используют поддельные команды. То есть, если они не вызваны с абсолютным путем, но я никогда не сталкивался с этим. – bseibold 10 November 2011 в 20:00
  • 5
    Ах, теперь я вижу, как это работает - в основном, символические ссылки приводят к тупикам. Но что такое /bin/true? А что из остальных команд, участвующих в пакетах? Разве они не будут отброшены за пределы указанного $PATH? – Oxwivi 10 November 2011 в 20:07

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

sudo RUNLEVEL=1 apt-get install redis-server
26
ответ дан 25 May 2018 в 17:22
  • 1
    Я устанавливаю минимальный Ubuntu на диске, а вместо загрузки в него я использую Live CD / USB для chroot и устанавливаю нужные мне пакеты. Из-за того, что начинает работать, иногда меня отключает сессия ubuntu (live CD). Во всяком случае, я хочу спросить, как я могу использовать этот RUNLEVEL в chroot? – Oxwivi 5 November 2011 в 17:43
  • 2
    @Oxwivi, так же, но предполагается, что вы автоматически обнаружите, что вы находитесь в chroot и пропустите демоны запуска. – psusi 7 November 2011 в 20:43
  • 3
    Возможно ли, что проблема с ошибкой invoke-rc.d отвечает за проблемы, с которыми я столкнулся? – Oxwivi 7 November 2011 в 21:24
  • 4
    @Oxwivi, возможно, но более вероятно, что конкретный пакет неисправен и не использует invoke-rc.d. Какой пакет был? – psusi 7 November 2011 в 21:29
  • 5
    Я понятия не имею, я только что перечислил все пакеты для установки и не пропустил терминал для просмотра вывода. – Oxwivi 7 November 2011 в 22:08

Существует лучшее решение:

cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d
16
ответ дан 25 May 2018 в 17:22

Я полагаю, вам нужно использовать опцию командной строки --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
[d2 ] Обратите внимание, что 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
4
ответ дан 25 May 2018 в 17:22
  • 1
    Любой apt-get эквивалент? Или есть способ настроить dpkg для запуска с --no-triggers, используя ли dpkg напрямую или apt-get, чтобы установить что-нибудь? – Oxwivi 2 November 2011 в 13:53
  • 2
    dan_linder, надеюсь, вы не возражаете мне, что я редактирую ответ на вопрос @ Oxwivi. Не стесняйтесь изменять / отменять его, если это вам не по душе. – ændrük 5 November 2011 в 01:21
  • 3
    Это неверно. Триггеры не имеют никакого отношения к запуску демонов. Триггеры - это один пакет, выполняющий некоторые действия для перенастройки себя в ответ на другой, например, если вы устанавливаете пакет, который добавляет крюк initramfs, он запускает пакет initramfs-tools для восстановления ваших initramf. – psusi 5 November 2011 в 01:42

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

Сначала переместите реальные файлы с пути:

dpkg-divert --add --rename --local /sbin/start-stop-daemon
dpkg-divert --add --rename --local /sbin/initctl
[d2 ] Затем создайте фиктивные версии:

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
ответ дан 25 May 2018 в 17:22

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

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
3
ответ дан 25 May 2018 в 17:22
  • 1
    Что касается человека, который поставил «быстрый однострочный», вы забыли установить /usr/sbin/policy-rc.d в качестве исполняемого файла. В противном случае это будет проигнорировано. – user 11 September 2013 в 01:19
  • 2
    Что касается человека, который поставил «быстрый однострочный», вы забыли установить /usr/sbin/policy-rc.d в качестве исполняемого файла. В противном случае это будет проигнорировано. – user 11 September 2013 в 01:19
  • 3
    Что касается человека, который поставил «быстрый однострочный», вы забыли установить /usr/sbin/policy-rc.d в качестве исполняемого файла. В противном случае это будет проигнорировано. – user 11 September 2013 в 01:19
  • 4
    Что касается человека, который поставил «быстрый однострочный», вы забыли установить /usr/sbin/policy-rc.d в качестве исполняемого файла. В противном случае это будет проигнорировано. – user 11 September 2013 в 01:19
  • 5
    Что касается человека, который поставил «быстрый однострочный», вы забыли установить /usr/sbin/policy-rc.d в качестве исполняемого файла. В противном случае это будет проигнорировано. – user 11 September 2013 в 01:19

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

sudo RUNLEVEL=1 apt-get install redis-server
26
ответ дан 25 July 2018 в 20:54

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

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
3
ответ дан 25 July 2018 в 20:54

Существует лучшее решение :

cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d
16
ответ дан 31 July 2018 в 10:30

Существует лучшее решение :

cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d
16
ответ дан 4 August 2018 в 18:25

Другие вопросы по тегам:

Похожие вопросы: