În această secțiune, discut despre câteva dintre opțiunile de personalizare care mi-au fost necesare. Aceasta nu este o listă completă a ceea ce oferă buildroot, dar sunt funcționale și nu necesită intervenții în fișierele buildroot însuși.
Utilizarea mecanismului EXTERNAL pentru personalizare
a fost discutat un exemplu simplu de adăugare a configurației proprii, prin adăugarea unui defconfig pentru placa și a fișierelor necesare direct în directorul Buildroot.
Însă această metodă nu este foarte convenabilă, în special la actualizarea buildroot-ului. Pentru a rezolva această problemă, există un mecanism external tree. Esența sa este că, într-un director separat, se pot stoca directoare precum board, configs, packages și altele (de exemplu, eu folosesc un director patches pentru a aplica patch-uri pe pachete, mai multe detalii într-o secțiune separată) și buildroot le va adăuga automat la cele existente în directorul său.
Notă: se pot aplica simultan mai multe external tree, există un exemplu în manualul buildroot
Să creăm un director my_tree, situat lângă directorul buildroot-ului și să mutăm acolo configurația noastră. La final, ar trebui să obținem următoarea structură de fișiere:
[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 directoare, 7 fișiereDupă cum se poate observa, în general, structura imită structura buildroot.
Folderul board conține fișiere specifice fiecărei plăci, în cazul nostru:
- bef_cr_fs_img.sh — un script care va fi executat după construirea sistemului de fișiere target, dar înainte de ambalarea acestuia în imagini. În continuare, îl vom folosi.
- linux.config — configurația nucleului
- rootfs_overlay — director pentru suprapunerea peste sistemul de fișiere target
- users.txt — un fișier cu descrierea utilizatorilor creați
Folderul configs conține defconfig-uri pentru plăcile noastre. Avem doar unul.
Package — directorul cu pachetele noastre. Inițial, buildroot conține descrierile și regulile de construire pentru un număr limitat de pachete. Mai târziu, vom adăuga aici managerul de feronerie icewm și managerul grafic de logare Slim.
Patches — permite stocarea convenabilă a patch-urilor proprii pentru diferite pachete. Mai multe detalii într-o secțiune separată ulterior.
Acum trebuie să adăugăm fișierele de descriere pentru external-tree-ul nostru. Acest lucru este gestionat de 3 fișiere: external.desc, Config.in, external.mk.
external.desc conține, în esență, descrierea:
[alexey@alexey-pc my_tree]$ cat external.desc
name: my_tree
desc: My simple external-tree for articlePrima linie — numele. Ulterior, buildroot va crea o variabilă $(BR2_EXTERNAL_MY_TREE_PATH), care trebuie folosită la configurarea construcției. De exemplu, calea către fișierul cu utilizatori poate fi specificată astfel:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txtA doua linie — o descriere scurtă, ușor de înțeles.
Config.in, external.mk — fișiere pentru descrierea pachetelor adăugate. Dacă nu se adaugă pachete proprii, aceste fișiere pot rămâne goale. Deocamdată, aceasta va fi abordarea noastră.
Acum avem pregătit external-tree-ul nostru, care conține defconfig-ul plăcii noastre și fișierele necesare. Să trecem în directorul buildroot și să specificăm utilizarea external-tree-ului:
[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# configurare scrisă în /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfigÎn prima comandă folosim argumentul BR2_EXTERNAL=../my_tree/, care indică utilizarea external tree-ului. Se pot specifica simultan mai multe external-tree-uri. Este suficient să o facem o singură dată, după care se creează fișierul output/.br-external.mk, care stochează informații despre external-tree-ul utilizat:
[alexey@alexey-pc buildroot]$ cat output/.br-external.mk
#
# Fișier generat automat; NU EDITAȚI.
#
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 articleImportant! În acest fișier, căile vor fi absolute!
În meniu a apărut opțiunea External options:

În acest submeniu se vor găsi pachetele noastre din external-tree. Acum, această secțiune este goală.
Acum este mai important să rescriem căile necesare pentru a folosi external-tree.
Rețineți că în secțiunea Build options → Location to save buildroot config, va exista o cale absolută către defconfig-ul salvat. Aceasta se formează în momentul specificării utilizării external_tree.
De asemenea, în secțiunea System configuration, vom corecta căile. Pentru tabelul cu utilizatorii creați:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txtÎn secțiunea Kernel vom schimba calea către configurația kernel-ului:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.configAcum, în timpul construcției, se vor folosi fișierele noastre din external-tree. Atunci când mutăm în alt director, actualizăm buildroot, vom avea minimum de probleme.
Adăugarea root fs overlay:
Acest mecanism permite adăugarea/înlocuirea ușoară a fișierelor în sistemul de fișiere al țintei.
Dacă un fișier există în root fs overlay, dar nu și în țintă, va fi adăugat.
Dacă fișierul există atât în overlay-ul root fs, cât și în target, acesta va fi înlocuit.
Mai întâi, să specificăm calea către directorul overlay al root fs. Acest lucru se face în secțiunea Configurare sistem → Directoare overlay pentru sistemul de fișiere root:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/Acum vom crea două fișiere.
[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 overlayPrimul fișier (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) va înlocui fișierul /etc/hosts din sistemul final. Al doilea fișier (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) va fi adăugat.
Construim și verificăm:

Executarea scripturilor de personalizare în diferite etape ale construcției sistemului
Adesea este necesar să executați anumite acțiuni în interiorul sistemului de fișiere target înainte ca acesta să fie ambalat în imagini.
Acest lucru se poate face în secțiunea Configurare sistem:

Primele două scripturi sunt executate după construcția sistemului de fișiere target, dar înainte de ambalarea lui în imagini. Diferența este că scriptul fakeroot este executat în contextul fakeroot, adică se imită funcționarea ca utilizator root.
Ultimul script este executat deja după crearea imaginilor sistemului. Aici se pot efectua acțiuni suplimentare, de exemplu, copierea fișierelor necesare pe un server NFS sau crearea imaginii firmware-ului dispozitivului.
Ca exemplu, voi crea un script care va scrie versiunea și data construcției în /etc/.
Mai întâi voi specifica calea către acest fișier în tree-ul meu extern:

Acum, scriptul propriu-zis:
[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-releaseDupă construcție, acest fișier poate fi văzut în sistem.
În practică, scriptul poate deveni destul de mare. Așadar, în proiectul real am ales o abordare mai avansată:
- Am creat un director (my_tree/board_my_x86_board/inside_fakeroot_scripts), în care se află scripturi de execuție, numerotate. De exemplu, 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
- Am scris un script (my_tree/board_my_x86_board/run_inside_fakeroot.sh), care trece prin acest director și execută consecutiv scripturile aflate în el
- Am specificat acest script în setările plăcii în secțiunea Configurare sistem → Scripturi personalizate de rulat în mediu fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)
Sursa: habr.com
