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?
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.
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:
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.
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:
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:
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.
chroot
i instaluję potrzebne mi pakiety. Oczywiście nie ma sterowników, a nie sterowników GPU i należy je zainstalować.Odpowiedzi:
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/true
wywoływanych: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
$PATH
podczas instalowania pakietów: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.d
lub 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.
źródło
ln -s
, na przykład w tym przypadkuln -s /bin/true /root/fake/initctl
.invoke-rc.d
jest odpowiedzialny.$PATH
zmiennej, wszystkie wywołaniainvoke-rc.d
i 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./bin/true
chodzi? A co z resztą poleceń zawartych w pakietach? Czy nie zostaną wyrzuceni poza tor przez określonego$PATH
?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, żeinvoke-rc.d
jest 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:źródło
chroot
i 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ćRUNLEVEL
wchroot
?invoke-rc.d
jest odpowiedzialny za problemy, które napotkałem?invoke-rc.d
. Co to była za paczka?Istnieje lepsze rozwiązanie :
źródło
Uważam, że podczas instalacji należy użyć
--no-triggers
opcji wiersza poleceniadpkg
. Coś takiego:Aby to ustawienie było trwałe
apt-get install
i nie uruchamiało żadnych wyzwalaczy, utwórz niestandardowy plik konfiguracyjny dpkg w/etc/dpkg/dpkg.cfg.d/custom
:Zauważ, że dpkg nadal rejestruje wyzwalacze jako uruchomione, mimo że nie:
Możesz też uruchomić skrypt instalatora w
service
celu wyłączenia nowej usługi:źródło
apt-get
odpowiednik? A może istnieje sposób na skonfigurowaniedpkg
do uruchamiania z--no-triggers
użyciemdpkg
bezpośrednim lubapt-get
instalowania czegoś?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:
Następnie utwórz fałszywe wersje:
Następnie wykonaj aktualizacje apt-get, instalacje itp., A następnie posprzątaj za pomocą:
Wiem, że są inne polecenia, które mogą być użyte do zatrzymania usługi / start, ale debootstrap dba tylko o
start-stop-daemon
, ainitctl
, więc śladem.źródło
Szybki jednowarstwowy:
źródło