Jak zapewne wiesz, domyślnie podczas instalowania pakietu w systemie opartym na Debianie lub Ubuntu, jeśli pakiet zawiera usługę, usługa ta będzie na ogół włączona i uruchomiona automatycznie podczas instalacji pakietu.
To dla mnie problem.
Odkryłem, że muszę zarządzać szablonami do budowania kontenerów LXC. Istnieje kilka kontenerów, każdy odpowiadający wydaniu Debian lub Ubuntu. (Istnieją również pojemniki na bazie Red Hat, ale nie są one tutaj istotne).
/var/lib/libvirt/filesystems/debian6_template
/var/lib/libvirt/filesystems/debian7_template
/var/lib/libvirt/filesystems/ubuntu1004_template
/var/lib/libvirt/filesystems/ubuntu1204_template
Czasami okaże się, że szablony mają brakujący pakiet lub potrzebuję jakiejś innej zmiany, więc chrootuję się w nich, aby zainstalować pakiet. Niestety, kiedy to robię, kończę z uruchomionymi kilkoma kopiami usługi pakietu!
Na przykład okazało się, że szablony nie mają demona syslog, więc zainstalowałem jeden:
for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
chroot $template apt-get install rsyslog
done
I natychmiast skończyły się cztery uruchomione rsyslog. Nie wspominając o dwóch kopiach exim4. Ups!
Czytałem gdzieś (choć już nie mogę go ponownie znaleźć), że nie powinno uruchamiać usług, gdy działa w chroot, ale najwyraźniej tak się nie dzieje.
Jeden potencjalnie realny paskudny hack wymaga tymczasowego zastąpienia różnych poleceń, które faktycznie uruchamiają usługi, takich jak start-stop-daemon
i initctl
chociaż jest to o wiele więcej pracy, niż naprawdę chciałem zrobić. Jeśli nie mam innego wyboru ...
Idealnym rozwiązaniem byłoby, gdyby systemy oparte na Debianie przestały robić to badziewie, ale jeśli tego nie zrobi, być może niejasna lub nieudokumentowana opcja wiersza poleceń apt-get
?
W przypadku, gdy nie było to jasne, naprawdę chcę zachować wszystko, co związane z zarządzaniem szablonami poza szablonami, jeśli to możliwe.
źródło
Możesz to zrobić:
Nie testowałem tego z chrootem, ale powinno działać. Na początku ustawia zmienną środowiskową RUNLEVEL, więc procesy zainicjowane przez apt-get nie uruchomią żadnych usług, ponieważ będą „myśleć”, że system działa w trybie pojedynczym. Ponieważ środowisko jest modyfikowane w sposób, w jaki może wpływać na przyszłe polecenia, konieczne jest zamknięcie powłoki, gdy zmodyfikowane środowisko nie jest już potrzebne, jest to realizowane przez polecenie exit na końcu. Nie mogą być pewne rzadkie (?) Pakietów, które nie zainstaluje się poprawnie w trybie pojedynczym (ale AFAIK nie powinno to być problemem w większości przypadków).
źródło
export RUNLEVEL=1
tu ważna część? Co dokładnie to powoduje?rsyslog
się, że jest to jeden z „rzadkich” pakietów, które wysadziły się całkowicie podczas próby instalacji w ten sposób. Może się to jednak przydać, więc możesz zachować opinię :)