Обновление без потери управления
Как изменять систему, не теряя её работоспособность?
Качество обновления проверяется при сбоях питания, связи и запуска. Успешная установка в штатных условиях составляет только часть этой проверки.
Обновление меняет не один файл. Вместе могут измениться код, формат данных, модель, драйвер и правила интерпретации команды. Возможность загрузить прежний раздел ещё не гарантирует, что прежняя программа прочитает уже изменённую базу.
Поэтому у обновления есть проверяемая совместимость и план возврата. Локальная доставка остаётся доступной без интернета. Для первого разработческого стенда и для готовой станции процедуры могут различаться, но обе должны оставлять понятное восстановление.
В Koobique обновляются системный образ, Rust-приложения, прошивки MCU, модели речи и мобильное приложение. У них разные зависимости и способы отката. Один общий номер «версия системы 1.0» не описывает совместимость всех компонентов.
Воспроизводимая сборка#
Для собственного кода фиксируются commit, toolchain, Cargo.lock, конфигурация функций и внешние SDK. Для моделей — источник, лицензия, хеш весов, квантование и runtime. Для плат — аппаратная ревизия и таблица контактов. Сборка, использующая latest из нескольких независимых проектов, плохо подходит для поиска регрессии.
Cargo vendor позволяет сохранить зависимости локально и подготовить более воспроизводимый офлайн-процесс. Однако этого недостаточно для всех системных библиотек и инструментов ESP-IDF: они также входят в манифест окружения. [94]
Обновление станции#
Первый разработческий стенд может обновлять приложение штатным пакетом с проверкой подписи и возможностью отката. Для самостоятельного appliance-профиля предпочтителен A/B-образ: новый раздел записывается отдельно, проверяется и загружается пробно. Выбранная инфраструктура должна учитывать загрузчик, данные и подтверждение успешной работы. [91]
Проверка здоровья включает не только факт запуска процесса: доступны конфигурация, БД, локальный API, сеть и критические системные ресурсы. Отсутствие одного спящего датчика не обязательно означает неудачный образ, поэтому health gate формулируется по классам зависимостей.
Обновление устройства#
Устройство проверяет подпись, аппаратную совместимость и целевой раздел. При пробной загрузке выполняет самопроверку и подтверждает образ только после минимального функционирования. ESP-IDF описывает OTA и rollback; конкретная таблица разделов и правила принятия являются частью прошивки Koobique. [36]
Перед обновлением Actuator переводится в режим обслуживания. Для лампы E0 установлен OFF; после reset или OTA-reboot действует BOOT_INHIBIT до явного освобождения. Сохранение уровня при потере только Wi-Fi не распространяется на reboot. Для будущей опасной нагрузки нужен отдельный профиль. Во время обновления приложение показывает ограниченную доступность и не ставит обычные команды в бесконечную очередь.
Подпись, хеш и ротация#
Хеш обнаруживает изменение относительно известного значения, но не отвечает, кто разрешил образ. Подпись и политика доверенных ключей решают авторизацию выпуска. Для метаданных, разделения ролей и ротации полезна модель TUF, но её внедрение должно учитывать автономную работу и восстановление доверенного времени. [84]
Откат после неудачного обновления и запрет возврата к уязвимой версии — разные требования. Нельзя включить anti-rollback так, что единственный рабочий старый образ навсегда заблокирован ещё до подтверждения нового. Нужна согласованная последовательность принятия.
Модели как исполняемые зависимости#
Новая speech-модель может изменить смысл распознанной фразы без изменения Rust-core. Поэтому она проходит тот же корпус команд и негативных примеров. Хранится предыдущая принятая модель, а установка не удаляет её до проверки. Большой файл не должен заполнять диск так, что сломается журнал управления.
Формат модели также является входом сложного runtime. Используются доверенные источники, хеши и изоляция процесса. Модель не получает автоматически доступ к сети, ключам и файловой системе пользователя.
Локальная доставка#
Обновление должно приниматься из локального файла через приложение или SSH. Интернет используется для удобного скачивания, но не для обязательной проверки лицензии перед запуском. Пакет содержит необходимые сведения о совместимости, чтобы станция могла отказать без обращения к внешнему серверу.
Полный offline-набор для первого экземпляра включает образ ОС, toolchain или инструкцию его воспроизводимого получения, зависимости, прошивки, модели, мобильную сборку и документацию. Нельзя назвать систему полностью автономной для восстановления, если единственный загрузчик скачивается с недоступного сайта во время аварии.
Матрица обновления#
Прервать загрузку файла, запись неактивного раздела, первую загрузку и подтверждение. Проверить неправильную подпись, не ту аппаратную ревизию и нехватку диска. Во всех случаях должен оставаться понятный путь к рабочей версии или локальному восстановлению.
Два слота без rollback — ещё не отказоустойчивое OTA#
В ESP-IDF требуется явно зафиксировать CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE и процедуру пробной загрузки. Приложение подтверждает пригодный образ через esp_ota_mark_app_valid_cancel_rollback только после self-test. Наличие ota_0 и ota_1 не включает механизм само по себе. В тест входят потеря питания при записи, невалидный образ, зависание пробной версии и возврат. [36]
Self-test E0: корректная привязка и чтение конфигурации, безопасный выход OFF, работа кнопки, запуск критических задач и совместимость данных. Интернет не требуется; бесконечное ожидание роутера не должно сделать каждое обновление неисправным. До reboot Actuator согласованно переводится в обслуживание; длительность недоступности кнопки показывается и измеряется.
Rollback и anti-rollback согласуются до записи необратимых параметров. Нельзя повысить нижнюю разрешённую security version так, что предыдущий единственный исправный образ перестанет загружаться до подтверждения нового. Данные владения, fencing и отзыва не должны возвращаться вместе с A/B-разделом. Если старая прошивка не умеет читать новую схему доверия, её возврат не объявляется пригодным.
Для автономного Hub выбран кандидат RAUC с интеграцией конкретного загрузчика, boot counting, health gate и отдельным /data. На H0 пока достаточно версионированного пакета приложения и отката в контролируемой среде; это не имитация готового A/B всей ОС. Сравнение SWUpdate/OSTree остаётся альтернативой, если выбранная плата не укладывается в исходный путь. [171]
Новая версия работает только с проверенной матрицей Core × MCU × app × schema × wire. Совместимость N/N−1 — цель испытаний, не обещание по номеру. Core N и N−1 могут оба поддерживать KQIP 0.2; старый учебный Hello0.1 не обязан поддерживаться. Обновление идёт через один узел-кандидат, наблюдение и затем остальные. Чанки bulk имеют offset, длину и контроль целого подписанного образа; resume относится к тому же хешу. При будущей несовместимой смене wire нужны negotiation/dual-profile стратегия и проверка поэтапного обновления без ослабления доверия.
В CI фиксируются toolchain/lockfiles/SDK, проверяются cargo-audit, cargo-deny, происхождение пакетов и SBOM. Положительный результат этих инструментов означает отсутствие найденных известных проблем по их базе, а не доказательство отсутствия уязвимостей. Изменение runtime модели также проходит проверку поведения. [172][173]