Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Introduzione

In questa serie di articoli, voglio esaminare il sistema di compilazione della distribuzione buildroot e condividere la mia esperienza nella personalizzazione. Ci sarà esperienza pratica nella creazione di un piccolo sistema operativo con un'interfaccia grafica e funzionalità minime.

Prima di tutto non bisogna confondere il sistema di compilazione e la distribuzione. Buildroot può creare un sistema da un insieme di pacchetti che gli vengono offerti. Buildroot è basato su makefile e quindi ha enormi capacità di personalizzazione. Sostituire un pacchetto con un'altra versione, aggiungere il proprio pacchetto, modificare le regole per la creazione di un pacchetto, personalizzare il file system dopo aver installato tutti i pacchetti? buildroot può fare tutto questo.

In Russia viene utilizzato buildroot, ma secondo me ci sono poche informazioni in lingua russa per i principianti.

L'obiettivo del lavoro è assemblare un kit di distribuzione con download live, interfaccia icewm e browser. La piattaforma di destinazione è virtualbox.

Perché creare la propria distribuzione? Spesso sono necessarie funzionalità limitate con risorse limitate. Ancora più spesso nell'automazione è necessario creare firmware. Adattare una distribuzione generica eliminando i pacchetti non necessari e trasformandoli in firmware richiede più lavoro che creare una nuova distribuzione. Anche l'uso di Gentoo ha i suoi limiti.

Il sistema Buildroot è molto potente, ma non farà nulla per te. Può solo abilitare e automatizzare il processo di assemblaggio.

I sistemi di build alternativi (yocto, open build system e altri) non vengono considerati né confrontati.

Dove trovarlo e come iniziare

Sito web del progetto - buildroot.org. Qui puoi scaricare la versione attuale e leggere il manuale. Lì puoi contattare la comunità, c'è un bug tracker, mail-list e un canale irc.

Buildroot gestisce defconfig per la scheda di destinazione della build. Defconfig è un file di configurazione che memorizza solo le opzioni che non hanno valori predefiniti. È lui che determina cosa verrà raccolto e come. In questo caso, puoi configurare separatamente le configurazioni dei bootloader busybox, linux-kernel, uglibc, u-boot e barebox, ma tutti saranno legati alla scheda di destinazione.
Dopo aver decompresso l'archivio scaricato o clonato da git, otteniamo un buildroot pronto per l'uso. Puoi leggere di più sulla struttura delle directory nel manuale; ti parlerò di quelle più importanti:

tavola — una directory con file specifici per ciascuna scheda. Questi possono essere script per formare immagini di sistema (iso, sdcart, cpio e altri), una directory di sovrapposizione, configurazione del kernel, ecc.
configs — l'effettiva defconfig della scheda. Defconfig è una configurazione della scheda incompleta. Memorizza solo i parametri che differiscono dalle impostazioni predefinite
dl — directory con codici/file sorgente scaricati per l'assemblaggio
uscita/obiettivo — il file system assemblato del sistema operativo risultante. Successivamente, da esso vengono create immagini per il download/installazione
uscita/ospite - utilità host per l'assemblaggio
uscita/costruzione - pacchi assemblati

L'assemblaggio è configurato tramite KConfig. Lo stesso sistema viene utilizzato per creare il kernel Linux. Elenco dei comandi più comunemente utilizzati (eseguire nella directory buildroot):

  • make menuconfig: chiama la configurazione di build. Puoi anche usare l'interfaccia grafica (make nconfig, make xconfig, make gconfig)
  • make linux-menuconfig - richiama la configurazione del kernel.
  • make clean: pulisce i risultati della compilazione (tutto ciò che è memorizzato nell'output)
  • fare: costruire un sistema. Ciò non riassembla processi già assemblati.
  • make defconfig_name - cambia la configurazione su un defconfig specifico
  • make list-defconfigs - mostra un elenco di defconfigs
  • make source: basta scaricare i file di installazione, senza compilare.
  • make help - elenca i possibili comandi

Note importanti e suggerimenti utili

Buildroot non ricostruisce i pacchetti che sono già stati creati! Pertanto, potrebbe verificarsi una situazione in cui è necessario un riassemblaggio completo.

È possibile ricostruire un pacchetto separato con il comando crea la ricostruzione del nomepacchetto. Ad esempio, puoi ricostruire il kernel Linux:

make linux-rebuild

Buildroot memorizza lo stato di qualsiasi pacchetto creando file .stamp nella directory output/build/$packagename:

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Pertanto, puoi ricostruire root-fs e immagini senza ricostruire i pacchetti:

rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make

Variabili utili

buildroot ha una serie di variabili per una facile configurazione

  • $TOPDIR - directory buildroot
  • $BASEDIR - Directory di USCITA
  • $HOST_DIR, $STAGING_DIR, $TARGET_DIR: host fs, staging fs, directory di creazione fs di destinazione.
  • $BUILD_DIR - directory con pacchetti decompressi e compilati

Visualizzazione

buildroot dispone di una funzionalità di visualizzazione che consente di creare un diagramma delle dipendenze, un grafico dei tempi di compilazione e un grafico delle dimensioni dei pacchetti nel sistema finale. I risultati sono sotto forma di file pdf (puoi scegliere tra svn,png) nella directory output/graph.

Esempi di comandi di visualizzazione:

  • make graph-depends costruire un albero delle dipendenze
  • make <pkg>-graph-depends costruire un albero delle dipendenze per un pacchetto specifico
  • BR2_GRAPH_OUT=png make graph-build tracciare il tempo di costruzione con l'output PNG
  • make graph-size tracciare la dimensione del pacchetto

Script utili

C'è una sottodirectory nella directory buildroot utils con script utili. Ad esempio, esiste uno script che verifica la correttezza delle descrizioni dei pacchetti. Questo può essere utile quando aggiungi i tuoi pacchetti (lo farò più tardi). Il file utils/readme.txt contiene una descrizione di questi script.

Costruiamo una distribuzione delle azioni

È importante ricordare che tutte le operazioni vengono eseguite per conto di un utente normale, non di root.
Tutti i comandi vengono eseguiti nella buildroot. Il pacchetto buildroot include già una serie di configurazioni per molte schede comuni e virtualizzazione.

Diamo un'occhiata all'elenco delle configurazioni:

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Passa alla configurazione qemu_x86_64_defconfig

make qemu_x86_64_defconfig

E iniziamo l'assemblea

make

La build viene completata correttamente, guarda i risultati:

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Buildroot ha compilato immagini che puoi eseguire in Qemu e verificare che funzionino.

qemu-system-x86_64 -kernel output/images/bzImage -hda    output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S

Il risultato è un sistema in esecuzione in qemu:

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Creare la propria configurazione della scheda

Aggiunta di file della scheda

Diamo un'occhiata all'elenco delle configurazioni:

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Nell'elenco vediamo pc_x86_64_efi_defconfig. Creeremo la nostra scheda copiandola dalla configurazione:

cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig

Creiamo immediatamente una directory della scheda per archiviare i nostri script, rootfs-overlay e altri file necessari:

mkdir board/my_x86_board

Passa a questo defconfig:

make my_x86_board_defconfig

Pertanto, ora la configurazione di build (memorizzata in .config nella radice della directory buildroot) corrisponde alla macchina di destinazione di avvio x86-64 legacy(bios).

Copiamo la configurazione del kernel linux (utile in seguito):

cp board/pc/linux.config board/my_x86_board/

Impostazione dei parametri di creazione tramite KConfig

Iniziamo la configurazione:

make menuconfig 

Si aprirà la finestra KConfig. È possibile configurare con un'interfaccia grafica (make nconfig, make xconfig, make gconfig):

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Entriamo nella prima sezione Opzioni target. Qui è possibile selezionare l'architettura di destinazione per la quale verrà eseguita la build.

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Opzioni di creazione: qui sono disponibili varie impostazioni di creazione. È possibile specificare le directory con i codici sorgente, il numero di thread di build, i mirror per il download dei codici sorgente e altre impostazioni. Lasciamo le impostazioni predefinite.

Toolchain: qui vengono configurati gli strumenti di creazione stessi. Leggi di più su di lui.

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Tipo di toolchain: tipo di toolchain utilizzata. Può trattarsi di una toolchain integrata in buildroot o esterna (è possibile specificare la directory con quella già creata o l'URL per il download). Sono disponibili opzioni aggiuntive per diverse architetture. Ad esempio, per arm puoi semplicemente selezionare la versione Linaro della toolchain esterna.

Libreria C – selezione della libreria C. Da questo dipende il funzionamento dell'intero sistema. Tipicamente viene utilizzato glibc, che supporta tutte le funzionalità possibili. Ma potrebbe essere troppo grande per un sistema embedded, quindi spesso vengono scelti uglibc o musl. Selezioneremo glibc (questo sarà richiesto in seguito per utilizzare systemd).

Serie Kernel Headers e Custom Kernel Headers: devono corrispondere alla versione del kernel che sarà presente nel sistema assemblato. Per le intestazioni del kernel, puoi anche specificare il percorso del file tarball o del repository git.

VERSIONI DEL COMPILATORE GCC: seleziona la versione del compilatore da utilizzare per la compilazione
Abilita supporto C++: seleziona per creare con il supporto per le librerie C++ nel sistema. Questo ci sarà utile in futuro.

Opzioni gcc aggiuntive: puoi impostare opzioni aggiuntive del compilatore. Non ne abbiamo bisogno per ora.

La configurazione del sistema consente di impostare i parametri futuri del sistema creato:

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

La maggior parte dei punti sono chiari dal titolo. Prestiamo attenzione ai seguenti punti:
Percorso delle tabelle degli utenti: tabella con gli utenti da creare (https://buildroot.org/downloads/manual/manual.html#makeuser-syntax).

File di esempio. L'utente user verrà creato con la password admin, automaticamente gid/uid, shell /bin/sh, utente del gruppo predefinito, root del membro del gruppo, commento utente Foo

[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt 
user -1 user -1 =admin /home/user /bin/sh root Foo user

Directory sovrapposte del filesystem root: directory sovrapposta al target-fs assemblato. Aggiunge nuovi file e sostituisce quelli esistenti.

Script personalizzati da eseguire prima di creare immagini del file system: script eseguiti immediatamente prima di trasformare il file system in immagini. Lasciamo lo script vuoto per ora.

Andiamo alla sezione Kernel

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Le impostazioni del kernel vengono impostate qui. Il kernel stesso viene configurato tramite make linux-menuconfig.
Puoi impostare la versione del kernel in diversi modi: selezionala tra quelle offerte, inserisci la versione manualmente, specifica un repository o un tarball già pronto.

Configurazione del kernel: percorso della configurazione del kernel. È possibile selezionare la configurazione predefinita per l'architettura selezionata o defocnfig da Linux. Il sorgente Linux contiene una serie di defconfig per diversi sistemi di destinazione. Puoi trovare quello che ti serve guardando direttamente le fonti qui. Ad esempio, per una lavagna nera con osso di beagle puoi seleziona configuraz.

La sezione Pacchetti di destinazione consente di selezionare quali pacchetti verranno installati sul sistema in fase di creazione. Lasciamolo invariato per ora. Aggiungeremo i nostri pacchetti a questo elenco in seguito.
Immagini del file system: un elenco di immagini del file system che verranno raccolte. Aggiungi un'immagine ISO

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Bootloader: selezione di bootloader da collezionare. Scegliamo isolinix

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Configurazione di Systemd

Systemd sta diventando uno dei pilastri di Linux, insieme a kernel e glibc. Pertanto, ho spostato la sua impostazione in un elemento separato.

Configurato tramite make menuconfig, quindi Pacchetti di destinazione → Strumenti di sistema → systemd. Qui puoi specificare quali servizi systemd verranno installati e avviati all'avvio del sistema.

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Salvataggio della configurazione del sistema

Salviamo questa configurazione tramite KConfig.

Quindi salva il nostro defconfig:

make savedefconfig

Configurazione del kernel Linux

La configurazione del kernel Linux viene richiamata con il seguente comando:

make linux-menuconfig

Aggiungiamo il supporto per la scheda video Virtualbox

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Aggiungiamo il supporto per l'integrazione di Virtualbox Guest

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Salva ed esci. IMPORTANTE: la configurazione verrà salvata in output/build/linux-$version/config, ma non in board/my_x86_board/linux.config

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Pertanto, è necessario copiare manualmente la configurazione in una posizione di archiviazione:

cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config

Dopodiché eseguiremo un rimontaggio completo dell'intero sistema. buildroot non ricostruisce ciò che è già stato creato, è necessario specificare manualmente i pacchetti per la ricostruzione. Per non perdere tempo e nervi, è più semplice ricostruire interamente un piccolo impianto):

make clean;make

Al termine della build, avvia VirtualBox (testato sulle versioni 5.2 e 6.0) avviando dal CD.Parametri di sistema:

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Esecuzione dall'iso assemblato:

Buildroot - parte 1. Informazioni generali, assemblaggio di un sistema minimo, configurazione tramite menu

Elenco dei materiali utilizzati

  1. Manuale di buildroot

Fonte: habr.com

Aggiungi un commento