Buildroot - 2. del. Ustvarjanje vaše konfiguracije plošče; z uporabo zunanjega drevesa, rootfs-overlay, skriptov po izdelavi

V tem razdelku si ogledam nekaj možnosti prilagajanja, ki sem jih potreboval. To ni popoln seznam ponudbe buildroot, vendar so precej funkcionalne in ne zahtevajo posega v datoteke same buildroot.

Uporaba ZUNANJEGA mehanizma za prilagajanje

V prejšnjem članku Ogledali smo si preprost primer dodajanja lastne konfiguracije z dodajanjem defconfig plošče in potrebnih datotek neposredno v imenik Buildroot.

Toda ta metoda ni zelo priročna, zlasti pri posodabljanju buildroot. Obstaja mehanizem za rešitev te težave zunanje drevo. Njegovo bistvo je, da lahko ploščo, konfiguracije, pakete in druge imenike shranite v ločen imenik (jaz na primer uporabljam imenik popravkov za uporabo popravkov na paketih, več podrobnosti v ločenem razdelku) in jih buildroot sam doda tistim v njen imenik.

Opomba: lahko prekrivate več zunanjih dreves hkrati, primer je v priročniku buildroot

Ustvarimo imenik my_tree, ki se nahaja poleg imenika buildroot in tja prenesimo našo konfiguracijo. Izhod mora biti naslednja datotečna struktura:

[alexey@alexey-pc my_tree]$ tree
.
├── board
│   └── my_x86_board
│       ├── bef_cr_fs_img.sh
│       ├── linux.config
│       ├── rootfs_overlay
│       └── users.txt
├── Config.in
├── configs
│   └── my_x86_board_defconfig
├── external.desc
├── external.mk
├── package
└── patches

6 directories, 7 files

Kot lahko vidite, struktura na splošno ponavlja strukturo buildroot.

Imenik svet vsebuje datoteke, specifične za vsako ploščo v našem primeru:

  • bef_cr_fs_img.sh je skript, ki se bo izvedel po izgradnji ciljnega datotečnega sistema, vendar preden ga zapakirate v slike. Uporabljali ga bomo v prihodnje
  • linux.config - konfiguracija jedra
  • rootfs_overlay - imenik za prekrivanje na vrhu ciljnega datotečnega sistema
  • users.txt - datoteka, ki opisuje uporabnike, ki jih je treba ustvariti

Imenik konfiguracije vsebuje defconfig naših plošč. Samo enega imamo.

paket - katalog z našimi paketi. Na začetku buildroot vsebuje opise in pravila za gradnjo omejenega števila paketov. Kasneje bomo sem dodali upravitelja oken icewm in grafični upravitelj prijave Slim.
Obliži — vam omogoča priročno shranjevanje popravkov za različne pakete. Več podrobnosti v ločenem razdelku spodaj.
Zdaj moramo dodati opisne datoteke za naše zunanje drevo. Za to so odgovorne 3 datoteke: external.desc, Config.in, external.mk.

zunanji.desc vsebuje dejanski opis:

[alexey@alexey-pc my_tree]$ cat external.desc 
name: my_tree
desc: My simple external-tree for article

Prva vrstica je naslov. V prihodnosti buildroot ustvari spremenljivko $(BR2_EXTERNAL_MY_TREE_PATH), ki ga je treba uporabiti pri konfiguriranju sklopa. Na primer, pot do uporabniške datoteke lahko nastavite takole:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt

Druga vrstica je kratek, človeku berljiv opis.

Config.in, external.mk — datoteke za opis dodanih paketov. Če ne dodate svojih paketov, lahko te datoteke ostanejo prazne. Zaenkrat bomo to storili.
Zdaj imamo pripravljeno zunanje drevo, ki vsebuje defconfig naše plošče in datoteke, ki jih potrebuje. Pojdimo v imenik buildroot in določimo uporabo zunanjega drevesa:

[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# configuration written to /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfig

V prvem ukazu uporabimo argument BR2_EXTERNAL=../moje_drevo/, ki označuje uporabo zunanjega drevesa. Določite lahko več zunanjih dreves za uporabo hkrati. V tem primeru morate to storiti samo enkrat, nato pa se ustvari datoteka output/.br-external.mk, ki hrani informacije o uporabljenem zunanjem drevesu:

[alexey@alexey-pc buildroot]$ cat output/.br-external.mk 
#
# Automatically generated file; DO NOT EDIT.
#

BR2_EXTERNAL ?= /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_NAMES = 
BR2_EXTERNAL_DIRS = 
BR2_EXTERNAL_MKS = 

BR2_EXTERNAL_NAMES += my_tree
BR2_EXTERNAL_DIRS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_MKS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree/external.mk
export BR2_EXTERNAL_my_tree_PATH = /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
export BR2_EXTERNAL_my_tree_DESC = My simple external-tree for article

Pomembno! Poti v tej datoteki bodo absolutne!

V meniju se je pojavil element Zunanje možnosti:

Buildroot - 2. del. Ustvarjanje vaše konfiguracije plošče; z uporabo zunanjega drevesa, rootfs-overlay, skriptov po izdelavi

Ta podmeni bo vseboval naše pakete iz našega zunanjega drevesa. Ta razdelek je trenutno prazen.

Zdaj je bolj pomembno, da prepišemo potrebne poti za uporabo zunanjega drevesa.

Upoštevajte, da bo v razdelku Build options → Location to save buildroot config absolutna pot do shranjene defconfig. Oblikuje se v trenutku podajanja uporabe extgernal_tree.

Popravili bomo tudi poti v razdelku Konfiguracija sistema. Za tabelo z ustvarjenimi uporabniki:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt

V razdelku Kernel spremenite pot do konfiguracije jedra:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.config

Zdaj bodo naše datoteke iz našega zunanjega drevesa uporabljene med sestavljanjem. Ko se premaknete v drug imenik ali posodobite buildroot, bomo imeli najmanj težav.

Dodajanje prekrivanja root fs:

Ta mehanizem vam omogoča preprosto dodajanje/zamenjavo datotek v ciljnem datotečnem sistemu.
Če je datoteka v prekrivni korenski datoteki fs, ne pa v ciljni, bo dodana
Če je datoteka v korenskem prekrivanju fs in v cilju, bo zamenjana.
Najprej nastavimo pot do root fs overlay dir. To naredite v razdelku Konfiguracija sistema → Prekrivni imeniki korenskega datotečnega sistema:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/

Zdaj pa ustvarimo dve datoteki.

[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/etc/hosts 
127.0.0.1   localhost
127.0.1.1   my_small_linux
8.8.8.8     google-public-dns-a.google.com.
[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt 
This is new file from overlay

Prva datoteka (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) bo nadomestila datoteko /etc/hosts v končnem sistemu. Dodana bo druga datoteka (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt).

Zbiramo in preverjamo:

Buildroot - 2. del. Ustvarjanje vaše konfiguracije plošče; z uporabo zunanjega drevesa, rootfs-overlay, skriptov po izdelavi

Izvajanje prilagoditvenih skriptov na različnih stopnjah sestavljanja sistema

Pogosto morate opraviti nekaj dela znotraj ciljnega datotečnega sistema, preden je zapakiran v slike.

To lahko storite v razdelku Konfiguracija sistema:

Buildroot - 2. del. Ustvarjanje vaše konfiguracije plošče; z uporabo zunanjega drevesa, rootfs-overlay, skriptov po izdelavi

Prva dva skripta se izvedeta po izgradnji ciljnega datotečnega sistema, vendar preden je zapakiran v slike. Razlika je v tem, da se skript fakeroot izvaja v kontekstu fakeroot, ki simulira delo kot root uporabnik.

Zadnji skript se izvede, ko so sistemske slike ustvarjene. V njem lahko izvedete dodatna dejanja, na primer kopirate potrebne datoteke na strežnik NFS ali ustvarite sliko vdelane programske opreme vaše naprave.

Kot primer bom ustvaril skript, ki bo zapisal različico in datum gradnje v /etc/.
Najprej bom navedel pot do te datoteke v svojem zunanjem drevesu:

Buildroot - 2. del. Ustvarjanje vaše konfiguracije plošče; z uporabo zunanjega drevesa, rootfs-overlay, skriptov po izdelavi

In zdaj sam scenarij:

[alexey@alexey-pc buildroot]$ cat ../my_tree/board/my_x86_board/bef_cr_fs_img.sh 
#!/bin/sh
echo "my small linux 1.0 pre alpha" > output/target/etc/mysmalllinux-release
date >> output/target/etc/mysmalllinux-release

Po sestavljanju lahko to datoteko vidite v sistemu.

V praksi lahko skript postane velik. Zato sem v resničnem projektu ubral naprednejšo pot:

  1. Ustvaril sem imenik (my_tree/board_my_x86_board/inside_fakeroot_scripts), v katerem so skripti, ki jih je treba izvesti, s serijskimi številkami. Na primer, 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
  2. Napisal sem skript (my_tree/board_my_x86_board/run_inside_fakeroot.sh), ki gre skozi ta imenik in zaporedoma izvaja skripte v njem
  3. Določite ta skript v nastavitvah plošče v razdelku Konfiguracija sistema -> Skripti po meri za izvajanje v okolju fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)

Vir: www.habr.com

Dodaj komentar