Внедрение системы обновления / обновления для встроенных устройств Linux

У меня есть приложение, которое работает на встроенном устройстве Linux, и время от времени вносятся изменения в программное обеспечение, а иногда и в корневую файловую систему или даже в установленное ядро.

В текущей системе обновлений содержимое старого каталога приложения просто удаляется, а новые файлы копируются поверх него. После внесения изменений в корневую файловую систему новые файлы доставляются как часть обновления и просто копируются поверх старых.

Теперь у текущего подхода есть несколько проблем, и я ищу способы улучшить ситуацию:

  • Корневая файловая система цели, которая используется для создания образов файловой системы, не имеет версий (я не думаю, что у нас даже есть оригинальные rootfs).
  • Файлы rootfs, которые входят в обновление, выбираются вручную (вместо diff)
  • Обновление постоянно растет, и это становится лавашем. Теперь существует разделение между обновлением и обновлением, когда обновление содержит более крупные изменения rootfs.
  • У меня сложилось впечатление, что проверки согласованности в обновлении довольно хрупкие, если они вообще реализованы.

Требования:

  • Пакет обновления приложения не должен быть слишком большим, а также должен иметь возможность изменять корневую файловую систему в случае внесения изменений.
  • Обновление может быть намного больше и содержать только то, что входит в корневую файловую систему (например, новые библиотеки, ядро ​​и т. Д.). Для обновления может потребоваться установка обновления.
    Может ли обновление содержать всю корневую файловую систему и просто выполнить dd на флэш-накопителе целевого объекта?
  • Создание пакетов обновлений / обновлений должно быть как можно более автоматическим.

Мне абсолютно необходим способ управления версиями корневой файловой системы. Это должно быть сделано таким образом, чтобы я мог вычислить из него какой-то diff, который можно использовать для обновления rootfs целевого устройства.

Я уже изучал Subversion, поскольку мы используем его для нашего исходного кода, но это не подходит для корневой файловой системы Linux (права доступа к файлам, специальные файлы и т. Д.).

Теперь я создал несколько сценариев оболочки, которые могут дать мне что-то похожее на svn diff, но мне очень хотелось бы знать, существует ли уже работающее и протестированное решение для этого.

Я полагаю, что при использовании таких diff Upgrade просто станет пакетом, содержащим инкрементные обновления, основанные на известном состоянии корневой файловой системы.

Что вы думаете и думаете по этому поводу? Как бы вы внедрили такую ​​систему? Я предпочитаю простое решение, которое можно реализовать в кратчайшие сроки.


person trenki    schedule 04.08.2011    source источник
comment
Хороший вопрос +1 с моей стороны   -  person user1089679    schedule 23.02.2012
comment
Вы достигли этой цели? Потому что я хочу кое-что узнать на вашей стороне, не могли бы вы помочь мне в моем вопросе   -  person user1089679    schedule 23.02.2012


Ответы (5)


Я считаю, что вы ошибаетесь в проблеме - любое обновление, которое не является атомарным (например, dd образ файловой системы, замена файлов в каталоге), нарушается по дизайну - если питание отключается в середине обновления, система является кирпич и для встроенной системы, питание может отключиться во время обновления.

Я написал технический документ о том, как правильно выполнять обновление / обновление на встроенных системах Linux [1]. Он был представлен на OLS. Вы можете найти этот документ здесь: https://www.kernel.org/doc/ols/2005/ols2005v1-pages-21-36.pdf

[1] Бен-Йосеф, Гилад. «Создание совместимых с Мерфи встраиваемых систем Linux». Симпозиум по Linux. 2005 г.

person gby    schedule 04.08.2011
comment
Большое спасибо за эту статью, я прочту ее как можно скорее. Я знаю, что неатомарное обновление на самом деле сломано, но оно все равно будет лучше, чем текущая ситуация, когда не выполняется никаких проверок согласованности, а только извлекается tarbal. И мне все еще нужен способ версии rootfs. - person trenki; 04.08.2011
comment
См. Мой ответ на этот вопрос: stackoverflow.com/questions/5167226/ Это основано на статье gby, поэтому я включаю это в качестве комментария. @gby Приятно видеть вас на SO. Буду очень признателен за ваши комментарии к моему указанному ответу относительно использования файлов штампов для обнаружения сбоев обновления. - person Patrick; 19.08.2013
comment
ссылка на бумагу не работает, не могли бы вы обновить? - person mans; 25.11.2014
comment
Ссылка больше не работает, хотя есть предупреждение о сертификате от браузера. - person Tryum; 29.01.2015
comment
Не могли бы вы исправить ссылку, чтобы избежать предупреждения о сертификате? - person Craig McQueen; 21.04.2015
comment
@CraigMcQueen Извини, нет. Похоже, это неправильная конфигурация на сервере, которая не находится под моим контролем. - person gby; 21.04.2015
comment
Было бы здорово, если бы ваш ответ охватывал основные моменты вашей статьи, на случай, если ссылка станет неработающей или труднодоступной. - person Craig McQueen; 22.04.2015
comment
Я получаю сообщение 403 Forbidden You don't have permission to access /OLS/Reprints-2005/ben-yossef-Reprint.pdf on this server. Может ли кто-нибудь, имеющий доступ к ссылке, предоставить здесь сводку по SO, поскольку ссылка ненадежна? - person E-rich; 23.07.2015
comment
Наткнулся на этот PDF-файл (kernel.org/doc/ols /2005/ols2005v1-pages-21-36.pdf) Бена Йосефа и не уверен, совпадает ли он с тем, что написано в этом посте. - person E-rich; 23.07.2015

Я абсолютно согласен с тем, что обновление должно быть атомарным - я недавно начал проект с открытым исходным кодом с целью предоставить безопасный и гибкий способ управления программным обеспечением как с локальным, так и с удаленным обновлением. Я знаю, что мой ответ приходит очень поздно, но, возможно, он может помочь вам в следующих проектах.

Вы можете найти источники для swupdate (название проекта) на github.com/sbabic/swupdate.

Стефано

person sbabic    schedule 30.12.2013

В настоящее время растет довольно много встроенных инструментов обновления Linux с открытым исходным кодом, каждый из которых имеет разную направленность.

Еще один, о котором стоит упомянуть, - это RAUC, который ориентирован на безопасную и атомарную установку подписанных пакетов обновлений на вашу цель, пока быть действительно гибким в том, как вы адаптируете его к своему приложению и среде. Исходники находятся на GitHub: https://github.com/rauc/rauc.

В общем, хороший обзор и сравнение текущих решений по обновлению, которые вы можете найти на странице Yocto Project Wiki об обновлениях системы:

https://wiki.yoctoproject.org/wiki/System_Update

person ejoerns    schedule 27.03.2017

Атомарность критически важна для встраиваемых устройств, одна из отмеченных причин - потеря мощности; но могут быть и другие проблемы, такие как проблемы с оборудованием / сетью.

Возможно, атомарность понимают неправильно; это определение, которое я использую в контексте обновлений:

  • Обновление всегда либо завершается полностью, либо не выполняется вовсе
  • Ни один программный компонент, кроме программы обновления, никогда не видит наполовину установленное обновление

Полное обновление образа с двойной компоновкой разделов A / B - самый простой и проверенный способ добиться этого.

Для Embedded Linux существует несколько программных компонентов, которые вы, возможно, захотите обновить, и различные варианты дизайна на выбор; более новый документ по этому поводу доступен здесь: https://mender.io/resources/Software%20Updates.pdf

Файл перемещен по адресу: https://mender.io/resources/guides-and-whitepapers/_resources/Software%2520Updates.pdf

Если вы работаете с Yocto Project, вас может заинтересовать Mender.io - проект с открытым исходным кодом, над которым я работаю. . Он состоит из клиента и сервера, и его цель состоит в том, чтобы значительно ускорить и упростить интеграцию средства обновления в существующую среду; без необходимости слишком много переделывать или тратить время на нестандартное / собственное кодирование. Это также позволит вам централизованно управлять обновлениями с сервера.

person rduio    schedule 04.08.2016

Вы можете записать обновление и разделить флэш-память обновления на два слота. Сбой питания всегда возвращает вас в текущий исполняемый слот. Последний шаг - изменить значение журнала. Не атомарно и невозможно сделать его кирпичом. Даже если не удается на момент написания журнала помечает. Атомарного обновления не существует. Всегда. Никогда в жизни такого не видел. Iphone, adroid, мой сетевой коммутатор - ни один из них не атомарный. Если у вас недостаточно места для такого дизайна, исправьте его.

person MaxDeusPhallus    schedule 14.08.2012
comment
Ваше использование термина атомарный кажется сбивающим с толку. - person Craig McQueen; 21.04.2015