Das Server-VM-Image von Ubuntu 16.04 startet den „apt-daily.service“ anscheinend alle
12 Stunden oder so; Dieser Dienst führt verschiedene APT-bezogene Aufgaben aus, wie z. B. das Aktualisieren
der Liste der verfügbaren Pakete, das Durchführen unbeaufsichtigter Upgrades, falls erforderlich, usw.
Beim Start von einem VM „Snapshot“ wird der Dienst sofort ausgelöst , da (ich
vermute) systemd schnell erkennt, dass der Timer schon längst hätte laufen sollen.
Ein laufendes APT verhindert jedoch andere apt
Prozesse daran gehindert zu laufen, da es eine
Sperre auf /var/lib/dpkg
hält . Die darauf hinweisende Fehlermeldung sieht folgendermaßen aus:
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?
Ich muss diese automatisierte APT-Aufgabe deaktivieren, bis Ansible
die Maschineneinrichtung abgeschlossen hat (was normalerweise die Installation von Paketen beinhaltet);
siehe https://github.com/gc3-uzh-ch/elasticluster/issues/ 304 für weitere Informationen und
Kontext.
Ich habe verschiedene Optionen ausprobiert, um die Funktion „unbeaufsichtigte Upgrades“
über ein „Benutzerdaten“-Skript für cloud-init
zu deaktivieren , aber alle sind bisher
gescheitert.
1. Deaktivieren Sie die systemd-Aufgabe
Systemaufgabe apt-daily.service
wird durch apt-daily.timer
ausgelöst . Ich habe versucht
das eine oder das andere, oder beides, mit verschiedenen Kombinationen der folgenden
Befehle zu deaktivieren; immer noch der apt-daily.service
wird gestartet, sobald die VM
bereit ist, SSH-Verbindungen zu akzeptieren::
#!/bin/bash
systemctl stop apt-daily.timer
systemctl disable apt-daily.timer
systemctl mask apt-daily.service
systemctl daemon-reload
2. Deaktivieren Sie die Konfigurationsoption APT::Periodic::Enable
Skript /usr/lib/apt/apt.systemd.daily
liest ein paar APT-Konfigurationsvariablen
; die Einstellung APT::Periodic::Enable
deaktiviert die Funktionalität
insgesamt (Zeile 331–337). Ich habe versucht, es mit dem folgenden
Skript zu deaktivieren::
#!/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
Allerdings trotz APT::Periodic::Enable
mit dem Wert von der Kommandozeile
(siehe unten), die unattended-upgrades
Programm läuft noch…
[email protected]:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Entfernen Sie /usr/lib/apt/apt.systemd.daily
insgesamt
Die folgende cloud-init
Skript entfernt das Skript für unbeaufsichtigte Upgrades
vollständig::
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
Trotzdem läuft die Aufgabe und ich kann sie in der Prozesstabelle sehen! obwohl die Datei
nicht existiert, wenn sie von der Befehlszeile aus geprüft wird::
[email protected]:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
Es sieht so aus, als ob die cloud-init
-Skript (zusammen mit der SSH-Befehlszeile)
und der Root-Systemd-Prozess werden in separaten Dateisystemen und
Prozessbereichen…
Fragen
Gibt es etwas offensichtliches, das ich vermisse? Oder gibt es irgendeine Namespace-Magie
von der ich nichts weiß?
Am wichtigsten:Wie kann ich den apt-daily.service
deaktivieren durch einecloud-init
Skript?
Akzeptierte Antwort:
Ja, da war etwas Offensichtliches, das mir gefehlt hat.
Bei Systemd dreht sich alles um den gleichzeitigen Start von Diensten, also cloud-init
Skript wird
gleichzeitig ausgeführt der apt-daily.service
ausgelöst wird. Zum Zeitpunkt cloud-init
erhält, um die vom Benutzer angegebene Payload auszuführen, apt-get update
läuft
bereits. Die Versuche 2. und 3. scheiterten also nicht an irgendeiner Namespace-Magie, sondern weil sie das System zu spät für apt.systemd.daily
geändert haben um
die Änderungen zu übernehmen.
Das bedeutet auch, dass es grundsätzlich keine Möglichkeit gibt, vorzubeugen apt.systemd.daily
vom Laufen – man kann es nur töten, nachdem es gestartet wurde.
Dieses „Benutzerdaten“-Skript nimmt diesen Weg::
#!/bin/bash
systemctl stop apt-daily.service
systemctl kill --kill-who=all apt-daily.service
# wait until `apt-get updated` has been killed
while ! (systemctl list-units --all apt-daily.service | egrep -q '(dead|failed)')
do
sleep 1;
done
# now proceed with own APT tasks
apt install -y python
Es gibt noch ein Zeitfenster, in dem SSH-Logins möglich sind, apt-get
wird nicht ausgeführt, aber ich kann mir keine andere Lösung vorstellen, die auf dem Stock
Ubuntu 16.04-Cloud-Image funktionieren kann.