Как отключить «apt-daily.service» на изображении виртуальной виртуальной машины Ubuntu?

UBuntu 16.04 сервер VM образ, видимо, запускает «apt-daily.service» каждые 12 часов или около того; эта служба выполняет различные задачи, связанные с APT, такие как обновление списка доступных пакетов, при необходимости автоматическое обновление и т. д.

Когда вы начинаете с моментального снимка виртуальной машины, служба запускается немедленно , поскольку (я полагаю) systemd быстро реализует, что таймер должен был уйти давным-давно.

Однако работающий APT предотвращает запуск других apt процессов, поскольку он содержит блокировку в /var/lib/dpkg . Мне нужно отключить эту автоматическую задачу APT до тех пор, пока Ansible не завершит настройку машины (что обычно связано с установкой пакетов); см. https://github.com/gc3-uzh-ch/elasticluster/issues/304 для получения дополнительной информации и контекста.

Я попробовал различные опции, чтобы отключить функцию «автоматических обновлений» с помощью сценария «пользовательских данных» для cloud-init , но пока все они не сработали.

1. Отключите задачу systemd

Задача systemd apt-daily.service запускается apt-daily.timer . Я попытался отключить тот или другой, или оба, с различными cobinations следующих команд; apt-daily.service менее 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

Script /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) и процесс root systemd выполняются в отдельных файловых системах и пространствах процессов …

Вопросов

Есть ли что-то очевидное, что мне не хватает? Или есть какая-то магия пространства имен, о которой я не знаю?

Самое главное: как отключить apt-daily.service через сценарий cloud-init ?

Да, было что-то очевидное, что я отсутствовал.

Systemd – все о параллельном запуске сервисов, поэтому сценарий cloud-init запускается одновременно с apt-daily.service . К тому времени, когда cloud-init получит выполнение пользовательской полезной нагрузки, apt-get update уже запущено. Таким образом, попытки 2. и 3. потерпели неудачу не из-за некоторой магии пространства имен, а потому, что они слишком поздно изменили систему для apt.systemd.daily чтобы выбрать изменения.

Это также означает, что в принципе невозможно предотвратить apt.systemd.daily – его можно убить только после его запуска.

Этот скрипт «пользовательских данных» выполняет этот маршрут ::

 #!/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 | fgrep -q dead) do sleep 1; done # now proceed with own APT tasks apt install -y python 

Существует еще временное окно, в течение которого SSH-логины возможны, но apt-get не будет работать, но я не могу представить себе другое решение, которое может работать с облачным изображением Ubuntu 16.04.

Woudn't не будет легче маскировать блок

 systemctl mask apt-daily.service 

?