Wiren Board и APT: обновление системы без интерактивных запросов dpkg
При обновлении Wiren Board команда apt upgrade может останавливаться из-за интерактивных запросов dpkg. В результате процесс обновления может прерваться и привести к проблемам в работе контроллера. В статье показано, как настроить APT в noninteractive режиме.
В Telegram-канале публикуем практические заметки по Home Assistant. Подпишитесь: @iot7m_ru. Есть задача — напишите: @iot7m_ru_support_bot, www.iot7m.ru или contact@iot7m.ru.
Введение
Контроллеры Wiren Board работают под управлением Linux и используют стандартную систему управления пакетами Debian — APT. Поэтому обновление системы выполняется привычными командами apt update и apt upgrade, как и на большинстве Debian-совместимых систем.
На первый взгляд всё выглядит просто: запускаем обновление, и система устанавливает новые версии пакетов. Однако на практике иногда возникает неприятная ситуация — процесс обновления останавливается и ждёт ответа пользователя. Причина в интерактивных запросах dpkg, которые появляются при обновлении пакетов с конфигурационными файлами.
Для пользовательских систем это может быть неудобством. Но для контроллеров и автоматизированных систем такая остановка обновления может привести к проблемам: процесс обновления прерывается, часть пакетов остаётся недонастроенной, а система может перейти в неработоспособное состояние (ошибка dpkg was interrupted).
Эта статья появилась после анализа инцидента, когда обновление системы было запущено на контроллере Wiren Board без контроля и процесс остановился на интерактивном вопросе dpkg. В результате обновление не завершилось, а часть сервисов контроллера перестала корректно работать.
В статье показывается, почему возникают такие ситуации и как настроить APT так, чтобы обновления не останавливались из-за интерактивных запросов. Вопросы управления процессом обновления контроллера выходят за рамки данной статьи.
Проблема: прерывания обновления Wiren Board
В Debian-системах APT отвечает за загрузку и управление пакетами, а непосредственной установкой и настройкой занимается dpkg. Именно dpkg обрабатывает конфигурационные файлы пакетов.
Если при обновлении пакет содержит новую версию конфигурационного файла, а текущий файл в системе уже был изменён, dpkg задаёт администратору вопрос. Типичный пример выглядит примерно так:
Configuration file '/etc/example.conf'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it?
В этот момент установка пакета приостанавливается и ждёт решения пользователя.
Если обновление выполняется в интерактивной консоли, администратор может выбрать один из вариантов: сохранить текущий файл, установить новый или сравнить версии. Но если обновление запускается автоматически — например из скрипта, системы автоматизации, SSH‑сессии без терминала или через cron — система остаётся ждать ответа, которого никто не даст.
В результате обновление может остановиться в неконсистентном состоянии: команда apt upgrade не завершается, часть пакетов остаётся в состоянии half-configured, некоторые службы уже обновлены, а другие продолжают работать со старыми версиями. В упрощённом виде это означает, что часть системы обновлена, часть — нет, и контроллер фактически оказывается в неработоспособном состоянии.
Если система уже оказалась в таком состоянии, для восстановления обычно требуется выполнить команду dpkg --configure -a.
Решение: noninteractive режим APT
Чтобы обновления не останавливались из-за интерактивных вопросов, можно настроить APT так, чтобы установка пакетов выполнялась в noninteractive режиме. Для этого создаётся файл /etc/apt/apt.conf.d/90noninteractive со следующим содержимым:
APT::Get::Assume-Yes "true";
Dpkg::Options {
"--force-confdef";
"--force-confold";
}
Эта конфигурация меняет поведение APT и dpkg во время обновления.
Назначение параметров:
APT::Get::Assume-Yes— автоматически подтверждает установку пакетов и отвечает Yes на вопросы APT.--force-confdef— использует действие по умолчанию при работе с конфигурационными файлами. Если файл не изменён — устанавливается новая версия.--force-confold— если конфигурационный файл был изменён локально, сохраняется текущая версия файла.
В результате dpkg больше не задаёт интерактивных вопросов и выбирает безопасное поведение автоматически. Эта настройка не гарантирует успешность обновления системы, но позволяет процессу обновления завершиться вместо остановки на интерактивном вопросе.
Проверка обновления Wiren Board
Проверить работу настройки можно на любом пакете, который не используется в системе. В нашем случае использовался knxd.
Сначала установите пакет, если он ещё не установлен. Затем выполните его понижение версии (downgrade) с помощью apt install <package>=<version>, после чего вручную измените один из конфигурационных файлов пакета.
Далее попробуйте выполнить обычное обновление системы. В стандартной конфигурации APT dpkg должен задать вопрос о том, что делать с изменённым конфигурационным файлом.
После этого настройте noninteractive режим APT, снова выполните downgrade того же пакета и повторите обновление. Если настройка выполнена корректно, обновление будет проходить без интерактивных вопросов dpkg.
Заключение
Интерактивные запросы dpkg — стандартный механизм Debian-систем, позволяющий администратору принимать решения при обновлении конфигурационных файлов. Однако в автоматизированных сценариях такие запросы могут останавливать процесс обновления и приводить систему в неконсистентное состояние.
Настройка APT в noninteractive режиме помогает снизить риск подобных ситуаций. Это не является панацеей и не гарантирует успешное обновление системы, но может уменьшить масштаб проблемы при случайно запущенном обновлении. В любом случае обновления контроллеров лучше выполнять управляемо и контролируемо — с предварительным тестированием и пониманием возможных последствий.
Полезные ссылки
- Документация dpkg — официальное описание утилиты
dpkg, включая параметры управления конфигурационными файлами, такие как--force-confdefи--force-confold.