In questa sezione esamino alcune delle possibilità di personalizzazione di cui avevo bisogno. Questo non è un elenco completo di ciò che offre Buildroot, ma sono tutte soluzioni funzionanti che non richiedono modifiche ai file stessi di Buildroot.
Utilizzo del meccanismo EXTERNAL per la personalizzazione
è stato considerato un semplice esempio di aggiunta della propria configurazione, tramite l'aggiunta del defconfig della scheda e dei file necessari direttamente nella directory di Buildroot.
Tuttavia, questo metodo non è molto comodo, specialmente durante l'aggiornamento di Buildroot. Per risolvere questo problema, esiste un meccanismo external tree. La sostanza è che in una directory separata puoi conservare le directory board, configs, packages e altro (per esempio, utilizzo la directory patches per applicare patch ai pacchetti, approfondimenti in una sezione separata) e Buildroot le aggiungerà automaticamente a quelle esistenti nella sua directory.
Nota: è possibile applicare più external tree contemporaneamente, c'è un esempio nella guida di Buildroot.
Creeremo la directory my_tree, situata accanto alla directory del buildroot e trasferiremo lì la nostra configurazione. Dovremmo ottenere la seguente struttura di file:
[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 filesCome si può vedere, in generale la struttura ripete quella del buildroot.
Directory board contiene file specifici per ogni scheda nel nostro caso:
- bef_cr_fs_img.sh — uno script che verrà eseguito dopo la costruzione del file system target, ma prima di imballarlo in immagini. Lo useremo in seguito
- linux.config — configurazione del kernel
- rootfs_overlay — directory per sovrapporre sopra il file system target
- users.txt — file con la descrizione degli utenti creati
Directory configs contiene i defconfig delle nostre schede. Nel nostro caso ce n'è solo uno.
Package — directory con i nostri pacchetti. Inizialmente, buildroot contiene descrizioni e regole di costruzione per un numero limitato di pacchetti. In seguito, aggiungeremo qui il gestore di finestre icewm e il gestore di login grafico Slim.
Patches — permette di memorizzare comodamente le proprie patch per diversi pacchetti. Maggiori dettagli in una sezione separata più avanti.
Ora è necessario aggiungere i file di descrizione del nostro external-tree. Ci sono 3 file responsabili: external.desc, Config.in, external.mk.
external.desc contiene effettivamente la descrizione:
[alexey@alexey-pc my_tree]$ cat external.desc
name: my_tree
desc: Il mio semplice external-tree per l'articoloLa prima riga è il nome. In seguito, buildroot creerà una variabile $(BR2_EXTERNAL_MY_TREE_PATH), che dovrà essere utilizzata durante la configurazione della build. Ad esempio, il percorso al file con gli utenti può essere specificato nel seguente modo:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txtLa seconda riga è una breve descrizione comprensibile per l'uomo.
Config.in, external.mk — file per la descrizione dei pacchetti aggiunti. Se non si vogliono aggiungere pacchetti, questi file possono rimanere vuoti. Per ora procederemo in questo modo.
Ora abbiamo pronto il nostro external-tree, che contiene il defconfig della nostra scheda e i file necessari. Passiamo alla directory buildroot, specificando di utilizzare l'external-tree:
[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# configurazione scritta in /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfigNel primo comando utilizziamo l'argomento BR2_EXTERNAL=../my_tree/, che indica l'uso di external tree. È possibile impostare più external-tree contemporaneamente. In questo caso, è sufficiente farlo una sola volta, dopo di che verrà creato un file output/.br-external.mk che contiene le informazioni sull'external-tree utilizzato:
[alexey@alexey-pc buildroot]$ cat output/.br-external.mk
#
# File generato automaticamente; NON MODIFICARE.
#
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 = Il mio semplice external-tree per l'articoloAttenzione! In questo file i percorsi saranno assoluti!
Nel menu è apparso l'elemento Opzioni esterne:

In questo sotto-menu saranno contenuti i nostri pacchetti provenienti dal nostro external-tree. Attualmente questa sezione è vuota.
Adesso è più importante riscrivere i percorsi necessari per l'uso dell'external-tree.
Nota che nella sezione Opzioni di build → Posizione per salvare la configurazione di buildroot, ci sarà un percorso assoluto per il defconfig salvato. Viene creato al momento dell'indicazione dell'uso di external_tree.
Nella sezione Configurazione di sistema modificheremo anche i percorsi. Per la tabella con gli utenti creati:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txtNella sezione Kernel cambiamo il percorso per la configurazione del kernel:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.configOra, durante la compilazione, utilizzeremo i nostri file dal nostro external-tree. Durante il trasferimento in un'altra directory e l'aggiornamento di buildroot, avremo il minimo dei problemi.
Aggiunta del root fs overlay:
Questo meccanismo consente di aggiungere/sostituire facilmente file nel sistema di file target.
Se un file è presente nel root fs overlay ma non nel target, verrà aggiunto.
Se un file è presente sia nel root fs overlay che nel target, verrà sostituito.
Per prima cosa definiamo il percorso della directory root fs overlay. Questo si fa nella sezione Configurazione del sistema → Directory del file system root overlay:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/Ora creiamo due file.
[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 overlayIl primo file (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) sostituirà il file /etc/hosts nel sistema pronto. Il secondo file (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) verrà aggiunto.
Compiliamo e verifichiamo:

Esecuzione di script di personalizzazione in diverse fasi della compilazione del sistema.
Spesso è necessario eseguire alcune operazioni all'interno del sistema di file target prima che venga impacchettato in immagini.
Questo può essere fatto nella sezione Configurazione di sistema:

I primi due script vengono eseguiti dopo la costruzione del filesystem di destinazione, ma prima che venga impacchettato in immagini. La differenza è che lo script fakeroot viene eseguito nel contesto di fakeroot, quindi simula il lavoro dell'utente root.
L'ultimo script viene eseguito dopo la creazione delle immagini di sistema. In esso puoi eseguire azioni aggiuntive, come copiare file necessari su un server NFS o creare un'immagine del firmware del tuo dispositivo.
Come esempio, creerò uno script che scriverà la versione e la data di costruzione in /etc/.
Per prima cosa, indico il percorso di questo file nel mio external-tree:

E ora lo script stesso:
[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-releaseDopo la costruzione, puoi vedere questo file nel sistema.
Nella pratica, lo script può diventare grande. Pertanto, in un progetto reale, ho optato per una soluzione più avanzata:
- Ho creato una directory (my_tree/board_my_x86_board/inside_fakeroot_scripts), in cui si trovano gli script da eseguire, numerati in ordine. Ad esempio, 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
- Ho scritto uno script (my_tree/board_my_x86_board/run_inside_fakeroot.sh) che esplora questa directory ed esegue sequenzialmente gli script ivi presenti.
- Ho specificato questo script nelle impostazioni della scheda nella sezione Configurazione di sistema -> Script personalizzati da eseguire all'interno dell'ambiente fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)
Fonte: habr.com
