In questa sezione esamino alcune delle possibilità di personalizzazione di cui ho avuto bisogno. Questo non è un elenco esaustivo di ciò che offre buildroot, ma sono tutte funzionalità funzionanti e non richiedono interventi nei file di buildroot stesso.
Utilizzo del meccanismo EXTERNAL per la personalizzazione
è stato considerato un semplice esempio di aggiunta della propria configurazione, attraverso l'aggiunta del defconfig della scheda e dei file necessari direttamente nella directory Buildroot.
Tuttavia, questo metodo non è molto pratico, specialmente durante l'aggiornamento di buildroot. Per risolvere questo problema esiste il meccanismo external tree. L'idea è che in una directory separata è possibile archiviare le directory board, configs, packages e altro (ad esempio, utilizzo una directory patches per applicare patch ai pacchetti, ulteriori dettagli in una sezione separata) e buildroot le aggiungerà automaticamente a quelle esistenti nel proprio catalogo.
Nota: è possibile applicare più external tree contemporaneamente, c'è un esempio nella guida di buildroot.
Creeremo la directory my_tree, situata accanto alla directory di buildroot, e trasferiremo la nostra configurazione lì. Alla fine, 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 riproduce quella di buildroot.
Directory board contiene file specifici per ciascuna scheda nel nostro caso:
- bef_cr_fs_img.sh — uno script che verrà eseguito dopo la generazione del file di sistema target, ma prima di imballarlo in immagini. In seguito lo utilizzeremo
- linux.config — configurazione del kernel
- rootfs_overlay — directory per sovrapporre il file di sistema target
- users.txt — file che descrive gli utenti da creare
Directory configs contiene i defconfig delle nostre schede. Ne abbiamo solo uno.
Pacchetto — directory con i nostri pacchetti. Inizialmente buildroot contiene descrizioni e regole di costruzione per un numero limitato di pacchetti. Successivamente aggiungeremo qui il gestore di finestre icewm e il gestore di accesso grafico Slim.
Patches — consente di conservare facilmente le proprie patch per diversi pacchetti. Maggiori dettagli in una sezione separata più avanti.
Ora dobbiamo aggiungere i file di descrizione del nostro external-tree. A questo servono 3 file: external.desc, Config.in, external.mk.
external.desc contiene la descrizione:
[alexey@alexey-pc my_tree]$ cat external.desc
name: my_tree
desc: My simple external-tree for articleLa prima riga è il titolo. Successivamente, buildroot creerà una variabile $(BR2_EXTERNAL_MY_TREE_PATH), che deve essere utilizzata durante la configurazione della build. Ad esempio, il percorso del file degli utenti può essere specificato come segue:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txtLa seconda riga è una descrizione breve e comprensibile.
Config.in, external.mk sono file per descrivere i pacchetti aggiunti. Se non si aggiungono pacchetti propri, questi file possono rimanere vuoti. Finora procederemo in questo modo.
Ora abbiamo pronta la nostra external-tree, contenente il defconfig della nostra scheda e i file necessari. Passiamo alla cartella buildroot e indichiamo 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 dell'external tree. È possibile specificare più external-tree contemporaneamente. È sufficiente farlo una sola volta, dopo di che verrà creato un file output/.br-external.mk, che memorizza 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 = My simple external-tree for articleImportante! In questo file i percorsi saranno assoluti!
Nel menu è apparso l'opzione Esterni:

In questo sottomenu ci saranno i nostri pacchetti provenienti dalla nostra external-tree. Attualmente questa sezione è vuota.
Adesso ci interessa di più riscrivere i percorsi necessari per utilizzare l'external-tree.
Si noti che nella sezione Opzioni di compilazione → Posizione per salvare la configurazione buildroot, ci sarà un percorso assoluto per il defconfig salvato. Viene formato al momento della specificazione dell'uso di external_tree.
Nella sezione Configurazione di sistema modifichiamo anche i percorsi. Per la tabella con gli utenti da creare:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txtNella sezione Kernel cambiando il percorso per la configurazione del kernel:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.configOra durante la compilazione verranno utilizzati i nostri file dalla nostra external-tree. Trasferendo in un'altra cartella, aggiornando buildroot avremo il minimo di problemi.
Aggiunta di root fs overlay:
Questo meccanismo consente di aggiungere/sostituire facilmente file nel file system target.
Se il file è presente nel root fs overlay, ma non nel target, verrà aggiunto.
Se il file è presente nel root fs overlay e nel target, verrà sostituito.
Prima impostiamo il percorso della directory del root fs overlay. Questo viene fatto nella sezione Configurazione di sistema → Directory del filesystem overlay radice:
$(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
Questo è un nuovo file dall'overlay.Il 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 costruzione del sistema.
Spesso è necessario eseguire alcune operazioni all'interno del filesystem 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 target, ma prima che venga impacchettato in immagini. La differenza è che lo script fakeroot viene eseguito nel contesto di fakeroot, quindi simula l'operato dall'utente root.
L'ultimo script viene eseguito dopo la creazione delle immagini di sistema. Qui si possono eseguire ulteriori operazioni, ad esempio, copiare file necessari su un server nfs o creare un'immagine del proprio firmware del dispositivo.
Come esempio, creerò uno script che scriverà la versione e la data di costruzione in /etc/.
Per prima cosa indicherò 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, questo file può essere visto nel sistema.
In pratica, lo script può diventare ampio. Pertanto, in un progetto reale ho adottato un metodo più avanzato:
- Ho creato una directory (my_tree/board_my_x86_board/inside_fakeroot_scripts), in cui ci sono script per l'esecuzione, con numeri progressivi. 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 percorre questa directory ed esegue sequenzialmente gli script in essa contenuti.
- 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
