Рекомендуемые методы для безопасного обновления встроенного Linux - PullRequest
9 голосов
/ 13 ноября 2008

Встраиваемые устройства на базе Linux часто требуют механизма обновления приложений и системных файлов. Например, лабораторный прибор (не подключенный к сети) с USB-портом может получать обновления программного обеспечения с USB-накопителя.

Было бы просто запустить скрипт для копирования файлов во внутреннюю флэш-память устройства. Тем не менее, существует опасность, что устройство потеряет питание в середине обновления и закончится кирпичом.

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

Вещи лучше для файлов ядра и системы, поскольку они распределены по всей файловой системе.

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

Как вы подходите к этому требованию?

Ответы [ 5 ]

2 голосов
/ 01 декабря 2009

Как минимум два раздела. Я бы предложил 4

  • загрузка

  • альтернативная загрузка

  • резервное копирование данных программы

  • изменчивые данные программы

Используйте загрузочную загрузку grub для альтернативной загрузки в случае сбоя загрузки.

Так что, если обновление завершится неудачно, работает альтернатива.

НИКОГДА не обновляйте загрузчик.

Если раздел данных поджарен, переформатируйте и скопируйте резервный раздел данных.

Теперь вы не сможете выйти из строя, если не умрет флеш-диск. Если вы используете аппаратное обеспечение COTS, а основной диск, скажем, Compact Flash, вы можете иметь физически изолированную резервную копию, скажем, небольшого USB-ключа.

2 голосов
/ 13 ноября 2008

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

1 голос
/ 13 ноября 2008

Я бы применил тот же подход, что и к файлам приложения: Сделайте для критических файлов и завершите собственный раздел, сделайте ссылку на них и продублируйте раздел. Во всех ваших инициалах вы должны сначала проверить, все ли ссылки показывают на один и тот же раздел, если нет, сбросить их (на раздел с файлами с самой новой датой определенного файла). Если вы хотите обновить, просто скопируйте все в новый раздел, и если все в порядке (crcs ok), переберите файлы и установите для каждой ссылку из одной файловой системы в другую.

Таким образом, ваши критические файлы всегда должны быть в нормальном состоянии.

Сценарии

  1. Ошибка обновления при копировании файлов на новый раздел

    Нет проблем, потому что ссылки по-прежнему показывают старые рабочие.

  2. Не удается выполнить обновление при связывании

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

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

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

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

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

0 голосов
/ 02 января 2014

ИМХО любое обновление, которое не является атомарным, может сломать систему или сделать проверку на непротиворечивость довольно сложной. Я согласен с тем, что следует избегать обновления загрузчика, поскольку он не является безопасным для отключения питания. Как правило, производитель хочет обновить прошивку x.x.x до версии y.y.y, не беспокоясь о том, было ли обновлено ядро ​​и / или один файл. Обновление отдельных файлов может стать кошмаром для службы, потому что очень трудно понять, что работает на оборудовании клиента. Возможно, вы смешиваете подход двойного копирования (приложение избыточно) с подходом единственного копирования. Я думаю, что это не очень помогает, потому что целостность системы обеспечивается слабым компонентом в цепочке. Если происходит сбой обновления корневой файловой системы, не важно, что приложение дублируется.

Подход с двойным копированием может гарантировать обновление без отключения, если вам это нужно. Но это требует много ресурсов, потому что все компоненты должны быть продублированы. Лично я использую запасной подход, при котором запускаются небольшие rootfs в оперативной памяти в случае сбоя основного приложения или если последнее обновление не было успешным. Эта резервная система, автоматически запускаемая загрузчиком, если что-то пойдет не так, обновите систему с помощью USB-пера (если требуется локальное обновление).

Я никогда не находил проект OSS по этим вопросам, и недавно я начал новый, основываясь на моем предыдущем опыте. У меня запущено несколько продуктов, и мой клиент доволен этим.

Может быть, вы можете взглянуть на это. Вы можете найти источники для «swupdate» (название проекта) в github.com/sbabic/swupdate.

Stefano

...