Увядзенне
У дадзенай серыі артыкулаў я жадаю разгледзець сістэму зборкі дыстрыбутыва buildroot і падзяліцца досведам яе кастамізацыі. Тут будзе практычны досвед стварэння невялікай АС з графічным інтэрфейсам і мінімальным функцыяналам.
Першым чынам, не варта блытаць сістэму зборкі і дыстрыбутыў. Buildroot можа сабраць сістэму з набору пакетаў, якія яму прапанавалі. Buildroot пабудаваны на make-файлах і таму мае вялізныя магчымасці па кастамізацыі. Замяніць пакет на іншую версію, дадаць свой пакет, памяняць правілы зборкі пакета, кастамізаваць файлавую сістэму пасля ўсталёўкі ўсіх пакетаў? Усё гэта ўмее buildroot.
У Расіі buildroot выкарыстоўваецца, але на мой погляд мала рускамоўнай інфармацыі для пачаткоўцаў.
Мэта працы - сабраць дыстрыбутыў з live-загрузкай, інтэрфейсам icewm і браўзэрам. Мэтавая платформа - virtualbox.
Навошта збіраць свой дыстрыбутыў? Часцяком патрэбен абмежаваны функцыянал пры абмежаваных рэсурсах. Яшчэ часцей у аўтаматызацыі трэба ствараць прашыўкі. Прыстасоўваць дыстрыбутыў агульнага прызначэння, вычышчаючы лішнія пакеты і ператвараць яго ў прашыўку шлях больш працаёмкі, чым сабраць новы дыстрыбут. Выкарыстанне Gentoo таксама мае свае абмежаванні.
Buildroot сістэма вельмі магутная, але яна нічога не зробіць за вас. Яна можа толькі даць магчымасці і аўтаматызаваць працэс зборкі.
Альтэрнатыўныя сістэмы зборкі (yocto, open build system і іншыя) не разглядаюцца і не параўноўваюцца.
Дзе ўзяць і як пачаць
Сайт праекта -
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:
Такім чынам, можна перасабраць 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
пабудаваць графік часу зборкі з вывадам у PNGmake graph-size
пабудаваць графік памеру пакетаў
Карысныя скрыпты
У каталогу buildroot ёсць падкаталог посуду з карыснымі скрыптамі. Напрыклад, там ёсць скрыпт, які правярае карэктнасць апісання пакетаў. Гэта можа быць карысна пры даданні сваіх пакетаў (я гэта зраблю пазней). У файле utils/readme.txt ёсць апісанне гэтых скрыптоў.
Збяром стокавы дыстрыбутыў
Усе аперацыі вядуцца ад асобы звычайнага карыстача, не root.
Усе каманды выконваюцца ў корані buildroot. У пастаўцы 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
Адкрыецца акно KConfig. Ёсць магчымасць канфігураваць з графічным інтэрфейсам (make nconfig, make xconfig, make gconfig):
Уваходзім у першы раздзел Target Options. Тут можна абраць мэтавую архітэктуру, пад якую будзе весціся зборка.
Build options - тут ёсць розныя наладкі зборкі. Можна паказаць каталогі з зыходнымі кодамі, колькасць струменяў зборкі, люстэркі для запампоўкі зыходных кодаў і іншыя наладкі. Пакінем наладкі па-змаўчанні.
Toolchain - тут наладжваецца сам інструментар зборкі. Аб ім падрабязней.
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 дазваляе задаць будучыя параметры створанай сістэмы:
Большасць пунктаў зразумелыя з назвы. Звернем увагу на наступныя пункты:
Path to the users tables - табліца з ствараемымі карыстальнікамі (
Прыклад файла. Будзе створаны карыстач 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
Тут задаюцца наладкі ядра. Само ядро канфігуруецца праз make linux-menuconfig.
Задаць версію ядра можна па-рознаму: абраць з прапанаваных, увесці версію ўручную, паказаць рэпазітар або гатовы tarball.
Kernel configuration - шлях да канфігу ядра. Можна абраць канфігурацыю па змаўчанні для абранай архітэктуры ці defocnfig з Linux. У зыходніках Linux ёсць набор defconfig'аў для розных мэтавых сістэм. Знайсці патрэбны можна,
Раздзел Target packages дазваляе абраць, якія пакеты будуць усталяваныя ў якая збіраецца сістэму. Пакуль пакінем без змен. Пазней мы дадамо свае пакеты ў гэты спіс.
Filesystem images - спіс выяў файлавых сістэм, якія будуць сабраны. Дадамо iso-вобраз
Bootloaders - выбар збіраемых загрузнікаў. Выберам isolinix
Канфігураванне Systemd
Systemd становіцца адным са слупоў linux, нароўні з kernel і glibc. Таму вынес яго настройку ў асобны пункт.
Наладжваецца праз make menuconfig, далей Target packages → System tools → systemd. Тут можна паказаць, якія службы 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
Пасля чаго выканаем поўную перазборку ўсёй сістэмы. buildroot не перазбірае ўжо сабранае, то трэба ўручную паказаць пакеты для перазборкі. Каб не губляць час і нервы, невялікую сістэму прасцей перасабраць цалкам):
make clean;make
Па завяршэнні зборкі запускаем VirtualBox(правяралася на версіі 5.2 і 6.0) з загрузкай з cd-дыска.Параметры сістэмы:
Запуск з сабранага iso:
Спіс выкарыстаных матэрыялаў
- Buildroot manual
Крыніца: habr.com