Подтвердить что ты не робот

Linux-based Firmware, как реализовать хороший способ обновления?

Я разрабатываю Linux-устройство, использующее alix 2d13.

Я разработал script, который заботится о создании файла изображения, создании разделов, установке загрузчика (syslinux), ядра и initrd и, который позаботится о том, чтобы файлы корневой файловой системы вправо раздел.

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

Я ищу способ обновления файловой системы, и я рассмотрел два решения:

  • обновление прошивки - это сжатый файл, который может содержать ядро, initrd и/или раздел rootfs, таким образом, при перезагрузке initrd позаботится о том, чтобы образ rootfs был в нужном разделе;
  • Обновление прошивки - это сжатый файл, который может содержать два архива tar, один для загрузки и один для корневой файловой системы.

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

Альтернативным решением может быть размещение списка файлов и добавление pre/post update script в архив tar, поэтому любой файл, который не находится в списке файлов, будет удален.

Как вы думаете?

4b9b3361

Ответ 1

Я использовал следующий подход. Это было несколько основано на документе "Построение встроенных систем Linux, совместимых с Murphy", доступных здесь. Я использовал материал version.conf, описанный в этой статье, а не материал cfgsh.

  • Использовать загрузочное ядро, чье задание состоит в обратном подключении к корневой файловой системе. Если вам нужно более новое ядро, тогда kexec в это новое ядро ​​сразу после его установки. Я решил поместить загрузочное ядро ​​в init init в initramfs вместе с busybox и kexec (оба статически связаны), а мой init был простой оболочкой script, которую я написал.
  • В файловой системе "OS image" существует одна или несколько корневых файловых систем "основной ОС" в виде файлов образа диска. Ядро загрузки выбирает один из них на основе файла version.conf. Я поддерживаю только два основных файла образа ОС: текущий и аварийный файлы. Если текущий сбой (подробнее об обнаружении сбоев позже), тогда загрузочное ядро ​​загружает спад. Если оба отказа или нет возврата, загрузочное ядро ​​предоставляет оболочку.
  • Конфигурация системы находится на отдельном разделе. Обычно это не обновляется, но нет причин, по которым это не могло быть.
  • Существует четыре полных раздела: загрузка, образ ОС, конфигурация и данные. Раздел данных предназначен для пользовательских приложений, предназначенных для частого письма. boot никогда не монтируется read/write. Изображение ОС - это только (повторно) смонтированное чтение/запись во время обновлений. config только монтируется чтение/запись, когда необходимо изменить конфигурацию (надеюсь, никогда). данные всегда установлены для чтения/записи.
  • Каждый файл образа диска содержит полную систему Linux, включая ядро, сценарии инициализации, пользовательские программы (например, busybox, приложения для продуктов) и конфигурацию по умолчанию, которая копируется в конфигурационный раздел при первой загрузке. Файлы имеют размер, необходимый для размещения в них всех. До тех пор, пока я достаточно места для роста, чтобы раздел образа ОС всегда был достаточно большим, чтобы соответствовать трем основным файлам образа ОС (во время обновления я не удаляю старый откат до тех пор, пока новый не будет извлечен), я могу чтобы основной образ ОС развивался по мере необходимости. Эти файлы изображений всегда (loop-back) устанавливаются только для чтения. Использование этих файлов также устраняет боль, связанную с сбоями в обновлении отдельных файлов внутри rootfs.
  • Модификации выполняются путем переноса самораспаковывающегося tarball на tmpfs. Начало этого script повторно устанавливает образ/запись образа ОС, затем извлекает новый основной образ ОС в файловую систему образа ОС, а затем обновляет файл version.conf(используя метод переименования, описанный в документе "murphy" ), После этого я коснусь файла штампа, указывающего, что произошло обновление, а затем перезагрузитесь.
  • Ядро загрузки ищет этот файл штампа. Если он найдет его, он переместит его в другой файл штампа, а затем загрузит новый файл образа ОС. Ожидается, что основной файл образа ОС удалит файл штампа при его успешном запуске. Если этого не произойдет, сторожевой таймер вызовет перезагрузку, а затем ядро ​​загрузки увидит это и обнаружит сбой.
  • Вы заметите, что во время обновления есть несколько возможных проблем: синхронизация версий .conf во время обновления и трогание/удаление файлов штампа (три экземпляра). Я не мог найти способ уменьшить их дальше и добиться всего, что хотел. Если у кого-то есть лучшее предложение, я бы хотел его услышать. Ошибки файловой системы или сбои питания при записи образа ОС также могут произойти, но я надеюсь, что файловая система ext3 предоставит вам шанс выжить в этом случае.

Ответ 2

У вас может быть отдельный раздел для обновления (Say Side1/Side2). Существующее ядро, rootfs находится в Side1, а затем добавляет обновление в Side2 и переключается. Благодаря этому вы можете уменьшить износ и увеличить срок службы, но устройство становится дороже.

Ответ 3

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