Instaluj pakiety bez uruchamiania procesów i usług w tle

43

Czasami instalacja niektórych aplikacji spowoduje uruchomienie procesu lub usługi od aplikacji uruchamianej automatycznie podczas instalacji. Jak zainstalować bez uruchamiania?

Oxwivi
źródło
Zastanawiam się, jaki jest potencjał pozostawienia systemu w niestabilnym stanie podczas instalowania pakietów jądra lub DKMS przy użyciu tego rodzaju konfiguracji. Nie wiem dużo o tym obszarze.
ændrük
@ ændrük To mnie martwi. Widzisz, że instaluję minimalną wersję Ubuntu na dysku, a następnie zamiast go uruchamiać, używam Live CD / USB chrooti instaluję potrzebne mi pakiety. Oczywiście nie ma sterowników, a nie sterowników GPU i należy je zainstalować.
Oxwivi,

Odpowiedzi:

35

Jest nieco pospieszny, ale dość niezawodny sposób na zrobienie tego, z którego korzystałem od dłuższego czasu w skrypcie automatycznej instalacji.

Najpierw utwórz katalog /root/fake, który zawiera na przykład dowiązania symboliczne do /bin/truewywoływanych:

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

Możesz także zmusić je do skasowania skryptów, które nic nie robią i zwracają sukces.

Następnie dołącz ten katalog z przodu $PATHpodczas instalowania pakietów:

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

Zapobiega to tylko uruchamianiu / restartowaniu demonów, podczas gdy takie rzeczy jak tworzenie initramfs są nadal wykonywane.

Wyjaśnienie

Skrypty, które są uruchamiane podczas instalacji i usuwania pakietu, wykonują invoke-rc.dlub inne z wymienionych komend, aby uruchomić i zatrzymać usługi. Nie nazywają ich jednak absolutnymi ścieżkami (przynajmniej nie spotkałem takiej, która to robi).

Tak więc wstawiając fałszywe polecenia „brak operacji” na początku $PATH, prawdziwe polecenia nigdy nie zostaną wywołane.

Ponieważ fałszywe są tylko polecenia używane do uruchamiania / zatrzymywania usług, wszystko inne, w szczególności ważne zadania, takie jak aktualizacja / tworzenie obrazów initramfs, nadal działa.

bseibold
źródło
Nie do końca zaznajomiony z dowiązaniami symbolicznymi, czy możesz rozwinąć wszystkie kroki, które podejmujesz?
Oxwivi,
Dowiązanie symboliczne to specjalny typ pliku, który nie ma treści, zamiast tego odnosi się do innego pliku (według ścieżki / nazwy). Można je utworzyć ln -s, na przykład w tym przypadku ln -s /bin/true /root/fake/initctl.
bseibold,
W jaki sposób zapobiega uruchamianiu / restartowaniu demonów? Zgodnie z odpowiedzią @ psusi invoke-rc.djest odpowiedzialny.
Oxwivi,
Umieszczając katalog z fałszywymi poleceniami na początku $PATHzmiennej, wszystkie wywołania invoke-rc.di inne, które mogą być użyte do uruchomienia i zatrzymania demonów, używają fałszywych poleceń. To znaczy, chyba że zostaną powołani z absolutną ścieżką, ale nigdy tego nie spotkałem.
bseibold,
Ach, teraz widzę, jak to działa - w zasadzie dowiązania symboliczne prowadzą do ślepych zaułków. Ale o co dokładnie /bin/truechodzi? A co z resztą poleceń zawartych w pakietach? Czy nie zostaną wyrzuceni poza tor przez określonego $PATH?
Oxwivi,
27

Demony działające w tle są uruchamiane za pomocą invoke-rc.d, co zapewnia, że ​​demon nie zostanie uruchomiony, jeśli jego skrypt rc mówi, że nie powinien działać na bieżącym poziomie pracy systemu. Możesz przesłonić jego pomysł na bieżący poziom działania systemu, ustawiając zmienną środowiskową RUNLEVEL. Nic nie powinno działać w poziomach pracy 0 i 6, ale wygląda na to, że invoke-rc.djest on błędny i uruchamia różne rzeczy, jeśli używasz tych poziomów pracy. Większość demonów nie działa na poziomie 1, więc możesz uniemożliwić ich uruchomienie podczas instalacji w następujący sposób:

sudo RUNLEVEL=1 apt-get install redis-server
psusi
źródło
Instaluję minimalną wersję Ubuntu na dysku, a następnie zamiast go uruchamiać, używam Live CD / USB chrooti instaluję potrzebne mi pakiety. Z powodu rzeczy, które zaczynają działać, czasami jestem wyłączany z sesji ubuntu (live CD). W każdym razie, co chcę zapytać się, jak mogę to wykorzystać RUNLEVELw chroot?
Oxwivi,
@Oxwivi, w ten sam sposób, ale ma automatycznie wykrywać, że jesteś w chroot i pomijać startowe demony.
psusi,
Czy to możliwe, że buggy invoke-rc.djest odpowiedzialny za problemy, które napotkałem?
Oxwivi,
@Oxwivi, jest to możliwe, ale bardziej prawdopodobne jest, że konkretny pakiet jest wadliwy i nie używa invoke-rc.d. Co to była za paczka?
psusi
Nie mam pojęcia, właśnie wymieniłem wszystkie pakiety do zainstalowania i nie miałem nic przeciwko terminalowi, aby wyświetlić dane wyjściowe.
Oxwivi,
20

Istnieje lepsze rozwiązanie :

cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d
GnunuX
źródło
5

Uważam, że podczas instalacji należy użyć --no-triggersopcji wiersza polecenia dpkg. Coś takiego:

dpkg -i --no-triggers SomeBigPackage.deb

Aby to ustawienie było trwałe apt-get installi nie uruchamiało żadnych wyzwalaczy, utwórz niestandardowy plik konfiguracyjny dpkg w /etc/dpkg/dpkg.cfg.d/custom:

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

Zauważ, że dpkg nadal rejestruje wyzwalacze jako uruchomione, mimo że nie:

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

Możesz też uruchomić skrypt instalatora w servicecelu wyłączenia nowej usługi:

service name_of_service stop
dan_linder
źródło
1
Jakiś apt-getodpowiednik? A może istnieje sposób na skonfigurowanie dpkgdo uruchamiania z --no-triggersużyciem dpkgbezpośrednim lub apt-getinstalowania czegoś?
Oxwivi
Dan_linder, mam nadzieję, że nie przeszkadza mi edytowanie odpowiedzi na pytanie @ Oxwivi. Zmodyfikuj / przywróć, jeśli nie podoba ci się.
ændrük
5
To jest niepoprawne. Wyzwalacze nie mają nic wspólnego z uruchamianiem demonów. Wyzwalacze to jeden pakiet, który wykonuje pewne czynności w celu rekonfiguracji w odpowiedzi na inny, na przykład jeśli instalujesz pakiet, który dodaje hook initramfs, uruchamia pakiet initramfs-tools w celu przebudowania twoich initramfs.
psusi
3

Skończyło się na emulacji tego, co robi debootstrap podczas instalowania pakietów, z wyjątkiem tego, że użyłem dpkg-divert:

Najpierw przenieś prawdziwe pliki na bok:

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

Następnie utwórz fałszywe wersje:

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"

Następnie wykonaj aktualizacje apt-get, instalacje itp., A następnie posprzątaj za pomocą:

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

Wiem, że są inne polecenia, które mogą być użyte do zatrzymania usługi / start, ale debootstrap dba tylko o start-stop-daemon, a initctl, więc śladem.

Tal
źródło
3

Szybki jednowarstwowy:

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
źródło
Jeśli chodzi o osobę, która umieściła „szybki jeden wiersz”, zapomniałeś ustawić /usr/sbin/policy-rc.d jako plik wykonywalny. W przeciwnym razie zostanie zignorowany.