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 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:
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 dipendenzemake <pkg>-graph-depends
costruire un albero delle dipendenze per un pacchetto specificoBR2_GRAPH_OUT=png make graph-build
tracciare il tempo di costruzione con l'output PNGmake 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:
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 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:
Creare la propria configurazione della scheda
Aggiunta di file della scheda
Diamo un'occhiata all'elenco delle configurazioni:
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):
Entriamo nella prima sezione Opzioni target. Qui è possibile selezionare l'architettura di destinazione per la quale verrà eseguita la build.
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.
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:
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 (
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
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
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
Bootloader: selezione di bootloader da collezionare. Scegliamo isolinix
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.
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
Aggiungiamo il supporto per l'integrazione di Virtualbox Guest
Salva ed esci. IMPORTANTE: la configurazione verrà salvata in output/build/linux-$version/config, ma non in board/my_x86_board/linux.config
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:
Esecuzione dall'iso assemblato:
Elenco dei materiali utilizzati
- Manuale di buildroot
Fonte: habr.com