СофтХабрахабр

[Из песочницы] Buildroot — часть 1. Общие сведения, сборка минимальной системы, настройка через меню

Введение

Здесь будет практический опыт создания небольшой ОС с графическим интерфейсом и минимальным функционалом. В данной серии статей я хочу рассмотреть систему сборки дистрибутива buildroot и поделиться опытом её кастомизации.

Buildroot может собрать систему из набора пакетов, которые ему предложили. Прежде всего, не следует путать систему сборки и дистрибутив. Заменить пакет на другую версию, добавить свой пакет, поменять правила сборки пакета, кастомизировать файловую систему после установки всех пакетов? Buildroot построен на make-файлах и поэтому имеет огромные возможности по кастомизации. Всё это умеет buildroot.

В России buildroot используется, но на мой взгляд мало русскоязычной информации для новичков.

Целевая платформа — virtualbox. Цель работы — собрать дистрибутив с live-загрузкой, интерфейсом icewm и браузером.

Зачастую нужен ограниченный функционал при ограниченных ресурсах. Зачем собирать свой дистрибутив? Приспосабливать дистрибутив общего назначения, вычищая лишние пакеты и превращать его в прошивку путь более трудоёмкий, чем собрать новый дистриб. Ещё чаще в автоматизации нужно создавать прошивки. Использование Gentoo тоже имеет свои ограничения.

Она может лишь дать возможности и автоматизировать процесс сборки. Buildroot система очень мощная, но она ничего не сделает за вас.

Альтернативные системы сборки (yocto, open build system и прочие) не рассматриваются и не сравниваются.

Где взять и как начать

Здесь можно скачать актуальную версию и прочитать руководство. Сайт проекта — buildroot.org. Там же можно обратиться к сообществу, есть багтрекер, mail-lists и irc-канал.

Defconfig — это конфигурационный файл, хранящий в себе только опции, не имеющими значения по умолчанию. Buildroot оперирует defconfig’aми для целевой платы сборки. При этом можно отдельно настроить конфиги busybox, linux-kernel, uClibc, загрузчиков u-boot и barebox, но все они будут привязаны к целевой плате.
После распаковки скачанного архива или клонировании из git получаем готовый к работе buildroot. Именно он определяет, что и как будет собрано. Подробно о структуре каталогов можно прочитать в руководстве, расскажу о самых важных:

Это могут быть скрипты формирования образов системы(iso, sdcart, cpio и прочие), каталог overlay, конфиг ядер и прочее
configs — собственно defconfig платы. board — каталог с файлами, специфичными для каждой платы. В нем хранится только отличные от дефолтных настроек параметры
dl — каталог со скачанными исходными кодами/файлами для сборки
output/target — собранная файловая система полученной ОС. Defconfig — это неполная конфигурация платы. В дальнейшем из нее создаются образы для загрузки/установки
output/host — host-утилиты для сборки
output/build — собранные пакеты

Эта же система используется для сборки ядра linux. Конфигурирование сборки осуществляется через KConfig. Список самых часто используемых команд (выполнять в каталоге buildroot):

  • make menuconfig — вызвать настройку сборки. Так же можно с использование графического интерфейса (make nconfig,make xconfig,make gconfig)
  • make linux-menuconfig — вызвать конфигурацию ядра.
  • make clean — очистить результаты сборки (всё что храниться в output)
  • make — собрать систему. При этом не выполняется пересборка уже собранных процессов
  • make defconfig_name — переключить конфигурацию на определенный defconfig
  • make list-defconfigs — показать список defconfig’ов
  • make source — только скачать установочный файлы, без сборки.
  • make help — вывести список возможных команд

Важные замечания и полезные советы

Поэтому может создаться ситуация, когда потребуется полная пересборка. Buildroot не пересобирает уже собранные пакеты!

Можно пересобрать отдельный пакет командой make packagename-rebuild. Например, можно пересобрать ядро linux:

make linux-rebuild

Buildroot хранит состояние любого пакета созданием .stamp-файлов в каталоге output/build/$packagename:

Следовательно, можно пересобрать root-fs и образы без пересборки пакетов:

rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make

Полезные переменные

В buildroot есть набор переменных для удобного конфигурирования

  • $TOPDIR — корневой каталог buildroot
  • $BASEDIR — каталог OUTPUT
  • $HOST_DIR, $STAGING_DIR, $TARGET_DIR — каталоги сборки host fs, staging fs, target fs.
  • $BUILD_DIR — каталог c распакованными и собранными пакетами

Визуализация

Результаты в виде pdf файлов( на выбор есть svn,png) в каталоге output/graph. В buildroot есть возможность по визуализации.Можно построить схему зависимостей, график времени сборки, график размера пакетов в итоговой системе.

Примеры команд визуализации:

  • make graph-depends построить дерево зависимостей
  • make <pkg>-graph-depends построить дерево зависимостей конкретного пакета
  • BR2_GRAPH_OUT=png make graph-build построить график времени сборки с выводом в PNG
  • make graph-size построить график размера пакетов

Полезные скрипты

Например, там есть скрипт, проверяющий корректность описания пакетов. В каталоге buildroot есть подкаталог utils c полезными скриптами. В файле utils/readme.txt есть описание этих скриптов. Это может быть полезно при добавлении своих пакетов (я это сделаю позже).

Соберем cтоковый дистрибутив

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

Смотрим список конфигураций:

Переключаемся на конфиг qemu_x86_64_defconfig

make qemu_x86_64_defconfig

И запускаем сборку

make

Сборка завершается успешно, смотрим на результаты:

Buildroot собрал образы, которые можно запустить в Qemu и убедиться, что они работают.

qemu-system-x86_64 -kernel output/images/bzImage -hda \ output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S

Результат — запущенная в qemu система:

Создание конфигурации собственной платы

Добавление файлов платы

Смотрим список конфигураций:

Мы создадим свою плату, скопировав её с конфигурации: В списке видим pc_x86_64_efi_defconfig.

cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig

Сразу же создадим каталог платы для хранения своих скриптов, rootfs-overlay и прочих нужных файлов:

mkdir board/my_x86_board

Переключаемся на этот defconfig:

make my_x86_board_defconfig

Таким образом, теперь конфиг сборки (хранится в .config в корне каталога buildroot’а) соответствует целевой машине x86-64 legacy(bios) загрузкой.

Скопируем конфигурацию linux-kernel (пригодится в дальнейшем):

cp board/pc/linux.config board/my_x86_board/

Настройка параметров сборки через KConfig

Запускаем настройку:

make menuconfig

Есть возможность конфигурировать с графическим интерфейсом (make nconfig, make xconfig, make gconfig): Откроется окно KConfig.

Здесь можно выбрать целевую архитектуру, под которую будет вестись сборка. Входим в первый раздел Target Options.

Можно указать каталоги с исходными кодами, количество потоков сборки, зеркала для скачивания исходных кодов и прочие настройки. Build options — здесь есть различные настройки сборки. Оставим настройки по-умолчанию.

О нем подробнее. Toolchain – здесь настраивается сам инструментарий сборки.

Это может быть встроенный в buildroot или внешний тулчейн (можно указать каталог с уже собранным или url для скачивания). Toolchain type – тип используемого тулчейна. Например, для arm можно просто выбрать версию внешнего тулчейна Linaro. Для разных архитектур есть дополнительные опции.

От этого зависит работа всей системы. C library – выбор библиотеки С. Но она может оказаться слишком большой для встроенной системы, поэтому часто выбирают uClibc или musl. Обычно используется glibc, поддерживающая весь возможный функционал. Мы выберем glibc (в дальнейшем это потребуется для использования systemd).

Для kernel headers можно так же указать путь к тарболу или git-репозиторий. Kernel Headers и Custom Kernel Headers series – должно совпадать с версией ядра, которое будет в собираемой системе.

В дальнейшем нам это пригодится. GCC COMPILER VERSIONS – выбор версии компилятора, которая будет использована для сборки
Enable C++ support – выберем для сборки с поддержкой библиотек c++ в системе.

Нам без надобности пока что. Additional gcc options – можно задать дополнительные опции компилятора.

System configuration позволяет задать будущие параметры созданной системы:

Обратим внимание на следующие пункты:
Path to the users tables — таблица с создаваемыми пользователями (https://buildroot.org/downloads/manual/manual.html#makeuser-syntax). Большинство пунктов понятны из названия.

Будет создан пользователь user с паролем admin, автоматически gid/uid, /bin/sh шеллом, группой по-умолчанию user, член группы root, комментарием Foo user Пример файла.

[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt user -1 user -1 =admin /home/user /bin/sh root Foo user

Добавляет новые файлы и заменяет имеющиеся. Root filesystem overlay directories — каталог, накладываемый поверх собранной target-fs.

Сам скрипт пока оставим пустым Custom scripts to run before creating filesystem images — Скрипты, выполняемые непосредственно перед сворачиванием файловой системы в образы.

Перейдём в раздел Kernel

Само ядро конфигурируется через make linux-menuconfig.
Задать версию ядра можно по-разному: выбрать из предложенных, ввести версию вручную, указать репозиторий или готовый tarball. Здесь задаются настройки ядра.

Можно выбрать конфигурацию по-умолчанию для выбранной архитектуры или defocnfig из Linux. Kernel configuration — путь к конфигу ядра. НАйти нужный можно, глянув напрямую в исходники здесь. В исходниках Linux есть набор defconfig’ов для разных целевых систем. Например, для платы beagle bone black можно выбрать конфиг.

Пока оставим без изменений. Раздел Target packages позволяет выбрать, какие пакеты будут установлены в собираемую систему. Добавим iso-образ Позже мы добавим свои пакеты в этот список.
Filesystem images — список образов файловых систем, которые будут собраны.

Выберем isolinix Bootloaders — выбор собираемых загрузчиков.

Конфигурирование Systemd

Поэтому вынес его настройку в отдельный пункт. Systemd становится одним из столбов linux, наравне с kernel и glibc.

Здесь можно указать, какие службы systemd будут установлены и запущены при старте системы. Настраивается через make menuconfig, далее Target packages → System tools → systemd.

Сохранение конфигурации системы

Сохраняем этот конфиг через KConfig.

После чего сохраним наш defconfig:

make savedefconfig

Конфигурирование ядра Linux

Конфигурирование ядра linux вызывается следующей командой:

make linux-menuconfig

Добавим поддержку видеокарты Virtualbox

Добавим Virtualbox Guest integration support

ВАЖНО: конфигурация сохранится в output/build/linux-$version/config, но не в board/my_x86_board/linux.config Сохраняем и выходим.

Поэтому нужно вручную скопировать конфиг в место хранения:

cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config

Более правильный путь — сохранять defconfig ядра: Этой командой я копирую ПОЛНЫЙ конфиг ядра, что нужно не всегда.

linux-update-defconfig

buildroot не пересобирает уже собранное, то надо вручную указать пакеты для пересборки. После чего выполним полную пересборку всей системы.Т.к. Чтобы не терять время и нервы, небольшую систему проще пересобрать целиком):

make clean;make

2 и 6. По завершении сборки запускаем VirtualBox(проверялось на версии 5. 0) с загрузкой с cd-диска.Параметры системы:

Запуск с собранного iso:

Список использованных материалов

  1. Buildroot manual
Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»