Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Pagpapakilala

Sa seryeng ito ng mga artikulo, gusto kong tingnan ang buildroot distribution build system at ibahagi ang aking karanasan sa pag-customize nito. Magkakaroon ng praktikal na karanasan sa paglikha ng isang maliit na OS na may graphical na interface at minimal na functionality.

Una sa lahat, hindi mo dapat malito ang build system at ang pamamahagi. Ang Buildroot ay maaaring bumuo ng isang sistema mula sa isang hanay ng mga pakete na inaalok dito. Ang Buildroot ay binuo sa mga makefile at samakatuwid ay may napakalaking kakayahan sa pagpapasadya. Palitan ang isang pakete ng isa pang bersyon, magdagdag ng iyong sariling pakete, baguhin ang mga patakaran para sa pagbuo ng isang pakete, i-customize ang file system pagkatapos i-install ang lahat ng mga pakete? kayang gawin ng buildroot ang lahat ng ito.

Sa Russia, ginagamit ang buildroot, ngunit sa palagay ko mayroong kaunting impormasyon sa wikang Ruso para sa mga nagsisimula.

Ang layunin ng trabaho ay bumuo ng isang distribution kit na may live na pag-download, icewm interface at browser. Ang target na platform ay virtualbox.

Bakit bumuo ng iyong sariling pamamahagi? Kadalasan kailangan ang limitadong pag-andar na may limitadong mapagkukunan. Kahit na mas madalas sa automation kailangan mong lumikha ng firmware. Ang pag-angkop ng pangkalahatang layunin na pamamahagi sa pamamagitan ng paglilinis ng mga hindi kinakailangang pakete at paggawa nito sa firmware ay mas matrabaho kaysa sa pagbuo ng bagong pamamahagi. Ang paggamit ng Gentoo ay mayroon ding mga limitasyon.

Ang Buildroot system ay napakalakas, ngunit wala itong magagawa para sa iyo. Maaari lamang nitong paganahin at i-automate ang proseso ng pagpupulong.

Ang mga alternatibong build system (yocto, open build system at iba pa) ay hindi isinasaalang-alang o inihambing.

Saan ito kukuha at paano magsisimula

Website ng proyekto - buildroot.org. Dito maaari mong i-download ang kasalukuyang bersyon at basahin ang manwal. Doon ay maaari kang makipag-ugnayan sa komunidad, mayroong isang bug tracker, mga mail-list at isang irc channel.

Ang Buildroot ay nagpapatakbo ng mga defconfig para sa target na board ng build. Ang Defconfig ay isang configuration file na nag-iimbak lamang ng mga opsyon na walang mga default na halaga. Siya ang nagpapasiya kung ano ang kokolektahin at kung paano. Sa kasong ito, maaari mong hiwalay na i-configure ang mga config ng busybox, linux-kernel, uglibc, u-boot at barebox bootloader, ngunit lahat ng mga ito ay iuugnay sa target na board.
Pagkatapos i-unpack ang na-download na archive o pag-clone mula sa git, nakakakuha kami ng ready-to-use buildroot. Maaari kang magbasa nang higit pa tungkol sa istraktura ng direktoryo sa manwal; Sasabihin ko sa iyo ang tungkol sa mga pinakamahalaga:

lupon β€” isang direktoryo na may mga file na tiyak sa bawat board. Ang mga ito ay maaaring mga script para sa pagbuo ng mga imahe ng system (iso, sdcart, cpio at iba pa), isang overlay na direktoryo, kernel config, atbp.
mga config β€” ang aktwal na defconfig ng board. Ang Defconfig ay isang hindi kumpletong configuration ng board. Nag-iimbak lamang ito ng mga parameter na naiiba sa mga default na setting
dl β€” direktoryo na may mga na-download na source code/file para sa pagpupulong
output/target β€” ang pinagsama-samang file system ng nagresultang OS. Kasunod nito, ang mga imahe ay nilikha mula dito para sa pag-download/pag-install
output/host - host utilities para sa pagpupulong
output/build - mga naka-assemble na pakete

Ang pagpupulong ay na-configure sa pamamagitan ng KConfig. Ang parehong sistema ay ginagamit upang bumuo ng Linux kernel. Listahan ng mga pinakakaraniwang ginagamit na utos (isagawa sa direktoryo ng buildroot):

  • gumawa ng menuconfig - tawagan ang build configuration. Maaari mo ring gamitin ang graphical na interface (gumawa ng nconfig, gumawa ng xconfig, gumawa ng gconfig)
  • gumawa ng linux-menuconfig - tawagan ang pagsasaayos ng kernel.
  • make clean - linisin ang mga resulta ng build (lahat ng nakaimbak sa output)
  • gumawa - bumuo ng isang sistema. Hindi nito muling binubuo ang mga naka-assemble na proseso.
  • gumawa ng defconfig_name - ilipat ang configuration sa isang partikular na defconfig
  • gumawa ng list-defconfigs - magpakita ng listahan ng mga defconfig
  • gumawa ng pinagmulan - i-download lamang ang mga file sa pag-install, nang walang pagbuo.
  • gumawa ng tulong - ilista ang mga posibleng utos

Mahahalagang tala at kapaki-pakinabang na mga tip

Ang Buildroot ay hindi muling bumubuo ng mga pakete na naitayo na! Samakatuwid, maaaring lumitaw ang isang sitwasyon kung saan kinakailangan ang isang kumpletong muling pagpupulong.

Maaari kang muling bumuo ng isang hiwalay na pakete gamit ang command gumawa ng packagename-rebuild. Halimbawa, maaari mong muling buuin ang Linux kernel:

make linux-rebuild

Iniimbak ng Buildroot ang estado ng anumang package sa pamamagitan ng paglikha ng mga .stamp na file sa direktoryo ng output/build/$packagename:

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Samakatuwid, maaari mong muling buuin ang root-fs at mga imahe nang hindi muling itinayo ang mga pakete:

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

Mga Kapaki-pakinabang na Variable

Ang buildroot ay may isang hanay ng mga variable para sa madaling pagsasaayos

  • $TOPDIR - buildroot na direktoryo
  • $BASEDIR - direktoryo ng OUTPUT
  • $HOST_DIR, $STAGING_DIR, $TARGET_DIR β€” host fs, staging fs, target fs build directories.
  • $BUILD_DIR - direktoryo na may mga naka-unpack at binuo na mga pakete

Pagpapakita

Ang buildroot ay may tampok na visualization. Maaari kang bumuo ng isang dependency diagram, isang build time graph, at isang graph ng mga laki ng package sa huling system. Ang mga resulta ay nasa anyo ng mga pdf file (maaari kang pumili mula sa svn,png) sa direktoryo ng output/graph.

Mga halimbawa ng visualization command:

  • make graph-depends bumuo ng dependency tree
  • make <pkg>-graph-depends bumuo ng isang dependency tree para sa isang partikular na pakete
  • BR2_GRAPH_OUT=png make graph-build plot build time na may PNG na output
  • make graph-size laki ng packet ng plot

Mga kapaki-pakinabang na script

Mayroong isang subdirectory sa direktoryo ng buildroot utils na may kapaki-pakinabang na mga script. Halimbawa, mayroong isang script na sumusuri sa kawastuhan ng mga paglalarawan ng package. Ito ay maaaring maging kapaki-pakinabang kapag nagdaragdag ng iyong sariling mga pakete (gagawin ko ito sa ibang pagkakataon). Ang file na utils/readme.txt ay naglalaman ng paglalarawan ng mga script na ito.

Bumuo tayo ng stock distribution

Mahalagang tandaan na ang lahat ng mga operasyon ay isinasagawa sa ngalan ng isang regular na gumagamit, hindi root.
Ang lahat ng mga utos ay isinasagawa sa buildroot. Kasama na sa buildroot package ang isang set ng mga configuration para sa maraming karaniwang board at virtualization.

Tingnan natin ang listahan ng mga pagsasaayos:

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Lumipat sa qemu_x86_64_defconfig config

make qemu_x86_64_defconfig

At sinimulan namin ang pagpupulong

make

Matagumpay na nakumpleto ang build, tingnan ang mga resulta:

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Ang Buildroot ay nag-compile ng mga larawan na maaari mong patakbuhin sa Qemu at i-verify na gumagana ang mga ito.

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

Ang resulta ay isang sistema na tumatakbo sa qemu:

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Paglikha ng iyong sariling pagsasaayos ng board

Pagdaragdag ng mga Board File

Tingnan natin ang listahan ng mga pagsasaayos:

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Sa listahan nakikita namin ang pc_x86_64_efi_defconfig. Gagawa kami ng sarili naming board sa pamamagitan ng pagkopya nito mula sa configuration:

cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig

Agad tayong lumikha ng isang direktoryo ng board upang iimbak ang aming mga script, rootfs-overlay at iba pang kinakailangang mga file:

mkdir board/my_x86_board

Lumipat sa defconfig na ito:

make my_x86_board_defconfig

Kaya, ngayon ang build config (na nakaimbak sa .config sa root ng buildroot directory) ay tumutugma sa x86-64 legacy(bios) boot target machine.

Kopyahin natin ang configuration ng linux-kernel (kapaki-pakinabang sa ibang pagkakataon):

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

Pagtatakda ng mga parameter ng build sa pamamagitan ng KConfig

Simulan natin ang pag-setup:

make menuconfig 

Magbubukas ang window ng KConfig. Posibleng i-configure gamit ang isang graphical na interface (gumawa ng nconfig, gumawa ng xconfig, gumawa ng gconfig):

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Pumasok kami sa unang seksyon na Mga Pagpipilian sa Target. Dito maaari mong piliin ang target na arkitektura kung saan isasagawa ang build.

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Mga pagpipilian sa pagbuo - mayroong iba't ibang mga setting ng build dito. Maaari mong tukuyin ang mga direktoryo na may mga source code, ang bilang ng mga build thread, mga salamin para sa pag-download ng mga source code at iba pang mga setting. Iwanan natin ang mga setting sa default.

Toolchain – ang mga build tool mismo ay naka-configure dito. Magbasa pa tungkol sa kanya.

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Uri ng toolchain – uri ng toolchain na ginamit. Ito ay maaaring isang toolchain na binuo sa buildroot o isang panlabas na isa (maaari mong tukuyin ang direktoryo na may nakabuo na o ang url para sa pag-download). Mayroong karagdagang mga pagpipilian para sa iba't ibang mga arkitektura. Halimbawa, para sa braso maaari mo lang piliin ang bersyon ng Linaro ng panlabas na toolchain.

C library – pagpili ng C library. Ang operasyon ng buong system ay nakasalalay dito. Kadalasan, ginagamit ang glibc, na sumusuporta sa lahat ng posibleng pag-andar. Ngunit maaaring ito ay masyadong malaki para sa isang naka-embed na system, kaya madalas na pinipili ang uglibc o musl. Pipili kami ng glibc (kinakailangan ito sa ibang pagkakataon upang magamit ang systemd).

Mga Kernel Header at Custom na Kernel Header series – dapat tumugma sa bersyon ng kernel na nasa assembled system. Para sa mga header ng kernel, maaari mo ring tukuyin ang landas patungo sa tarball o git repository.

GCC COMPILER VERSIONS – piliin ang bersyon ng compiler na gagamitin para sa pagbuo
I-enable ang suporta sa C++ – piliin na bumuo nang may suporta para sa mga C++ na library sa system. Ito ay magiging kapaki-pakinabang sa atin sa hinaharap.

Mga karagdagang opsyon sa gcc – maaari kang magtakda ng mga karagdagang opsyon sa compiler. Hindi natin ito kailangan sa ngayon.

Nagbibigay-daan sa iyo ang configuration ng system na magtakda ng mga parameter sa hinaharap ng nilikhang system:

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Karamihan sa mga punto ay malinaw mula sa pamagat. Bigyang-pansin natin ang mga sumusunod na punto:
Path sa mga user table - table na may mga user na gagawin (https://buildroot.org/downloads/manual/manual.html#makeuser-syntax).

Halimbawang file. Gagawin ang user user gamit ang password admin, awtomatikong gid/uid, /bin/sh shell, default group user, group member root, comment 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 na mga direktoryo - direktoryo na naka-overlay sa ibabaw ng naka-assemble na target-fs. Nagdaragdag ng mga bagong file at pinapalitan ang mga dati.

Mga custom na script na tatakbo bago gumawa ng mga imahe ng filesystem - Ang mga script ay naisagawa kaagad bago tiklop ang filesystem sa mga larawan. Hayaan muna nating walang laman ang script sa ngayon.

Pumunta tayo sa seksyon ng Kernel

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Ang mga setting ng kernel ay nakatakda dito. Ang kernel mismo ay na-configure sa pamamagitan ng make linux-menuconfig.
Maaari mong itakda ang bersyon ng kernel sa iba't ibang paraan: pumili mula sa mga inaalok, manu-manong ipasok ang bersyon, tukuyin ang isang repositoryo o isang handa na tarball.

Configuration ng kernel β€” landas patungo sa kernel config. Maaari mong piliin ang default na configuration para sa napiling arkitektura o defocnfig mula sa Linux. Ang Linux source ay naglalaman ng isang set ng mga defconfig para sa iba't ibang target na system. Mahahanap mo ang kailangan mo sa pamamagitan ng direktang pagtingin sa mga mapagkukunan dito. Halimbawa, para sa isang beagle bone black board maaari mo piliin ang config.

Ang seksyong Target na mga pakete ay nagbibigay-daan sa iyo na piliin kung aling mga pakete ang mai-install sa system na binuo. Hayaan muna natin ito sa ngayon. Idaragdag namin ang aming mga pakete sa listahang ito mamaya.
Mga imahe ng filesystem - isang listahan ng mga imahe ng file system na kokolektahin. Magdagdag ng iso image

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Mga Bootloader - pagpili ng mga bootloader na kolektahin. Piliin natin ang isolinix

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Pag-configure ng Systemd

Ang Systemd ay nagiging isa sa mga haligi ng Linux, kasama ang kernel at glibc. Samakatuwid, inilipat ko ang setting nito sa isang hiwalay na item.

Na-configure sa pamamagitan ng make menuconfig, pagkatapos ay Target packages β†’ System tools β†’ systemd. Dito maaari mong tukuyin kung aling mga serbisyo ng system ang mai-install at magsisimula kapag nagsimula ang system.

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Sine-save ang configuration ng system

Ise-save namin ang config na ito sa pamamagitan ng KConfig.

Pagkatapos ay i-save ang aming defconfig:

make savedefconfig

Configuration ng Linux Kernel

Ang pagsasaayos ng kernel ng Linux ay hinihimok gamit ang sumusunod na utos:

make linux-menuconfig

Magdagdag tayo ng suporta para sa Virtualbox video card

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Magdagdag tayo ng suporta sa pagsasama ng Virtualbox Guest

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

I-save at lumabas. MAHALAGA: ang configuration ay ise-save sa output/build/linux-$version/config, ngunit hindi sa board/my_x86_board/linux.config

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Samakatuwid, kailangan mong manu-manong kopyahin ang config sa isang lokasyon ng imbakan:

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

Pagkatapos nito ay magsasagawa kami ng isang kumpletong reassembly ng buong system. Ang buildroot ay hindi muling itinayo kung ano ang naitayo na, kailangan mong manu-manong tukuyin ang mga pakete para sa muling pagtatayo. Upang hindi mag-aksaya ng oras at nerbiyos, mas madaling muling buuin ang isang maliit na sistema nang buo):

make clean;make

Sa pagkumpleto ng build, ilunsad ang VirtualBox (nasubok sa mga bersyon 5.2 at 6.0) na mag-boot mula sa CD. Mga parameter ng system:

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Tumatakbo mula sa naka-assemble na iso:

Buildroot - bahagi 1. Pangkalahatang impormasyon, pag-assemble ng isang minimal na sistema, pagsasaayos sa pamamagitan ng menu

Listahan ng mga materyales na ginamit

  1. Manu-manong Buildroot

Pinagmulan: www.habr.com

Magdagdag ng komento