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?
--now
flagi w systemctl disable
poleceniu, aby zmiana odniosła skutek natychmiastowy. To był mój problem.
disable --now
jest równoważne z stop
następującą po disable
.