
Я настроил функцию unattended-upgrades на установку пакетов безопасности и уведомление по почте о каждом таком обновлении.
Я заметил, что установка происходит в очень случайное время. Я знаю, что в последних версиях добавлена случайная задержка до 30 минут, начиная с времени выполнения cron.daily.
Однако задержки, которые я испытываю, гораздо больше. Я вижу, что неконтролируемые обновления выполняются в 9 утра, 3 дня, 12 ночи... Журналы показывают то же самое, так что не только доставка электронной почты занимает больше времени.
Задача автоматического обновления является первой в cron.daily, что означает отсутствие предыдущей задачи с большим временем выполнения.
Кто-нибудь сталкивался с чем-то подобным?
решение1
После отладки я нашел решение.
Основная причина этой проблемы заключается в том, что в Ubuntu 16.04 и более поздних версиях unattended-upgrades использует systemd, а не cron, для планирования обновлений с огромной случайной задержкой:
/lib/systemd/system/apt-daily.timer
настроен с
OnCalendar=*-*-* 6,18:00
RandomizedDelaySec=12h
Это означает, что он будет запускаться дважды в день, в 6:00 и 18:00, со случайной задержкой до 12 часов. Поскольку это не всегда приемлемо для производственных сред, мне пришлось переопределить эти настройки.
Чтобы сохранить файлы конфигурации пакета нетронутыми, я определил свое переопределение в/etc/systemd/system/apt-daily.timer.d/override.conf
(Обновлять: пожалуйста, прочтите правку в конце этого ответа для получения дополнительной информации об имени файла и его местоположении, поскольку, по-видимому, они могут немного измениться).
Там я установил
[Timer]
OnCalendar=
OnCalendar=06:00
RandomizedDelaySec=1h
для запуска автоматических обновлений в 6:00 плюс случайная задержка до часа.
Затем я просто перезапустил таймер systemctl restart apt-daily.timer
(в конечном итоге пришлось перезагрузить демон).
Автоматические обновления теперь снова запускаются в предсказуемое время!
Редактировать: Похоже, что в Ubuntu 18.04 все немного изменилось. Переопределение теперь должно храниться в/etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
и выглядеть это будет так:
[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=1h
@PerlDuck упомянул способ создания файла переопределения с правильным именем и местоположением в комментарии ниже. Вместо того, чтобы вручную создавать файл, пожалуйста, рассмотрите возможность запускаsudo systemctl edit apt-daily.timer
решение2
Лучший способ обновить время автоматического обновления, который я собрал из разных источников и протестировал на нашей системе, — этоиспользуйте исключительно systemctl
командыи избегайте попыток найти нужные файлы для редактирования.
Единственное, что вам нужно знать наверняка, это название сервиса, которое в нашем случаеapt-daily-upgrade
(если не уверены, найдите его через $ systemctl | grep apt
). Когда у службы systemd определен таймер, он обозначается как #{service_name}.timer
, поэтому он apt-daily-upgrade.timer
для нас.
Так как конфигурация системы не подлежит редактированию, нам придетсяпереопределить конфигурацию таймера по умолчаниюв systemd. Для этого вам нужно скопировать-отредактировать некоторые части оригинального конфига, поэтому давайте сначала это покажем:
$ systemctl cat apt-daily-upgrade.timer
# /lib/systemd/system/apt-daily-upgrade.timer
[Unit]
Description=Daily apt upgrade and clean activities
After=apt-daily.timer
[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=12h
Persistent=true
[Install]
WantedBy=timers.target
Нам нужно обновить значения OnCalendar
и RandomizedDelaySec
в [Timer]
разделе. Давайте создадим файл конфигурации переопределения с помощью следующей команды:
$ systemctl edit apt-daily-upgrade.timer
Это должно открыть редактор с пустым файлом, и нам нужно поместить туда измененный [Timer]
раздел, как минимум:
[Timer]
# Reset the system calendar config first
OnCalendar=
# Set a new calendar timer with a 60 minute threshold
OnCalendar=*-*-* 21:00
RandomizedDelaySec=60m
Как вы видите, мы обновили OnCalendar
значение, чтобы автоматические обновления запускались вечером, а не утром. Пустая OnCalendar
строка над ним должна присутствовать какэто значение конфигурациидобавка, т. е. его можно указать более одного раза, и только установка его на пустое значение сбрасывает все предыдущие OnCalendar
значения (те, что из конфигурации системы).
После сохранения файла мы можем убедиться, что systemd знает о нем (запускать не нужно systemctl daemon-reload
, edit
команда сделает это за нас при выходе из редактора), выполнив команду systemctl
еще раз, как указано выше:
$ systemctl cat apt-daily-upgrade.timer
# /lib/systemd/system/apt-daily-upgrade.timer
[Unit]
Description=Daily apt upgrade and clean activities
After=apt-daily.timer
[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=12h
Persistent=true
[Install]
WantedBy=timers.target
# /etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
[Timer]
# Reset the system calendar config first
OnCalendar=
OnCalendar=*-*-* 21:00
RandomizedDelaySec=60m
Теперь он показывает две конфигурации, при этом наша пользовательская переопределяет конфигурацию по умолчанию. Хорошо!
Окончательную проверку того, что все работает так, как и ожидалось, можно выполнить с помощью list-timers
команды systemctl
:
$ systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
...
Thu 2020-08-06 21:51:36 UTC 12h left Thu 2020-08-06 07:10:20 UTC 2h 20min ago apt-daily-upgrade.timer apt-daily-upgrade.service
...
Найдите нужную строку в выходных данных и посмотрите на NEXT
столбец — значение в нем должно отражать время вашего недавно настроенного автоматического обновления.
решение3
Официальная документация Debian наhttps://wiki.debian.org/UnattendedUpgradesв настоящее время в нем есть ошибка, которая вводит в заблуждение многих людей. Он утверждает, что вы можете переопределить время обновления, создав файл с именем
/etc/systemd/system/apt-daily-upgrade.d/override.conf
Однако правильный путь -
/etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
решение4
Theapt-daily.таймернастроен на запуск дважды в день и не будет прерывать производственную среду, поскольку он просто обновляет и загружает пакеты, которые необходимо обновить. Вам нужно будет только переопределитьapt-daily-upgrade.таймерна время, которое с меньшей вероятностью повлияет на вашу производственную среду, поскольку это время фактической установки обновлений. Кроме того, есть настройка перезагрузки для вещей, которые требуют этого в 50unattended-upgrades, которую вы должны рассмотреть, чтобы она действительно была применена, и которая также имеет таймер. Кроме того, с 22.04 таймер обновления был изменен на 6 утра + 1 час по умолчанию, поэтому большинству не нужно будет менять это.