Obraz maszyny Wirtualnej serwera Ubuntu 16.04 najwidoczniej uruchamia „apt-daily.service” co około 12 godzin; ta usługa wykonuje różne zadania związane z APT, takie jak odświeżanie listy dostępnych pakietów, wykonywanie nienadzorowanych aktualizacji w razie potrzeby itp.
Rozpoczynając od „migawki” maszyny wirtualnej, usługa jest uruchamiana natychmiast , ponieważ (jak sądzę) systemd szybko zdaje sobie sprawę, że licznik powinien był zadziałać dawno temu.
Jednak działający APT uniemożliwia uruchomienie innych apt
procesów, ponieważ blokuje /var/lib/dpkg
. Komunikat o błędzie wskazujący to wygląda następująco:
E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
Muszę wyłączyć to automatyczne zadanie APT, dopóki Ansible nie zakończy konfiguracji komputera (co zwykle wiąże się z instalacją pakietów); zobacz https://github.com/gc3-uzh-ch/elasticluster/issues/304, aby uzyskać więcej informacji i kontekst.
Próbowałem różnych opcji, aby wyłączyć funkcję „nienadzorowanej aktualizacji” za pomocą skryptu „danych użytkownika” cloud-init
, ale jak dotąd wszystkie zawiodły.
1. Wyłącz zadanie systemowe
Zadanie systemd apt-daily.service
jest uruchamiane przez apt-daily.timer
. Próbowałem wyłączyć jedno lub drugie, lub oba, przy pomocy różnych poleceń następujących poleceń; nadal apt-daily.service
jest uruchamiany chwilę po tym, jak maszyna wirtualna będzie gotowa do przyjmowania połączeń SSH:
#!/bin/bash
systemctl stop apt-daily.timer
systemctl disable apt-daily.timer
systemctl mask apt-daily.service
systemctl daemon-reload
2. Wyłącz opcję konfiguracji APT::Periodic::Enable
Skrypt /usr/lib/apt/apt.systemd.daily
odczytuje kilka zmiennych konfiguracyjnych APT; ustawienie APT::Periodic::Enable
całkowicie wyłącza funkcjonalność (wiersze 331--337). Próbowałem wyłączyć go za pomocą następującego skryptu:
#!/bin/bash
# cannot use /etc/apt/apt.conf.d/10periodic as suggested in
# /usr/lib/apt/apt.systemd.daily, as Ubuntu distributes the
# unattended upgrades stuff with priority 20 and 50 ...
# so override everything with a 99xxx file
cat > /etc/apt/apt.conf.d/99elasticluster <<__EOF
APT::Periodic::Enable "0";
// undo what's in 20auto-upgrade
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
__EOF
Jednak pomimo APT::Periodic::Enable
wartości 0
z wiersza poleceń (patrz poniżej) unattended-upgrades
program jest nadal uruchomiony ...
ubuntu@test:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Usuń /usr/lib/apt/apt.systemd.daily
całkowicie
Poniższy cloud-init
skrypt całkowicie usuwa skrypt nienadzorowanej aktualizacji:
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
Mimo to zadanie działa i widzę je w tabeli procesów! chociaż plik nie istnieje, jeśli sondowany z linii poleceń:
ubuntu@test:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
Wygląda na to, że cloud-init
skrypt (wraz z wierszem poleceń SSH) i proces systemowy wykonywany są w osobnych systemach plików i przestrzeniach procesów ...
pytania
Czy brakuje mi czegoś oczywistego? A może dzieje się jakaś magia przestrzeni nazw, o której nie wiem?
Co najważniejsze: w jaki sposób można wyłączyć apt-daily.service
za pomocą
cloud-init
skryptu?
źródło
--now
flagi wsystemctl disable
poleceniu, aby zmiana odniosła skutek natychmiastowy. To był mój problem.disable --now
jest równoważne zstop
następującą podisable
.Odpowiedzi:
Tak, coś oczywistego mi brakowało.
Systemd polega na równoczesnym rozpoczęciem usługi, więc
cloud-init
skrypt jest uruchamiany jednocześnieapt-daily.service
jest uruchomiony. Do czasu,cloud-init
aby wykonać ładunek określony przez użytkownika,apt-get update
już działa. Tak więc próby 2. i 3. nie powiodły się nie z powodu pewnej magii przestrzeni nazw, ale dlatego, że zbyt późno zmieniły system, aby możnaapt.systemd.daily
było zauważyć zmiany.Oznacza to również, że w zasadzie nie ma możliwości uniemożliwienia
apt.systemd.daily
uruchomienia - można go zabić dopiero po uruchomieniu.Ten skrypt „danych użytkownika” podąża tą drogą:
Nadal istnieje okno czasowe, w którym logowanie SSH jest możliwe, ale jeszcze
apt-get
się nie uruchomi, ale nie wyobrażam sobie innego rozwiązania, które może działać na standardowym obrazie w chmurze Ubuntu 16.04.źródło
apt-get -o Acquire::http::AllowRedirect=false update
Uwaga: Niestety część poniższego rozwiązania nie działa na systemach Ubuntu 16.04 (takich jak pytający), ponieważ sugerowane
systemd-run
wywołanie działa tylko na Ubuntu 18.04 i nowszych ( szczegółowe informacje można znaleźć w komentarzach ). Pozostawię tutaj odpowiedź, ponieważ to pytanie jest wciąż popularnym hitem, niezależnie od używanej wersji Ubuntu ...W systemie Ubuntu 18.04 (i nowszych wersjach) mogą występować maksymalnie dwie usługi związane z aktualizacją / aktualizacją w czasie rozruchu. Pierwszy
apt-daily.service
odświeża listę pakietów. Może jednak istnieć sekunda,apt-daily-upgrade.service
która faktycznie instaluje pakiety o krytycznym znaczeniu dla bezpieczeństwa. Odpowiedź na „Zakończ i wyłączyć / usunąć nienadzorowanej uaktualnienie przed zwrotów komenda” pytanie daje doskonały przykład tego, jak czekać na oba te skończyć (skopiowany tutaj dla wygody):(zwróć uwagę, że należy to uruchomić jako root). Jeśli próbujesz wyłączyć te usługi przy przyszłych rozruchach, musisz zamaskować OBIE usługi:
Alternatywnie możesz
systemctl disable
zarówno usługi ORAZ powiązane z nimi liczniki (tj.apt-daily.timer
Iapt-daily-upgrade.timer
).Zwróć uwagę, że techniki maskowania / wyłączania zawarte w tej odpowiedzi zapobiegają tylko aktualizacji / aktualizacji w przyszłych uruchomieniach - nie zatrzymają ich, jeśli są już uruchomione w bieżącym rozruchu.
źródło
systemd-run
w Ubuntu 16.04 jest zbyt stary, aby obsługiwać tę--wait
opcję, ale tak naprawdę nie powinien być konieczny do zamierzonego celu. (Według strony podręcznika,--wait
czeka na zakończenie jednostki, ale wystarczy poczekać na jej uruchomienie, co jest domyślnym zachowaniemsystemd-run
).systemd-run
inkantacja w ogóle nie działa na Ubuntu 16.04; umiera z komunikatem o błędzie Nieznane przypisanie After = apt-daily.service apt-daily-upgrade.service . Wygląda na to, że niektóre właściwości jednostek nie były dostępnesystemd-run
, patrz na przykład tutajMożesz to wyłączyć za pomocą modułu inicjującego chmurę „bootcmd”. Działa to przed uruchomieniem sieci, co jest wymagane, zanim apt update może uzyskać szansę na uruchomienie.
Gdy wpiszesz ssh do instancji, powinieneś także poczekać na zakończenie końcowych faz inicjowania chmury, ponieważ przenosi on odpowiednie źródła / listy.
Jest to również pomocne, aby zobaczyć, jak wcześnie uruchamia się bootcmd:
Możesz to sprawdzić w następujący sposób:
źródło
Nie byłoby łatwiej maskować urządzenia
?
źródło
ls -al /etc/systemd/system/ | grep alsa lrwxrwxrwx 1 root root 9 Sep 1 13:17 alsa-init.service -> /dev/null
dane są puste.sudo dpkg-reconfigure -plow unattended-upgrades
i zabraniam jej. Zatem status jednostki apt-daily.service jest martwy.apt-daily.service
zecloud-init
skryptu i zanim uruchomi się on po ponownym uruchomieniu VM: oznacza to: (1) należy to zrobić nieinteraktywnie, (2) należy to zrobić przedapt-daily.service
pierwszym uruchomieniem. (Jeśli moje rozumienie systemd jest poprawne, (2) nie można faktycznie osiągnąćcloud-init
iapt-daily
uruchomić jednocześnie - więcej informacji znajduje się w mojej odpowiedzi.)To czeka 1 sekundę w pętli whil i sprawdza, czy zamek jest zwolniony.
źródło