Внедрение системы обновления / обновления для встроенных устройств Linux - PullRequest
49 голосов
/ 04 августа 2011

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

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

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

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

Требования:

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

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

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

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

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

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

Ответы [ 5 ]

32 голосов
/ 04 августа 2011

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

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

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

9 голосов
/ 30 декабря 2013

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

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

Стефано

2 голосов
/ 27 марта 2017

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

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

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

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

2 голосов
/ 05 августа 2016

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

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

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

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

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

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

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

0 голосов
/ 14 августа 2012

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

...