Obraz virtuálního počítače serveru Ubuntu 16.04 zjevně spouští „apt-daily.service“ každých
přibližně 12 hodin; tato služba provádí různé úkoly související s APT, jako je obnovování
seznamu dostupných balíčků, provádění bezobslužných aktualizací v případě potřeby atd.
Při spuštění ze „snímku“ virtuálního počítače se služba spustí okamžitě , jak (
předpokládám) systemd rychle uvědomí, že časovač měl už dávno zhasnout.
Spuštěný APT však brání ostatním apt
procesy se nespouštějí, protože má
zámek na /var/lib/dpkg
. Tato chybová zpráva vypadá takto:
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?
Potřebuji zakázat tuto automatizovanou úlohu APT, dokud Ansible
nedokončí nastavení stroje (které obvykle zahrnuje instalaci balíčků);
viz https://github.com/gc3-uzh-ch/elasticluster/issues/ 304 pro další informace a
kontext.
Vyzkoušel jsem různé možnosti, jak zakázat funkci „bezobslužných upgradů“
prostřednictvím skriptu „uživatelská data“ pro cloud-init
, ale všechny zatím
selhaly.
1. Zakázat úlohu systemd
systemd task apt-daily.service
se spouští pomocí apt-daily.timer
. Zkoušel jsem
zakázat jeden nebo druhý nebo oba pomocí různých kombinací následujících
příkazů; stále je to apt-daily.service
je spuštěno chvíli poté, co se virtuální počítač stane
připraveným přijímat připojení SSH::
#!/bin/bash
systemctl stop apt-daily.timer
systemctl disable apt-daily.timer
systemctl mask apt-daily.service
systemctl daemon-reload
2. Zakázat možnost konfigurace APT::Periodic::Enable
Skript /usr/lib/apt/apt.systemd.daily
přečte několik konfiguračních
proměnných APT; nastavení APT::Periodic::Enable
zcela zakáže funkci
(řádky 331–337). Zkusil jsem to zakázat pomocí následujícího skriptu
::
#!/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
Nicméně i přes APT::Periodic::Enable
s hodnotou z příkazového řádku
(viz níže), unattended-upgrades
program stále běží…
[email protected]:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Odeberte /usr/lib/apt/apt.systemd.daily
celkem
Následující cloud-init
skript zcela odstraní skript bezobslužných aktualizací
::
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
Přesto úloha běží a vidím ji v tabulce procesů! ačkoli soubor
neexistuje, pokud je testován z příkazového řádku::
[email protected]:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
Vypadá to jako cloud-init
skript (spolu s příkazovým řádkem SSH)
a proces root systemd se spouštějí v samostatných souborových systémech a procesních
prostorech…
Otázky
Je něco zjevného, co mi chybí? Nebo se děje nějaká magie jmenného prostoru
, o které nevím?
A co je nejdůležitější:jak mohu zakázat apt-daily.service
prostřednictvím cloud-init
skript?
Přijatá odpověď:
Ano, bylo něco zjevného, co mi chybělo.
Systemd je o souběžném spouštění služeb, takže cloud-init
skript je
spuštěn ve stejnou dobu apt-daily.service
je spuštěna. Do doby cloud-init
dostane ke spuštění uživatelem specifikovaného užitečného zatížení, apt-get update
již
běží. Takže pokusy 2. a 3. selhaly ne kvůli nějaké magii jmenného prostoru
, ale protože změnily systém příliš pozdě na apt.systemd.daily
k
vyzvednutí změn.
To také znamená, že v podstatě neexistuje žádný způsob, jak zabránit apt.systemd.daily
od běhu – člověk ho může zabít až poté, co začal.
Tento skript „uživatelských dat“ jde touto cestou::
#!/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
Stále existuje časové okno, během kterého je možné přihlášení SSH, ale apt-get
nepoběží, ale neumím si představit jiné řešení, které by fungovalo na cloudovém obrazu
Ubuntu 16.04.