Пока устройство выпущено в количестве одного-двух, трех десятков, кажется, что легче обновлять систему “по старинке”: залить файл по SSH, заменить бинарник через rsync, прогнать скрипт после перезагрузки, а если что-то пойдёт не так — поправить вручную силами уважаемых инженеров встраиваемого ПО (Приветствуем!).
Знакомо? Безусловно.
Но как только таких устройств становится много, такой подход начинает разваливаться: плохо масштабируется, плохо контролируется и слишком легко приводит к поломанным устройствам, уже находящимся в эксплуатации.
Типичные проблемы:
Оборвалась связь в середине передачи, питание пропало во время записи, образ оказался повреждён, а старая версия уже частично затёрта. Что теперь?
"Кирпич" вместо устройства и ущерб репутации!
Ещё хуже то, что такие схемы почти всегда слабо защищены. В них часто нет нормальной проверки подписи, контроля целостности и доверенной загрузки. Это значит, что обновление может быть не только нестабильным, но и небезопасным. Аппарат с кофе, или инфокиоск в ТЦ еще перенесет. А вот для промышленных, медицинских и автомобильных систем это уже серьёзная архитектурная ошибка.
Есть и операционная сторона проблемы. Ручные сценарии плохо повторяются, зависят от конкретного инженера, трудно документируются и почти не интегрируются в нормальный CI/CD-процесс. Поддерживать разные аппаратные ревизии, разные загрузчики, разные разметки памяти и разные сценарии отката становится всё сложнее. То, что выглядело как быстрый путь, довольно быстро превращается в долгий и дорогой техдолг.
Поэтому обновление embedded-систем давно перестало быть второстепенной задачей. Это часть самой архитектуры продукта, продумывается она на стадии дизайна. Если механизм обновления не атомарный, не проверяет целостность и не умеет безопасно откатываться, он не подходит для масштабируемого устройства в реальном мире.
Много букв, но мы так хотим подвести к RAUC и альтернативам, и в каких случаях лучше выбрать готовый фреймворк, а не писать свой механизм с нуля.
Делитесь вашими мыслями и опытом в комментариях, уважаемые ☕️
