Я подумываю о разработке проекта Yocto для проекта встроенного Linux (промышленного приложения), и у меня есть несколько вопросов для тех, кто имеет опыт работы со встроенным Linux в целом - Yocto получает бонус. Просто нужно понять, что обычно делается в обновлениях прошивки.
У меня есть несколько требований: аутентификация, безопасный протокол связи, какой-то откат в случае сбоя обновления. Кроме того, если есть способ постепенно выпускать патч для всего парка устройств, это также было бы интересно, поскольку я хочу избежать использования кирпичных устройств в полевых условиях.
Как сегодня вы развертываете обновления / исправления на полевых устройствах и сколько времени ушло на их разработку? Есть ли еще какие-то соображения, которые мне не хватает?
Вы можете посмотреть Yocto's Wiki, там есть раздел об обновлении:
Прежде чем думать о безопасных каналах связи и механизмах отката, я думаю, вам следует потратить некоторое время на следующие темы, которые станут гораздо более важными в долгосрочной перспективе:
Управление версиями: со временем вы получите разные версии встроенной платформы, не все с одинаковыми возможностями. Ваше устройство должно иметь возможность проверять, совместимо ли полученное обновление и может ли оно быть применено.
Планируйте способы обновления: вы не знаете, как ваша система будет выглядеть через 5 лет, но вы хотите, чтобы ваша сегодняшняя система могла поддерживать прошивку, которую вы еще собираетесь разработать. Такое обновление может потребовать нескольких шагов, которые следует задокументировать.
Не забывайте о переходе на более раннюю версию: через некоторое время вы внесете изменения, которые сделают невозможным переход на более раннюю версию. Как вы хотите справиться с ними?
Вот несколько идей для технических деталей:
Аутентификация и безопасный канал связи: пока ваше устройство имеет механизм проверки полученного обновления, точные свойства канала связи становятся менее важными. Эта проверка должна проверять, соответствуют ли данные последовательный и совместимый.
Откат: простой механизм может быть реализован с использованием двух разделов одинаковой длины для хранения всей ОС. Это хорошая идея, чтобы ОС работала только для чтения, а данные, которые могут изменяться, размещались в отдельном разделе.
Загрузчику нужен флаг загрузки, указывающий, с какого раздела загружаться. Он всегда будет пытаться сначала загрузиться с этого раздела и откатиться к другому разделу, если что-то не получится. Этот флаг загрузки может храниться в любом месте, к которому загрузчик имеет доступ.
Для обновления вашего устройства вы копируете новую систему (после того, как она будет проверена) в текущий неактивный раздел, меняете флаг загрузки и перезагружаетесь. В сценариях инициализации вашей системы вы проверяете, загрузилась ли она с ожидаемого раздела. Если этого не произошло, значит, что-то пошло не так, и вы можете принять соответствующие меры.