Зображення VM сервера Ubuntu 16.04, очевидно, запускає "apt-daily.service" кожні 12 годин або близько того; ця служба виконує різні завдання, пов’язані з APT, такі як оновлення списку доступних пакетів, виконання необхідних оновлень при необхідності тощо.
Починаючи з "знімку" VM, послуга запускається негайно , оскільки (я вважаю) 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/isissue/304 для отримання додаткової інформації та контексту.
Я спробував різні варіанти відключення функції "без нагляду оновлень" за допомогою сценарію "користувацькі дані" для cloud-init
, але всі вони поки не вдалися.
1. Вимкніть системну задачу
завдання системи apt-daily.service
спрацьовує apt-daily.timer
. Я намагався відключити одну чи іншу чи обидві різні комбінації наступних команд; все-таки apt-daily.service
розпочаті моменти після того, як VM готова прийняти 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) та кореневий системний процес виконуються в окремих файлових системах та процесному просторі ...
Запитання
Щось явне я пропускаю? Або відбувається якась магія простору імен, про яку я не знаю?
Найголовніше: як я можу відключити скрипт apt-daily.service
через
cloud-init
?
--now
прапора в systemctl disable
команді, щоб негайно зробити зміни ефективними. Це було моє питання.
disable --now
еквівалентно stop
наступному disable
.