Buildroot - частка 1. Агульныя звесткі, зборка мінімальнай сістэмы, настройка праз меню

Увядзенне

У дадзенай серыі артыкулаў я жадаю разгледзець сістэму зборкі дыстрыбутыва buildroot і падзяліцца досведам яе кастамізацыі. Тут будзе практычны досвед стварэння невялікай АС з графічным інтэрфейсам і мінімальным функцыяналам.

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

У Расіі buildroot выкарыстоўваецца, але на мой погляд мала рускамоўнай інфармацыі для пачаткоўцаў.

Мэта працы - сабраць дыстрыбутыў з live-загрузкай, інтэрфейсам icewm і браўзэрам. Мэтавая платформа - virtualbox.

Навошта збіраць свой дыстрыбутыў? Часцяком патрэбен абмежаваны функцыянал пры абмежаваных рэсурсах. Яшчэ часцей у аўтаматызацыі трэба ствараць прашыўкі. Прыстасоўваць дыстрыбутыў агульнага прызначэння, вычышчаючы лішнія пакеты і ператвараць яго ў прашыўку шлях больш працаёмкі, чым сабраць новы дыстрыбут. Выкарыстанне Gentoo таксама мае свае абмежаванні.

Buildroot сістэма вельмі магутная, але яна нічога не зробіць за вас. Яна можа толькі даць магчымасці і аўтаматызаваць працэс зборкі.

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

Дзе ўзяць і як пачаць

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

Buildroot аперуе defconfig'aмі для мэтавай платы зборкі. 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 - каталог з распакаванымі і сабранымі пакетамі

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

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

Прыклады каманд візуалізацыі:

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

Карысныя скрыпты

У каталогу buildroot ёсць падкаталог посуду з карыснымі скрыптамі. Напрыклад, там ёсць скрыпт, які правярае карэктнасць апісання пакетаў. Гэта можа быць карысна пры даданні сваіх пакетаў (я гэта зраблю пазней). У файле utils/readme.txt ёсць апісанне гэтых скрыптоў.

Збяром стокавы дыстрыбутыў

Усе аперацыі вядуцца ад асобы звычайнага карыстача, не root.
Усе каманды выконваюцца ў корані buildroot. У пастаўцы 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

Дадаць каментар