Образ виртуальной машины сервера Ubuntu 16.04, по-видимому, запускает «apt-daily.service» каждые 12 часов или около того; эта служба выполняет различные задачи, связанные с APT, такие как обновление списка доступных пакетов, автоматическое обновление, если это необходимо, и т. д.
При запуске с «моментального снимка» виртуальной машины служба запускается немедленно , так как (я полагаю) systemd быстро понимает, что таймер должен был давно отключиться.
Однако работающий APT предотвращает запуск других apt
процессов, поскольку он удерживает блокировку /var/lib/dpkg
. Сообщение об ошибке, указывающее это выглядит так:
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?
Мне нужно отключить эту автоматическую задачу APT, пока Ansible не завершит настройку машины (которая обычно включает установку пакетов); см. https://github.com/gc3-uzh-ch/elasticluster/issues/304 для получения дополнительной информации и контекста.
Я пробовал различные варианты отключения функции «автоматических обновлений» с помощью сценария «пользовательские данные» cloud-init
, но все они до сих пор не сработали.
1. Отключите задачу systemd
Systemd задача apt-daily.service
запускается apt-daily.timer
. Я попытался отключить одну или другую, или обе, с различными сочетаниями следующих команд; Тем не менее, apt-daily.service
он запускается через несколько секунд после того, как виртуальная машина готова принять соединения SSH:
#!/bin/bash
systemctl stop apt-daily.timer
systemctl disable apt-daily.timer
systemctl mask apt-daily.service
systemctl daemon-reload
2. Отключить опцию конфигурации APT::Periodic::Enable
Скрипт /usr/lib/apt/apt.systemd.daily
читает несколько переменных конфигурации APT; настройка полностью APT::Periodic::Enable
отключает функциональность (строки 331--337). Я попытался отключить его с помощью следующего скрипта:
#!/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
Однако, несмотря на APT::Periodic::Enable
наличие значения 0
из командной строки (см. Ниже), unattended-upgrades
программа все еще выполняется ...
ubuntu@test:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Удалить /usr/lib/apt/apt.systemd.daily
вообще
Следующий cloud-init
скрипт полностью удаляет скрипт автоматического обновления:
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
Тем не менее, задача выполняется, и я вижу это в таблице процессов! хотя файл не существует, если проверено из командной строки ::
ubuntu@test:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
Похоже, что cloud-init
скрипт (вместе с командной строкой SSH) и корневой процесс systemd выполняются в отдельных файловых системах и пространствах процессов ...
Вопросов
Есть что-то очевидное, чего мне не хватает? Или происходит какое-то волшебство пространства имен, о котором я не знаю?
Самое главное: как я могу отключить apt-daily.service
сквозной
cloud-init
скрипт?
--now
флаг в systemctl disable
команде, чтобы изменения вступили в силу немедленно. Это была моя проблема.
disable --now
эквивалентно stop
последующему disable
.