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 часов), чтобы нагрузка распределялась во времени. Кроме того, каждый пакет скачивается из сети только один раз.
Как это работает
- По расписанию
systemdзапускаетrosa-offline-updates.service(юнит дожидается появления сети:After=network-online.target). - Сервис вызывает
/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, но система не перезагружается — момент перезагрузки выбирает пользователь.
- защищается от параллельного запуска (
- При следующем включении или перезагрузке компьютера
systemdчерезsystem-update.targetзапускаетdnf-system-upgrade.service, который выполняет подготовленную транзакцию из локального кэша. На экране загрузки (plymouth) отображается индикатор установки обновлений. - После успешной установки плагин сам очищает кэш и автоматически перезагружает систему ещё раз — уже в обновлённую систему.
Всего происходит две перезагрузки, но только первая выполняется по инициативе пользователя. Для него весь процесс выглядит так: перезагрузка → экран «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с возможностью отмены; - «Отменить обновление» — отмена подготовленной транзакции (см. ниже);
- закрытие окна (крестик) — оставить всё как есть;
- «Перезагрузить» — перезагрузка через D-Bus-интерфейс менеджера сеансов рабочего окружения (
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) для них достаточно; экстренные можно применять вручную в любое время.