LINUX.ORG.RU

Система для сборки прошивок для встройки

 , ,


1

3

Всех приветствую.

Хотел обсудить один вопрос. А именно система для сборки прошивок.

Есть много приборов где есть прошивка на базе линукса. У приборов есть архитектура проца (например 3 разных). Разные версии железа. Разный функционал. Есть варианты, когда один и тот же функционал может быть реализован на разном железе. А бывает что на одном железе делают разный функционал (да, это про fpga).

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

Как я себе это вижу.

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

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

Получается, что прошивка собирается из этих бинарных пакетов. Если надо что-то поменять в прошивке. Собираем новую версию какого-то пакета и потом заново прошивку.

Я не все потребности озвучил, но это пока самые главные.

Резюмирую немного главное:

  1. сборка из исходников с заданной версией, архитектурой, конфигом
  2. сборка из git репы, с заданным тегом, архитектурой, конфигом
  3. хранение в централизованном хранилище
  4. централизованное хранение конфигов для сборки прошивки из пакетов для железки и ее версии
  5. сборка любой версии прошивки в любой момент из пакетов

И вот теперь вопрос. А что в мире уже придумали на такой случай?

Что я уже видел-гуглил.

  • билдрут - простяцкая, быстрая, очень скудный функционал.
  • йокто - монструозная, нужно разбираться, но очень гибкая и в целом похоже то, что надо (концепция слоев, рецепты, метаданные и т.д.). Неясно насчет пакетирования и хранения.
★★★★★
Ответ на: комментарий от AlexVR

Но вопрос должен ставиться не как запихивание старых толчейнов и библиотек в buildroot или yocto.

К сожалению пока вопрос именно такой - «как запихать в…»

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

Комплект ПО и тулчейнов у меня уже намоленый и оттестированный. Именно поэтому я не готов перетрясать весь этот комплект чтобы он стал более похожий на то, что из коробки предоставляет buildroot или yocto (или что-то еще). В будущем, да, было бы неплохо все это привести к единым версиям всех компонентов и инструментарий должен этому способствовать. Но это следующий этап.

Я в целом понял, что все упомянутые системы позволяют сделать то, что мне надо (в том или ином виде). Сейчас я хочу понять насколько просто это можно сделать, как это поддерживать, удобно ли пользоваться. Но тут похоже, пока не попробуешь не поймешь. Буду пробовать. И на этом этапе бы пригодились полезные рецепты, чтобы не бежать марафон по граблям с самого начала.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от Jullyfish

Использовать или нет дело каждого. Лишь бы палки в колёса не совали.

AlexVR ★★★★★
()
Ответ на: комментарий от yax123

Это

Мне нужно все это аккуратно перенести из самопальной системы сборки в «стандартную».

и это

Комплект ПО и тулчейнов у меня уже намоленый и оттестированный.

Уже конфликтуют.

У buildroot уже проверенный временем SDK. Который обновляется от версии к версии.

buildroot – это простой инструмент для запуска минимального образа на устройстве. Он часто используется для запуска платы. Ему не надо кеширование сборки пакетов, т.к. образ маленький и его собрать не долго. Для СУЩЕСТВЕННОГО ускорения сборки, у него есть возможно предварительной сборки SDK.

Используя buildroot + BR2_EXTERNAL получаешь очень аккуратный способ описания сборки 150 прошивок в едином стиле с «наследованием».

Пытаться поменять компиляторы и базовые библиотеки в buildroot? Такого не видел. Видел закостянелые форки, которые можно собрать только в виртуалке с ОС 20-летней давности.

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

Хотеть можно многого. У Yocto аналогичное делается через sstate.

Но надо понимать что такое yocto.

Сейчас это три репы

  • bitbake – система сборки.
  • openembedded-core – минимальные слои для сборки.
  • meta-yocto – слои с дистрибутивом от yoctoproject.

На первых двух реально собрать мини-образ, без компонентов от yocto. И так некоторые делают.

Теоретически можно написать свой meta вместо openembedded-core и meta-yocto. Но это такой объём работы, что и года может не хватить.

чтобы не бежать марафон по граблям с самого начала.

Найдите версии buildroot или yocto/oe которые содержат близкие версии пакетов к вашим SDK. Ну не с нуля же они были сделаны.

Только надо понимать, что для сборки старых компиляторов, нужны старые версии ОС. Причём на столько старые, что только в VirtualBox их и можно запустить.

AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

А опиши, если не сложно, как выглядит работа для обычных разработчиков через сгенерированные SDK у вас. Я про ёкту.

pihter ★★★★★
()
Ответ на: комментарий от pihter
  • Для образа вызываешь задачу populate_sdk.
    • В полученном SDK и компиляторы, и библиотеки есть.
    • Из нюансов: приходилось пару dev пакетов добавлять в TOOLCHAIN_TARGET_TASK
  • Полученный файл устанавливается у разработчика.
  • А далее что-то в таком роде:
source /opt/poky-.../environment-setup-...
cmake ...
AlexVR ★★★★★
()
Ответ на: комментарий от yax123

Есть два принципиальных подхода:

  • Сборщик всего мира, а-ля buildroot и yocto: соберёт сначала компилятор+libc (тулчейн), затем ядро/загрузчик/обвязку, затем юзерспейс, всё из исходников, затем всё это выдаст в виде образа в необходимом формате, и вы получаете «дистрибутив» в изначальном смысле слова;
  • Сборщик образов существующего дистрибутива в определённом формате, ничего не компилирует: mkosi, packer, bootc

Первое — если у вас ембеддед-ембеддед (нетипичные архитектуры, нетипичные конфигурации, какой-нибудь NOMMU, требования по минимизации SBOM/памяти/компиляционным флагам обвязки, особый libc), и вам нужно контролировать всё.

Второе — если вам принципиально подходит пакетная база какого-то из существующих дистрибутивов (arm/risc-v/mips/whatever типичное ходовое, устраивают их сборочные флаги готовых библиотек) и вам нужно сфокусироваться на запуске вашего ПО — это экономит время и ресурсы на обновления и отслеживания уязвимостей, а ядро, загрузчик и своё ПО вы можете собрать отдельно и использовать как артефакт при сборке образа.

Я обычно всем рекомендую пакетную базу, пакетный менеджер и систему сборки пакетов Debian/Ubuntu, потому что она позволяет чрезвычайно легко кросс-компилировать на любой архитектуре под любую другую архитектуру, устанавливая пакеты и заголовочные файлы неродной архитектуры прямо из репозиториев, штатным образом (позволяет смешивать какое угодно количество архитектур на хосте, и готовые тулчейны подо всё), и не задумываться о настройке сборочной системы вообще, благодаря встроенным автоматизирующим врапперам для autoconf, cmake, qmake, meson, ninja, ant, perl/python, maven, gradle, bmake, golang, и наверняка другим системам.

Я у себя использую двустадийный mkosi: сначала собирается builder-образ на основе Debian, в котором кросс-компилируется необходимое ПО и выдаётся в виде .deb’ов, а затем собирается image-образ нужной архитектуры, в который устанавливается базовый комплект ОС и собственное ПО из .deb’ов, и выдаётся в виде готового образа (mkosi штатно поддерживает кучу разных output’ов).

mkosi поддерживает слои, но относительно простенькие. Ускоряет начальный bootstrap базового образа.

ValdikSS ★★★★★
()
Последнее исправление: ValdikSS (всего исправлений: 2)
Ответ на: комментарий от yax123

наверно я был не точен и надо было сказать, что «у меня есть много приборов (больше полутора сотен) где…»

Наверное, вам скорее нужна система дистрибьюции?

Обновления решаются специальным ПО, сделанным для обновления embedded-систем:

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

Часть их них чисто для «обновлений прошивки» с кучей удобных функций, чтобы ненароком не установить несовместимую версию для другого девайса, и т.п., а часть поддерживают также обновление ПО, т.е. разделяют «слой ОС» и «слой софта». Типа OSTree, который уже упоминали, но не всегда именно с подходом OSTree.

ValdikSS ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.