Образ виртуальной машины сервера 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
.Ответы:
Да, было нечто очевидное, чего мне не хватало.
Systemd все о параллельном запуске услуг, поэтому
cloud-init
скрипт запускается одновременноapt-daily.service
срабатывает. К тому моменту, когдаcloud-init
исполняется заданная пользователем полезная нагрузка,apt-get update
она уже запущена. Таким образом, попытки 2. и 3. потерпели неудачу не из-за некоторой магии пространства имен, а потому, что они изменили систему слишком поздно, чтобыapt.systemd.daily
принять изменения.Это также означает, что в принципе нет способа предотвратить
apt.systemd.daily
запуск - его можно убить только после его запуска.Этот сценарий «пользовательских данных» использует этот маршрут:
Еще есть временное окно, в течение которого вход по SSH возможен, но не
apt-get
будет работать, но я не могу представить другого решения, которое может работать на стандартном облачном образе Ubuntu 16.04.источник
apt-get -o Acquire::http::AllowRedirect=false update
Примечание. К сожалению, часть решения, приведенного ниже , не работает в системах Ubuntu 16.04 (например, в вопроснике), поскольку предлагаемый
systemd-run
вызов работает только в Ubuntu 18.04 и выше (подробности см. В комментариях ). Я оставлю здесь ответ, потому что этот вопрос по-прежнему популярен, независимо от того, какую версию Ubuntu вы используете ...В Ubuntu 18.04 (и выше) может быть до двух служб, участвующих в обновлении / обновлении времени загрузки. Первый
apt-daily.service
обновляет список пакетов. Однако может быть второй,apt-daily-upgrade.service
который фактически устанавливает критические пакеты безопасности. Ответ на «Terminate и отключить / удалить без присмотра обновления , прежде чем команда возвращает» вопрос дает отличный пример того , как ждать , пока оба они до конца (скопированного здесь для удобства):(обратите внимание, это должно быть запущено от имени пользователя root). Если вы пытаетесь отключить эти службы в будущих загрузках, вам нужно замаскировать ОБА службы:
В качестве альтернативы вы можете использовать
systemctl disable
как службы, так и связанные с ними таймеры (т.е.apt-daily.timer
иapt-daily-upgrade.timer
).Обратите внимание, что методы маскирования / отключения в этом ответе только предотвращают обновление / обновление в будущих загрузках - они не остановят их, если они уже запущены в текущей загрузке.
источник
systemd-run
в Ubuntu 16.04 он слишком стар, чтобы поддерживать этот--wait
параметр, но в действительности он не должен быть необходим для этой цели. (Согласно справочной странице,--wait
ожидает завершения подразделения, но достаточно дождаться его запуска, что является поведением по умолчаниюsystemd-run
.)systemd-run
заклинание не работает на Ubuntu 16.04 вообще; он умирает с сообщением об ошибке Неизвестное назначение После = apt-daily.service apt-daily-upgrade.service . Похоже, что некоторые свойства объекта не были доступныsystemd-run
, см., Например, здесьВы можете отключить это через модуль «bootcmd» cloud-init. Он запускается до запуска сети, что необходимо, прежде чем apt update сможет запустить.
Как только вы войдете в экземпляр, вы также должны дождаться завершения финальных фаз cloud-init, поскольку он перемещает подходящие источники / списки.
Это также полезно, чтобы увидеть, как рано запускается bootcmd:
Вы можете убедиться, что это работает следующим образом:
источник
Не будет легче замаскировать устройство
?
источник
ls -al /etc/systemd/system/ | grep alsa lrwxrwxrwx 1 root root 9 Sep 1 13:17 alsa-init.service -> /dev/null
Данные пусты.sudo dpkg-reconfigure -plow unattended-upgrades
и запрещаю его. Так что статус модуля apt-daily.service мертв.apt-daily.service
изcloud-init
сценария и до его запуска после перезагрузки виртуальной машины: это означает: (1) это должно быть сделано не в интерактивном режиме, (2) это должно быть сделано доapt-daily.service
первого запуска. (Если мое понимание Systemd правильно, (2) не может фактически быть выполнена , какcloud-init
иapt-daily
работать одновременно - видеть мой собственный ответ для больше.)Это ждет 1сек в цикле и проверяет, снята ли блокировка.
источник