Как вы использовали Buildroot в DevOps-контексте?

Ответ

Я использовал Buildroot для создания минимальных, воспроизводимых и версионируемых образов Linux для встраиваемых устройств и контейнерных сред с особыми требованиями.

Контекст использования: Автоматизация сборки прошивок для fleet IoT-устройств (на базе ARM) и создание ultra-small базовых образов для Docker (FROM scratch) для специфичных Go-приложений.

1. Инфраструктура как код для сборки: Весь процесс сборки был описан как код. Основная конфигурация (defconfig) и кастомные патчи хранились в Git.

  • Структура репозитория:
    buildroot-iot-firmware/
    ├── board/company/device/  # Кастомные скрипты, патчи ядра, post-build скрипты
    │   ├── patches/linux/
    │   ├── post-build.sh
    │   └── rootfs-overlay/
    ├── configs/               # Готовые defconfig файлы для разных устройств
    │   └── device_rpi4_defconfig
    ├── external.desc
    ├── external.mk
    └── package/               # Кастомные пакеты, не входящие в Buildroot
        └── my-agent/
            ├── Config.in
            ├── my-agent.mk
            └── S99myagent

2. Интеграция в CI/CD пайплайн (GitLab CI):

build_firmware:
  stage: build
  image: debian:bookworm
  script:
    - apt-get update && apt-get install -y build-essential libncurses-dev
    - wget https://buildroot.org/downloads/buildroot-2023.02.tar.xz
    - tar xf buildroot-2023.02.tar.xz
    - cp configs/device_rpi4_defconfig buildroot-2023.02/.config
    - cd buildroot-2023.02
    - make BR2_EXTERNAL=../ board/company/device/linux-rebuild -j$(nproc)
    - make -j$(nproc)
  artifacts:
    paths:
      - buildroot-2023.02/output/images/sdcard.img

Пайплайн собирал образ, прогонял smoke-тесты на QEMU (если поддерживалось) и загружал артефакт в Nexus.

3. Ключевые практики и настройки:

  • Воспроизводимость: Фиксировал хэш коммита Buildroot и всех overlay-пакетов. Использовал BR2_DL_DIR для локального кеша (dl/) всех загружаемых исходников, чтобы сборка не зависела от внешних ресурсов.
  • Минимизация: Тщательно отключал в menuconfig все ненужные пакеты и опции ядра. Использовал musl вместо glibc для еще большего уменьшения размера.
  • Безопасность: В post-build скриптах удалял дефолтные пароли, отключал неиспользуемые сетевые службы и сервисы.
  • Управление конфигурацией: Использовал savedefconfig для генерации минимального defconfig из настроенного .config и коммитил его. Это позволяло легко видеть diff между версиями прошивки.

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

Ответ 18+ 🔞

Да ты посмотри, какая тема интересная! Buildroot — это ж, блядь, как конструктор для взрослых дядек, которые устали от этих ваших готовых дистрибутивов, где половину софта никогда не используешь, а он место жрёт, как не в себя.

Контекст, если по-простому: Нужно было собирать прошивки для кучи умных железок на ARM (термостаты, датчики, хуй пойми что ещё) и делать такие микроскопические образы для Docker, чтобы Go-приложения в них жили. Типа FROM scratch, только чтоб всё под контролем было, а не тянуть за собой целый Debian ради одного бинаря.

1. Всё по-взрослому, инфраструктура как код: Вся эта движуха с компиляцией была описана так, что любой новый чувак в команде мог просто клонить репу и не ебаться с вопросами «а где тут библиотеку для левой пятки доставить?». Всё лежало в Git: и настройки, и наши костыли-патчи.

  • Как это в папках выглядело:
    buildroot-iot-firmware/
    ├── board/company/device/  # Тут наши кривые ручки: скрипты, заплатки для ядра, всякая хуйня после сборки
    │   ├── patches/linux/     # Патчи, потому что вангуевое ядро иногда нихуя не работает как надо
    │   ├── post-build.sh      # Скрипт, который после сборки всё лишнее выпиливает
    │   └── rootfs-overlay/    # Наши файлы, которые просто кладутся поверх готовой системы
    ├── configs/               # Готовые конфиги под разные девайсы. Нажал одну кнопку — получил прошивку для конкретной железяки.
    │   └── device_rpi4_defconfig
    ├── external.desc          # Описание наших внешних пакетов
    ├── external.mk            # А это как их собирать
    └── package/               # А вот тут наши собственные пакеты, которых в Buildroot отродясь не было
        └── my-agent/          # Например, наш агент для сбора метрик
            ├── Config.in      # Описание для менюшки
            ├── my-agent.mk    # Инструкция по сборке
            └── S99myagent     # Скрипт, чтобы он запускался при старте

2. Запускаем в CI/CD (GitLab CI), чтобы руки не марать:

build_firmware:
  stage: build
  image: debian:bookworm
  script:
    - apt-get update && apt-get install -y build-essential libncurses-dev
    - wget https://buildroot.org/downloads/buildroot-2023.02.tar.xz
    - tar xf buildroot-2023.02.tar.xz
    - cp configs/device_rpi4_defconfig buildroot-2023.02/.config
    - cd buildroot-2023.02
    - make BR2_EXTERNAL=../ board/company/device/linux-rebuild -j$(nproc)
    - make -j$(nproc)
  artifacts:
    paths:
      - buildroot-2023.02/output/images/sdcard.img

Суть в чём: нажимаешь кнопку в гите — и через полчаса тебе готовый образ sdcard.img валяется в артефактах. Красота, ёпта! А ещё можно было на QEMU потестировать, если архитектура поддерживалась, прежде чем на реальное железо ливать.

3. Главные фишки, без которых нихуя не работает:

  • Воспроизводимость, мать её: Это святое. Я фиксировал конкретные версии всего: и самого Buildroot, и наших надстроек. А ещё была локальная папка dl/ — кеш всех исходников. Чтобы если какой-то китайский сайт с библиотеками ляжет, наша сборка не накрылась бы медным тазом. Доверия ебать ноль к интернету в момент сборки.
  • Ужимали всё до предела: Сидишь в menuconfig и выключаешь всё, что шевелится. Нужна консоль? Оставляем busybox. А этот gdb, perl и прочая мартышлюшка? Нахуй! Ставили musl вместо glibc — система ещё на пару мегабайт худее становилась.
  • Безопасность: В тех самых post-build скриптах выпиливали дефолтные учётки, убивали ненужные демоны. Чтобы на устройстве не оставалось открытых дверей для всяких пидарасов шерстяных.
  • Конфиги под контролем: Использовал make savedefconfig — он выплёвывает минимальный конфиг, только наши изменения. Этот файл коммитился в git. Приходит новый чувак, смотрит diff между версиями и сразу видит, что поменялось: «А, в этой версии добавили поддержку Wi-Fi модуля». Удобно, блядь!

Итог: Получился конвейер, который по тегу в гите штамповал готовый образ, заточенный под конкретную железяку. Ничего лишнего, всё своё. Для устройств, где каждый килобайт флешки на счету, — идеально. Ёперный театр, а не инструмент.