Buildroot - partea 2. Crearea configurației plăcii; folosind arbore extern, rootfs-overlay, scripturi post-build

În această secțiune mă uit la unele dintre opțiunile de personalizare de care aveam nevoie. Aceasta nu este o listă completă cu ceea ce oferă buildroot, dar acestea sunt destul de funcționale și nu necesită intervenție în fișierele buildroot în sine.

Utilizarea mecanismului EXTERN pentru personalizare

Într-un articol precedent Ne-am uitat la un exemplu simplu de adăugare a propriei configurații prin adăugarea defconfig a plăcii și a fișierelor necesare direct în directorul Buildroot.

Dar această metodă nu este foarte convenabilă, mai ales când actualizați buildroot. Există un mecanism pentru a rezolva această problemă arbore extern. Esența sa este că puteți stoca placa, config., pachete și alte directoare într-un director separat (de exemplu, folosesc directorul de patch-uri pentru a aplica patch-uri la pachete, mai multe detalii într-o secțiune separată) și buildroot însuși le va adăuga la cele din directorul său.

Notă: puteți suprapune mai mulți arbori externi simultan, există un exemplu în manualul buildroot

Să creăm un director my_tree, situat lângă directorul buildroot și să ne transferăm configurația acolo. Ieșirea ar trebui să fie 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 directories, 7 files

După cum puteți vedea, în general, structura repetă structura buildroot.

Directory bord conține fișiere specifice fiecărei plăci în cazul nostru:

  • bef_cr_fs_img.sh este un script care va fi executat după construirea sistemului de fișiere țintă, dar înainte de a-l împacheta în imagini. Îl vom folosi în viitor
  • linux.config - configurarea kernelului
  • rootfs_overlay - directorul de suprapus peste sistemul de fișiere țintă
  • users.txt - un fișier care descrie utilizatorii care urmează să fie creați

Directory configuri conține defconfig a plăcilor noastre. Avem doar unul.

Pachet - catalog cu pachetele noastre. Inițial, buildroot conține descrieri și reguli pentru construirea unui număr limitat de pachete. Mai târziu vom adăuga aici managerul de ferestre icewm și managerul de autentificare grafic Slim.
Patch-uri — vă permite să vă stocați în mod convenabil patch-urile pentru diferite pachete. Mai multe detalii într-o secțiune separată de mai jos.
Acum trebuie să adăugăm fișierele de descriere pentru arborele nostru extern. Există 3 fișiere responsabile pentru aceasta: external.desc, Config.in, external.mk.

extern.desc conține descrierea reală:

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

Prima linie este titlul. În viitor, buildroot creați o variabilă $(BR2_EXTERNAL_MY_TREE_PATH), care ar trebui utilizat la configurarea ansamblului. De exemplu, calea către fișierul utilizator poate fi setată după cum urmează:

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

A doua linie este o descriere scurtă, care poate fi citită de om.

Config.in, external.mk — fișiere pentru a descrie pachetele adăugate. Dacă nu adăugați propriile pachete, atunci aceste fișiere pot fi lăsate goale. Deocamdată, asta vom face.
Acum avem gata arborele extern, care conține defconfig-ul plăcii noastre și fișierele de care are nevoie. Să mergem la directorul buildroot și să specificăm să folosim external-tree:

[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

În prima comandă folosim argumentul BR2_EXTERNAL=../arborele_meu/, indicând utilizarea unui arbore extern. Puteți specifica mai mulți arbori externi pentru utilizare în același timp. În acest caz, trebuie să faceți acest lucru o singură dată, după care este creat un fișier output/.br-external.mk care stochează informații despre arborele extern utilizat:

[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

Important! Căile din acest fișier vor fi absolute!

Un element de opțiuni externe a apărut în meniu:

Buildroot - partea 2. Crearea configurației plăcii; folosind arbore extern, rootfs-overlay, scripturi post-build

Acest submeniu va conține pachetele noastre din arborele nostru extern. Această secțiune este momentan goală.

Acum este mai important pentru noi să rescriem căile necesare pentru a folosi arborele extern.

Vă rugăm să rețineți că în secțiunea Opțiuni de compilare → Locație pentru a salva configurația buildroot, va exista o cale absolută către defconfig salvat. Se formează în momentul specificării utilizării extgernal_tree.

Vom corecta, de asemenea, căile din secțiunea Configurare sistem. Pentru un tabel cu utilizatori creați:

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

În secțiunea Kernel, modificați calea către configurația kernelului:

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

Acum fișierele noastre din arborele nostru extern vor fi folosite în timpul asamblarii. La mutarea în alt director sau la actualizarea buildroot-ului, vom avea un minim de probleme.

Adăugarea suprapunerii rădăcină fs:

Acest mecanism vă permite să adăugați/înlocuiți cu ușurință fișiere în sistemul de fișiere țintă.
Dacă fișierul este în suprapunerea root fs, dar nu în țintă, atunci va fi adăugat
Dacă fișierul este în suprapunerea rădăcină fs și în țintă, atunci va fi înlocuit.
Mai întâi, să setăm calea către directorul de suprapunere fs root. Acest lucru se face în secțiunea Configurare sistem → Directoare de suprapunere a sistemului de fișiere rădăcină:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/

Acum să creăm 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 overlay

Primul fișier (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) va înlocui fișierul /etc/hosts pe sistemul terminat. Al doilea fișier (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) va fi adăugat.

Colectăm și verificăm:

Buildroot - partea 2. Crearea configurației plăcii; folosind arbore extern, rootfs-overlay, scripturi post-build

Executarea scripturilor de personalizare în diferite etape ale asamblarii sistemului

Adesea, trebuie să efectuați unele lucrări în interiorul sistemului de fișiere țintă înainte de a fi împachetat în imagini.

Acest lucru se poate face în secțiunea Configurare sistem:

Buildroot - partea 2. Crearea configurației plăcii; folosind arbore extern, rootfs-overlay, scripturi post-build

Primele două scripturi sunt executate după ce sistemul de fișiere țintă este construit, dar înainte ca acesta să fie împachetat în imagini. Diferența este că scriptul fakeroot este executat în contextul fakeroot, care simulează lucrul ca utilizator root.

Ultimul script este executat după crearea imaginilor de sistem. Puteți efectua acțiuni suplimentare în acesta, de exemplu, copiați fișierele necesare pe un server NFS sau creați o imagine a firmware-ului dispozitivului dvs.

De exemplu, voi crea un script care va scrie versiunea și data construirii în /etc/.
Mai întâi voi indica calea către acest fișier în arborele meu extern:

Buildroot - partea 2. Crearea configurației plăcii; folosind arbore extern, rootfs-overlay, scripturi post-build

Și acum scenariul în sine:

[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

După asamblare, puteți vedea acest fișier pe sistem.

În practică, scenariul poate deveni mare. Prin urmare, în proiectul real am luat un traseu mai avansat:

  1. Am creat un director (my_tree/board_my_x86_board/inside_fakeroot_scripts) în care sunt scripturi de executat, cu numere de serie. De exemplu, 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
  2. Am scris un script (my_tree/board_my_x86_board/run_inside_fakeroot.sh) care trece prin acest director și execută secvențial scripturile conținute în el
  3. Specificați acest script în setările plăcii din secțiunea Configurare sistem -> Scripturi personalizate pentru a rula în mediul fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)

Sursa: www.habr.com

Adauga un comentariu