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
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:
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:
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:
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:
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:
- 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
- Napisal sem skript (my_tree/board_my_x86_board/run_inside_fakeroot.sh), ki gre skozi ta imenik in zaporedoma izvaja skripte v njem
- 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