Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Запровадження

У цій серії статей я хочу розглянути систему складання дистрибутива buildroot і поділитися досвідом її кастомізації. Тут буде практичний досвід створення невеликої ОС з графічним інтерфейсом та мінімальним функціоналом.

Насамперед, не слід плутати систему складання та дистрибутив. Buildroot може зібрати систему із набору пакетів, які йому запропонували. Buildroot побудований на make-файлах і тому має величезні можливості кастомізації. Замінити пакет на іншу версію, додати свій пакет, змінити правила збирання пакета, кастомізувати файлову систему після встановлення всіх пакетів? Все це вміє buildroot.

У Росії будовадроту використовується, але на мій погляд мало російськомовної інформації для новачків.

Мета роботи – зібрати дистрибутив із live-завантаженням, інтерфейсом icewm та браузером. Цільова платформа - virtualbox.

Навіщо збирати свій дистрибутив? Найчастіше потрібний обмежений функціонал при обмежених ресурсах. Ще частіше в автоматизації потрібно створювати прошивки. Пристосовувати дистрибутив загального призначення, вичищаючи зайві пакети і перетворювати його на прошивку шлях трудомісткіший, ніж зібрати новий дистрибутив. Використання Gentoo теж має обмеження.

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

Альтернативні системи складання (yocto, open build system та інші) не розглядаються і не порівнюються.

Де взяти та як почати

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

Buildroot оперує defconfig'ами для цільової плати складання. Defconfig — це конфігураційний файл, що містить у собі лише опції, які не мають значення за умовчанням. Саме він визначає, що та як буде зібрано. При цьому можна окремо налаштувати конфіги busybox, linux-kernel, uglibc, завантажувачів u-boot та barebox, але вони будуть прив'язані до цільової плати.
Після розпакування завантаженого архіву або клонування з git отримуємо готовий до роботи buildroot. Детально про структуру каталогів можна прочитати в посібнику, розповім про найважливіші:

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

Конфігурування збирання здійснюється через KConfig. Ця система використовується для складання ядра linux. Список найчастіше використовуваних команд (виконувати в каталозі 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:

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Отже, можна перезбирати 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 — каталог з розпакованими та зібраними пакетами

Візуалізація

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

Приклади команд візуалізації:

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

Корисні скрипти

У каталозі buildroot є підкаталог утиліти c корисними скриптами. Наприклад, там є скрипт, який перевіряє коректність опису пакетів. Це може бути корисним при додаванні своїх пакетів (я це зроблю пізніше). У файлі utils/readme.txt є опис цих скриптів.

Зберемо стіковий дистрибутив

Усі операції ведуться від імені звичайного користувача, не root.
Всі команди виконуються в корені збудуваннядроту. У поставці buildroot вже є набір конфігурацій під багато поширених плат і віртуалізацію.

Дивимося список конфігурацій:

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Перемикаємось на конфіг qemu_x86_64_defconfig

make qemu_x86_64_defconfig

І запускаємо складання

make

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

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Buildroot зібрав образи, які можна запустити в Qemu і переконатися, що вони працюють.

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

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

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Створення конфігурації власної плати

Додавання файлів плати

Дивимося список конфігурацій:

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

У списку бачимо 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 

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

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Входимо до першого розділу Target Options. Тут можна вибрати цільову архітектуру, під яку вестиметься складання.

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Build options – тут є різні налаштування збирання. Можна вказати каталоги з вихідними кодами, кількість потоків складання, дзеркала для завантаження вихідних кодів та інші налаштування. Залишимо налаштування за замовчуванням.

Toolchain – тут налаштовується сам інструментарій збирання. Про нього докладніше.

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

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

C library – вибір бібліотеки З. Від цього залежить робота всієї системи. Зазвичай використовується glibc, що підтримує весь можливий функціонал. Але вона може бути занадто великою для вбудованої системи, тому часто вибирають uglibc або musl. Ми виберемо glibc (надалі це буде потрібно для використання systemd).

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

GCC COMPILER VERSIONS – вибір версії компілятора, яка буде використана для збирання
Enable C++ support – виберемо для збирання з підтримкою бібліотек c++ у системі. Надалі нам це знадобиться.

Additional gcc options – можна встановити додаткові опції компілятора. Нам без потреби поки що.

System configuration дозволяє встановити майбутні параметри створеної системи:

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Більшість пунктів зрозумілі із назви. Звернімо увагу на такі пункти:
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. Додає нові файли та замінює наявні.

Скрипти, які виконуються безпосередньо перед згортанням файлової системи в образи. Сам скрипт поки залишимо порожнім

Перейдемо до розділу Kernel

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

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

Kernel configuration – шлях до конфігу ядра. Можна вибрати конфігурацію за промовчанням для вибраної архітектури або defocnfig з Linux. У вихідниках Linux є набір defconfig'ів для різних цільових систем. Знайти потрібний можна, глянувши безпосередньо у вихідники тут. Наприклад, для плати beagle bone black можна вибрати конфіг.

Розділ Target packages дозволяє вибрати, які пакети будуть встановлені в систему, що збирається. Поки що залишимо без змін. Пізніше ми додамо свої пакети до цього списку.
Filesystem images - список образів файлових систем, які будуть зібрані. Додамо iso-образ

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Bootloaders — вибір завантажувачів, що збираються. Виберемо isolinix

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Конфігурація Systemd

Systemd стає одним із стовпів linux, нарівні з kernel і glibc. Тому виніс його налаштування до окремого пункту.

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

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Збереження конфігурації системи

Зберігаємо цей конфіг через KConfig.

Після чого збережемо наш defconfig:

make savedefconfig

Конфігурація ядра Linux

Конфігурування ядра linux викликається наступною командою:

make linux-menuconfig

Додамо підтримку відеокарти Virtualbox

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Додамо Virtualbox Guest integration support

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Зберігаємо і виходимо. ВАЖЛИВО: конфігурація збережеться в output/build/linux-$version/config, але не в board/my_x86_board/linux.config

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Тому потрібно вручну скопіювати конфіг у місце зберігання:

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

Після чого виконаємо повне перескладання всієї системи. buildroot не перезбирає вже зібране, то треба вручну вказати пакети для перескладання. Щоб не гаяти час і нерви, невелику систему простіше перезбирати повністю):

make clean;make

По завершенні зборки запускаємо VirtualBox (перевірялося на версії 5.2 та 6.0) із завантаженням із cd-диска.Параметри системи:

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

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

Buildroot - частина 1. Загальні відомості, складання мінімальної системи, налаштування через меню

Список використаних матеріалів

  1. Buildroot manual

Джерело: habr.com

Додати коментар або відгук