Отключение обновлений на Станции 1¶
Рецепт останавливает службу обновлений Алисы, если колонка с root по кругу пытается поставить обязательное обновление, а Алиса отвечает с ошибками.
Проверено на: Яндекс Станция 1 (tulip), прошивка 2.369.5.46, root через AliceBridge,
SSH (Dropbear) в /data/dropbear. На других моделях и прошивках не проверялось.
Колонка перестанет получать обновления и может потерять доступ к Алисе
Исправления ошибок и безопасности больше не придут. Если Яндекс перестанет обслуживать старую прошивку, Алиса может замолчать совсем.
Для моделей на Linux (Лайт, Мини и др.) обновления отключаются скриптом yandex-noupdate.sh
из шага 2. На Станции 1 (Android) он не подходит: рецепт ниже
только замораживает службу обновлений и ничего не меняет в /system.
Признаки¶
- В
/sensors_cache/logs/updatesd.logкаждые ~40 секунд повторяется одна и та же пара строк:Has update: version: ...иExecuting OTA script .... - На часть запросов Алиса не отвечает: подсветка переливается и гаснет. В
/sensors_cache/logs/maind.logпри этом видноonRequestError: ... error=ErrorDeviceNotReady, errorText=Настройте станцию заново. - Каждые ~30 секунд перезапускается локальный сервер на порту 1961: в
maind.logповторяетсяRestarting WS server due to new auth data. Приложения на телефоне не могут подключиться.
Шаги¶
-
Скопируйте
contrib/station1-freeze-updatesd.shна колонку (из клона репозитория): -
Проверьте синтаксис:
-
Добавьте запуск в
/data/dropbear/start.shсразу после строки#!/system/bin/sh: -
Перезагрузите колонку:
-
После загрузки убедитесь, что служба заморожена:
cat /data/dropbear/freeze.log for p in /proc/[0-9]*; do case "$(tr '\0' ' ' < $p/cmdline 2>/dev/null)" in maind\ --updatesd*|*/maind\ --updatesd*) grep State $p/status;; esac doneВ журнале должны появиться строки
freeze startedиfroze <pid>, а состояние процесса должно бытьT (stopped). Новогоupdatesd.logв этой загрузке не появляется.
Переустановка SSH перезаписывает start.sh
После переустановки SSH через AliceBridge шаг 3 нужно повторить.
Откат¶
-
Удалите строку с
freeze_updatesd.shиз/data/dropbear/start.sh: -
Перезагрузите колонку. Служба обновлений запустится как обычно.
Как это работает¶
- Службы Алисы запускает
quasar_launcher2по списку из/system/vendor/quasar/launch.json. Обновлениями занимается задачаupdatesd(maind --updatesd). Если её завершить, лаунчер перезапускает её. - AliceBridge подменяет
/system/vendor/quasar/device_ota_update.shзаглушкой, которая возвращаетexit 1. Если сервер требует обязательное обновление (при регистрации отвечает"hasCriticalUpdate":true),updatesdбесконечно повторяет проверку файла и запуск установки. Именно в это время Алиса отвечает с ошибками. - Сигнал
SIGSTOPоставляет процесс живым, но он ничего не делает. Лаунчер видит, что процесс есть, и не перезапускает его. - Шаблон в скрипте привязан к
argv[0](maind --updatesd*или*/maind --updatesd*). Это важно: по подстроке без привязки подSIGSTOPпопадает любой процесс, в чьей командной строке просто упоминаетсяmaind --updatesd— в том числе ваша же SSH-сессия, если выполнить в ней проверочную команду из шага 5. Тогда зависнет сессия, а не служба обновлений. - Скрипт работает в фоне и проверяет процессы раз в 3 секунды. Это нужно, потому что время запуска
start.shпосле загрузки меняется: наблюдалось и 28 секунд (раньшеupdatesd, который стартует примерно на 37-й секунде), и около 10 минут. - Подменить
launch.jsonчерезmount -o bindизstart.shнельзя: лаунчер читает его на ~34-й секунде загрузки, иstart.shможет запуститься позже. - Через системный
/system/bin/shфоновый скрипт после загрузки не оставался работать, а через/sbin/busybox shработает. Причина не выяснена; похоже на то, что mksh из Android при выходе рассылает сигналSIGHUPсвоей группе процессов, а busybox ash — нет (вывод, не проверялось). Именно поэтому в шаге 3 запуск идёт черезsetsidи с отсоединённым вводом-выводом: так процесс уходит в свою сессию и переживает выход родителя независимо от выбранной оболочки.
Ограничения¶
- Между загрузкой и запуском
start.shслужба обновлений успевает поработать. Еслиstart.shзапускается поздно, Алиса может ненадолго уйти в режим обновления. Поставить прошивку служба всё равно не может: установка заблокирована заглушкой AliceBridge. - Сервер Яндекса уже знает, что колонке нужно обновление. После остановки
updatesdАлиса отвечала нормально, но это проверено только на одной колонке, и поведение сервера может измениться.