Источник: ROSA Wiki · Лицензия: Creative Commons Attribution · Оригинал: https://wiki.rosa.ru/index.php/Rosa-offline-updates.html
Это независимое зеркало и не является официальным сайтом ROSA.
Jump to content

Rosa-offline-updates

rosa-offline-updates — пакет для автоматической установки обновлений ОС РОСА в офлайн-режиме с помощью плагина dnf offline-upgrade (DNF 4). Обновления скачиваются в фоновом режиме по расписанию, а устанавливаются при следующей загрузке системы — до запуска графического окружения.

Пакет не зависит от «Светофора» (rosa-update-system) и способен работать самостоятельно, но поддерживает взаимодействие с ним (см. раздел «Интеграция со „Светофором“»).

Какие задачи решает

Обычное (онлайн) обновление на рабочей станции (десктопе) имеет ряд проблем, которые rosa-offline-updates устраняет:

  • Обновление компонентов KDE может нарушить работоспособность графического окружения до его полного перезапуска.
  • Целостность и согласованность системы. Обновление устанавливается одной транзакцией до запуска пользовательского сеанса, когда файлы графического окружения ещё не заняты. После перезагрузки система гарантированно находится в согласованном состоянии.
  • Обновление не мешает работе пользователя. Установка пакетов не запускается в момент, когда пользователь работает в системе: не блокируется база RPM, не перезапускаются работающие приложения и службы, не тратятся ресурсы на распаковку пакетов в рабочее время. Скачивание выполняется с пониженным приоритетом (Nice=10, CPUSchedulingPolicy=idle, IOSchedulingClass=idle).
  • Снижение и распределение нагрузки на серверы репозиториев. Таймер срабатывает ежедневно в течение рабочего дня в случайный момент (задержка до 8 часов), чтобы нагрузка распределялась во времени. Кроме того, каждый пакет скачивается из сети только один раз.

Как это работает

  1. По расписанию systemd запускает rosa-offline-updates.service (юнит дожидается появления сети: After=network-online.target).
  2. Сервис вызывает /usr/sbin/rosa-offline-updates — bash-скрипт-обёртку, который:
    • защищается от параллельного запуска (flock на /run/rosa-offline-updates.lock);
    • проверяет наличие dnf и плагина offline-upgrade;
    • проверяет наличие свободного места (минимум 1 ГиБ в /var/lib/dnf/system-upgrade);
    • обрабатывает символическую ссылку (симлинк) /system-update: «свою» снимает, а если ссылка принадлежит другому инструменту (PackageKit/GNOME Software/Discover) — пропускает запуск, чтобы не мешать чужой офлайн-транзакции;
    • очищает предыдущее состояние (dnf offline-upgrade clean);
    • выполняет dnf offline-upgrade download; если обновлений нет — завершается;
    • выполняет DNF_SYSTEM_UPGRADE_NO_REBOOT=1 dnf offline-upgrade reboot: создаётся символическая ссылка /system-update, но система не перезагружается — момент перезагрузки выбирает пользователь.
  3. При следующем включении или перезагрузке компьютера systemd через system-update.target запускает dnf-system-upgrade.service, который выполняет подготовленную транзакцию из локального кэша. На экране загрузки (plymouth) отображается индикатор установки обновлений.
  4. После успешной установки плагин сам очищает кэш и автоматически перезагружает систему ещё раз — уже в обновлённую систему.

Всего происходит две перезагрузки, но только первая выполняется по инициативе пользователя. Для него весь процесс выглядит так: перезагрузка → экран «Starting offline upgrade» → установка → автоматическая перезагрузка → обычная загрузка обновлённой системы.

Кэш и состояние

Плагин offline-upgrade использует отдельный кэш /var/lib/dnf/system-upgrade, изолированный от общего /var/cache/dnf. В нём хранятся метаданные, скачанные пакеты и сохранённая транзакция (system-upgrade-transaction.json), а также состояние плагина (system-upgrade-state.json). Изоляция гарантирует, что dnf refresh, запущенный пользователем или «Светофором», не нарушит подготовленную транзакцию.

Установка

Установите пакет любым способом, например:

sudo dnf install rosa-offline-updates

Необходимые зависимости будут установлены автоматически:

  • dnf (тестировалось с dnf 4);
  • dnf-plugins-core (плагин system_upgrade с командой offline-upgrade);
  • systemd;
  • util-linux (утилита flock).

Состав пакета:

Файл Назначение
/usr/sbin/rosa-offline-updates bash-скрипт скачивания и планирования обновлений
/usr/lib/systemd/system/rosa-offline-updates.service юнит systemd (запускается только таймером)
/usr/lib/systemd/system/rosa-offline-updates.timer таймер systemd

Важно: после установки таймер отключён — автоматические обновления нужно включить отдельно (см. следующий раздел).

Для образов продуктов и систем, где фоновые обновления должны работать «из коробки», предназначен подпакет rosa-offline-updates-preset-enable: он добавляет в систему systemd preset, который включает таймер автоматически при установке основного пакета.

Включение автообновлений

Включите таймер:

sudo systemctl enable --now rosa-offline-updates.timer

Таймер срабатывает ежедневно в 09:00 (по местному времени) со случайной задержкой до 8 часов (RandomizedDelaySec=8h) — для распределения нагрузки на серверы репозиториев. Параметр Persistent=true означает, что если компьютер в момент срабатывания был выключен, проверка обновлений выполнится при первом включении.

Проверить состояние таймера:

systemctl status rosa-offline-updates.timer
systemctl list-timers rosa-offline-updates.timer

Запустить проверку и скачивание вручную, не дожидаясь таймера:

sudo systemctl start rosa-offline-updates.service

Просмотреть журнал:

journalctl -и 0 -u rosa-offline-updates.service

Проверить, что обновление запланировано (существует символическая ссылка /system-update → /var/lib/dnf/system-upgrade):

ls -l /system-update

Замечания:

  • Чтобы сервис действительно дожидался появления сети, при использовании NetworkManager должен быть включён NetworkManager-wait-online.service; без него After=network-online.target фактически не работает.
  • Скачивание выполняется и при питании от батареи: оно расходует мало энергии.
  • Экстренные обновления можно устанавливать вручную в любой момент, не дожидаясь таймера.

Отмена подготовленного обновления

Чтобы отменить запланированное офлайн-обновление и удалить скачанные пакеты, нужны две команды:

sudo dnf offline-upgrade clean
sudo rm -f /system-update

Первая команда сбрасывает состояние плагина и очищает кэш, но не удаляет символическую ссылку /system-update. Если ссылку оставить, при следующей загрузке система напрасно войдёт в режим обновления и завершит его с ошибкой (в журнале появится запись failed unit), а время загрузки будет потеряно. Поэтому ссылку нужно снять явно — второй командой. Отменить транзакцию с сохранением кэша штатными средствами плагина нельзя.

Интеграция со «Светофором» (rosa-update-system)

«Светофор» (rosa-update-system) — индикатор обновлений в системном лотке и графическая программа для установки пакетов. Сам по себе он работает онлайн: update_applet периодически выполняет dnf refresh и dnf check-update, а кнопка «Обновить» запускает dnf update.

Если бы пользователь запустил онлайн-обновление в тот момент, когда офлайн-транзакция уже скачана, те же пакеты скачивались и устанавливались бы повторно, а при следующей загрузке система напрасно входила бы в режим офлайн-обновления (экран «Starting offline upgrade», потеря времени при загрузке). Поэтому «Светофор» распознаёт состояния rosa-offline-updates: в этих состояниях он не запускает ни онлайн-проверку, ни онлайн-обновление, а вместо этого предлагает перезагрузку.

Определение состояния

«Светофор» не анализирует внутреннее состояние плагина, а опирается на файловые признаки (функция offline_upgrade_state()):

Состояние Признак Что означает
downloading существует файл /run/rosa-offline-updates.lock сейчас работает rosa-offline-updates — идёт скачивание или подготовка транзакции
ready символическая ссылка /system-update указывает на /var/lib/dnf/system-upgrade транзакция подготовлена и установится при следующей загрузке (срабатывает и для транзакций, подготовленных вручную командами dnf system-upgrade / dnf offline-upgrade reboot)
need_reboot в /run/update_trigger.code ненулевое значение система не перезагружена после онлайн-обновления системных пакетов (ядро и т. п.); штатный механизм «Светофора» — работу не блокирует
None признаков нет офлайн-обновления неактивны, обычный режим

Цель символической ссылки проверяется через readlink, чтобы не принять ссылку, созданную другим инструментом (PackageKit/GNOME Software/Discover), за свою: все они используют тот же механизм system-update.target. Файл блокировки закрывает промежуток между началом скачивания и созданием символической ссылки: в этот период «Светофор» не запускает параллельное онлайн-обновление.

Поведение апплета

При плановой проверке обновлений:

  • downloading — жёлтая иконка и всплывающая подсказка «Updates are being prepared in the background. Please wait.»; онлайн-проверка в этом цикле пропускается;
  • ready — жёлтая иконка и всплывающая подсказка «Updates are ready. Reboot to install them.»; уведомление «Updates are ready / Reboot to install the prepared updates.» с кнопкой «Get updates». Уведомление повторяется при каждой плановой проверке, пока обновление не будет установлено или отменено;
  • need_reboot — предупреждение о необходимости перезагрузки; работа продолжается в обычном режиме.

При нажатии кнопки «Получить обновления»:

  • ready — вместо главного окна открывается диалог «Updates are ready to install» с пояснением, что обновления уже скачаны и будут установлены при следующем включении компьютера, и тремя вариантами действий:
    • «Перезагрузить» — перезагрузка через D-Bus-интерфейс менеджера сеансов рабочего окружения (org.kde.LogoutPrompt/org.kde.ksmserver в Plasma, org.gnome.SessionManager в GNOME); если окружение не определено, выполняется отложенная на 30 секунд команда reboot с возможностью отмены;
    • «Отменить обновление» — отмена подготовленной транзакции (см. ниже);
    • закрытие окна (крестик) — оставить всё как есть;
  • downloading — информационный диалог «Updates are being prepared in the background. Please wait.»;
  • None / need_reboot — обычное главное окно со списком обновлений.

Отмена обновления из «Светофора»

Кнопка «Отменить обновление» запускает команду offline-clean: через pkexec выполняется привилегированный вспомогательный сценарий /usr/libexec/update_applet.helper.admin, который производит те же две операции, что и при отмене из консоли:

dnf offline-upgrade clean || true
rm -f /system-update

Действие выполняется в соответствии с политикой PolicyKit ru.rosalinux.update_applet_admin (auth_admin_keep — запрашивается пароль администратора и запоминается на некоторое время). Подпакеты rosa-update-system-nopass (все пользователи) и rosa-update-system-wheel (группа wheel) разрешают отмену без ввода пароля. Отдельная политика для перезагрузки не нужна: она выполняется от имени пользователя через D-Bus-интерфейс менеджера сеансов.

После успешной отмены в журнал апплета записывается «Prepared update cancelled», и сразу запускается повторная проверка обновлений — «Светофор» возвращается к обычному онлайн-режиму. Если отменить не удалось, выводится уведомление «Failed to cancel the prepared update».

Ограничения и особенности

  • После установки обновлений система автоматически перезагружается ещё раз — это штатное поведение плагина, отключить его нельзя.
  • На жёстких дисках (HDD) установка при загрузке может занимать заметное время (с учётом второй перезагрузки — «полторы» загрузки). Основной целевой сценарий — твердотельные накопители (SSD).
  • На машинах, которые подолгу не перезагружаются, пакеты скачиваются заново при каждом срабатывании таймера — это осознанная цена за актуальность транзакции.
  • Обновления публикуются в репозитории один раз в сутки, ночью, поэтому дневного интервала запуска таймера (с 09:00 до 17:00) для них достаточно; экстренные можно применять вручную в любое время.