Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Introducció

En aquesta sèrie d'articles, vull revisar el sistema de compilació de la distribució buildroot i compartir la meva experiència en personalitzar-lo. Hi haurà experiència pràctica en la creació d'un sistema operatiu petit amb una interfície gràfica i una funcionalitat mínima.

En primer lloc, no confongueu el sistema de compilació amb la distribució. Buildroot pot construir un sistema a partir d'un conjunt de paquets que se li ofereixen. Buildroot es basa en fitxers makefiles i, per tant, té moltes opcions de personalització. Substituïu el paquet per una altra versió, afegiu el vostre propi paquet, canvieu les regles per construir el paquet, personalitzeu el sistema de fitxers després d'instal·lar tots els paquets? Tot això pot construir arrel.

A Rússia, s'utilitza buildroot, però al meu entendre hi ha poca informació en rus per als principiants.

L'objectiu del treball és construir un kit de distribució amb descàrrega en directe, interfície icewm i navegador. La plataforma objectiu és virtualbox.

Per què construir la teva pròpia distribució? Sovint necessiteu una funcionalitat limitada amb recursos limitats. Més sovint en l'automatització, cal crear firmware. Adaptar una distribució de propòsit general netejant paquets redundants i convertint-los en firmware és una manera que consumeix més temps que crear una nova distribució. L'ús de Gentoo també té les seves limitacions.

El sistema Buildroot és molt potent, però no farà res per tu. Només pot habilitar i automatitzar el procés de muntatge.

Els sistemes de construcció alternatius (yocto, open build system, etc.) no es consideren ni es comparen.

On arribar i com començar

Web del projecte - buildroot.org. Aquí podeu descarregar l'última versió i llegir el manual. Allà també podeu contactar amb la comunitat, hi ha un rastrejador d'errors, llistes de correu i un canal irc.

Buildroot funciona amb defconfigs per al tauler de construcció de destinació. Defconfig és un fitxer de configuració que només conté opcions que no tenen un valor predeterminat. És ell qui determina què i com es recollirà. En aquest cas, podeu configurar per separat les configuracions del carregador d'arrencada busybox, linux-kernel, uglibc, u-boot i barebox, però totes estaran vinculades al tauler de destinació.
Després de desempaquetar l'arxiu descarregat o clonar des de git, estem preparat per treballar amb buildroot. Podeu llegir més sobre l'estructura de directoris al manual, us explicaré els més importants:

tauler — directori amb fitxers específics de cada tauler. Aquests poden ser scripts d'imatge del sistema (iso, sdcart, cpio i altres), directori de superposició, configuració del nucli, etc.
config - la defconfig real del tauler. Defconfig és una configuració de tauler incompleta. Emmagatzema només paràmetres diferents de la configuració predeterminada.
dl - directori amb codis font / fitxers descarregats per al muntatge
sortida/objectiu - el sistema de fitxers muntat del sistema operatiu rebut. En el futur, se'n creen imatges per a la seva baixada/instal·lació
sortida/amfitrió - Utilitats host per al muntatge
sortida/construcció - paquets muntats

La configuració del muntatge es fa mitjançant KConfig. El mateix sistema s'utilitza per construir el nucli de Linux. Llista de les ordres més utilitzades (executar-les al directori buildroot):

  • make menuconfig: crida a la configuració de compilació. També podeu utilitzar la GUI (make nconfig,make xconfig,make gconfig)
  • make linux-menuconfig - crida a la configuració del nucli.
  • make clean - neteja els resultats de la construcció (tot el que s'emmagatzema a la sortida)
  • fer - construir el sistema. Això no reconstrueix els processos ja creats.
  • make defconfig_name: canvia la configuració a defconfig específica
  • make list-defconfigs - mostra una llista de defconfigs
  • make source: només descarregueu els fitxers d'instal·lació, sense muntatge.
  • make help: mostra una llista de possibles ordres

Notes importants i consells útils

Buildroot no reconstrueix paquets ja construïts! Per tant, pot sorgir una situació en què es requereix un muntatge complet.

Podeu reconstruir un sol paquet amb l'ordre fer paquetname-rebuild. Per exemple, podeu reconstruir el nucli de Linux:

make linux-rebuild

Buildroot emmagatzema l'estat de qualsevol paquet creant fitxers .stamp al directori output/build/$packagename:

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Per tant, és possible reconstruir root-fs i imatges sense reconstruir paquets:

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

Variables útils

buildroot té un conjunt de variables per a una configuració fàcil

  • $TOPDIR - directori arrel de compilació
  • $BASEDIR - Directori OUTPUT
  • $HOST_DIR, $STAGING_DIR, $TARGET_DIR - host fs, staging fs, target fs build directoris.
  • $BUILD_DIR - directori amb paquets desempaquetats i construïts

Visualització

buildroot té la capacitat de visualitzar. Podeu crear un diagrama de dependència, un gràfic de temps i un gràfic de mida del paquet al sistema final. Resultats com a fitxers pdf (podeu triar entre svn, png) al directori de sortida/gràfic.

Exemples d'ordres de renderització:

  • make graph-depends construir un arbre de dependències
  • make <pkg>-graph-depends construir l'arbre de dependències d'un paquet específic
  • BR2_GRAPH_OUT=png make graph-build traça un gràfic de temps de construcció amb sortida PNG
  • make graph-size traça la mida del paquet

Guions útils

El directori buildroot té un subdirectori útil amb scripts útils. Per exemple, hi ha un script que verifica la correcció de les descripcions dels paquets. Això pot ser útil quan s'afegeixen paquets personalitzats (ho faré més tard). El fitxer utils/readme.txt té una descripció d'aquests scripts.

Construïm una distribució d'estocs

És important recordar que totes les operacions es realitzen en nom d'un usuari normal, no root.
Totes les ordres s'executen a buildroot. La distribució buildroot ja té un conjunt de configuracions per a molts taulers comuns i virtualització.

Consulteu la llista de configuracions:

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Canvia a qemu_x86_64_defconfig config

make qemu_x86_64_defconfig

I comença la construcció

make

La compilació es completa correctament, mireu els resultats:

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Buildroot ha reunit imatges que podeu executar a Qemu i veure si funcionen.

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

El resultat és un sistema que s'executa en qemu:

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Creeu la vostra pròpia configuració de tauler

Afegint fitxers de la junta

Consulteu la llista de configuracions:

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

A la llista veiem pc_x86_64_efi_defconfig. Crearem el nostre tauler copiant-lo de la configuració:

cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig

Creeu immediatament un directori del tauler per emmagatzemar els nostres scripts, rootfs-overlay i altres fitxers necessaris:

mkdir board/my_x86_board

Canvia a aquesta defconfig:

make my_x86_board_defconfig

Així que ara la configuració de compilació (emmagatzemada a .config a l'arrel del directori de buildroot) coincideix amb la màquina de destinació x86-64 legacy (bios) per arrencada.

Copieu la configuració del nucli de Linux (útil més tard):

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

Configuració de les opcions de compilació mitjançant KConfig

Comencem la configuració:

make menuconfig 

S'obrirà la finestra KConfig. És possible configurar amb una interfície gràfica (make nconfig, make xconfig, make gconfig):

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Entrem a la primera secció Opcions de destinació. Aquí podeu seleccionar l'arquitectura de destinació per a la qual es realitzarà el muntatge.

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Opcions de compilació: aquí hi ha diverses opcions de compilació. Podeu especificar directoris amb codis font, el nombre de fils de compilació, miralls per descarregar codis font i altres configuracions. Deixem la configuració predeterminada.

Cadena d'eines: aquí es configura el conjunt d'eines de creació. Més sobre ell.

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Tipus de cadena d'eines: el tipus de cadena d'eines utilitzat. Això es pot incorporar a buildroot o a una cadena d'eines externa (podeu especificar un directori amb un ja construït o una URL per descarregar). Hi ha opcions addicionals per a diferents arquitectures. Per exemple, per al braç, simplement podeu seleccionar la versió de la cadena d'eines Linaro externa.

Biblioteca C - selecció de la biblioteca C. El funcionament de tot el sistema depèn d'això. Normalment s'utilitza glibc, que admet totes les funcionalitats possibles. Però pot ser massa gran per a un sistema incrustat, de manera que sovint s'escull uglibc o musl. Escollirem glibc (això serà necessari més endavant per utilitzar systemd).

Capçaleres del nucli i sèries de capçaleres personalitzades del nucli: han de coincidir amb la versió del nucli que hi haurà al sistema que s'està construint. Per a les capçaleres del nucli, també podeu especificar el camí al fitxer tarball o al repositori git.

VERSIONS DEL COMPILADOR GCC: seleccioneu la versió del compilador que s'utilitzarà per a la creació
Habilita el suport de C++: seleccioneu-lo per crear-lo amb suport per a biblioteques de C++ al sistema. Això ho necessitarem més endavant.

Opcions gcc addicionals: podeu establir opcions addicionals del compilador. De moment no ho necessitem.

La configuració del sistema us permet establir els paràmetres futurs del sistema creat:

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

La majoria dels punts queden clars pel títol. Fixem-nos en els punts següents:
Camí a les taules d'usuaris - taula amb usuaris creats (https://buildroot.org/downloads/manual/manual.html#makeuser-syntax).

Exemple de fitxer. L'usuari de l'usuari es crearà amb la contrasenya admin, automàticament gid/uid, /bin/sh shell, usuari del grup predeterminat, membre de l'arrel del grup, comentari de l'usuari Foo

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

Directoris de superposició del sistema de fitxers arrel: un directori que es superposa a la part superior del target-fs compilat. Afegeix fitxers nous i substitueix els existents.

Scripts personalitzats per executar abans de crear imatges del sistema de fitxers Deixeu l'script buit de moment.

Anem a la secció Kernel

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Aquí és on s'estableix la configuració del nucli. El nucli en si es configura mitjançant make linux-menuconfig.
Podeu configurar la versió del nucli de diferents maneres: escolliu entre les suggerides, introduïu la versió manualment, especifiqueu un repositori o un fitxer tarball ja preparat.

Configuració del nucli - camí a la configuració del nucli. Podeu triar la configuració predeterminada per a l'arquitectura seleccionada o desfocnfig des de Linux. Les fonts Linux tenen un conjunt de defconfigs per a diferents sistemes de destinació. Podeu trobar el que necessiteu mirant directament la font aquí. Per exemple, per a una pissarra negra d'os de beagle, podeu fer-ho seleccioneu la configuració.

La secció Paquets de destinació us permet seleccionar quins paquets s'instal·laran al sistema de destinació. De moment, deixem-ho sense canvis. Més endavant afegirem els nostres paquets a aquesta llista.
Imatges del sistema de fitxers - Llista d'imatges del sistema de fitxers que es crearan. Afegiu una imatge iso

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Carregadors d'arrencada: l'elecció dels carregadors d'arrencada recollits. Trieu isolinix

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Configuració de Systemd

Systemd es converteix en un dels pilars de Linux, juntament amb el nucli i la glibc. Per tant, vaig treure la seva configuració en un paràgraf a part.

Es configura mitjançant make menuconfig, després Target packages → System tools → systemd. Aquí podeu especificar quins serveis de systemd s'instal·laran i s'iniciaran a l'inici del sistema.

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Desa la configuració del sistema

Desem aquesta configuració mitjançant KConfig.

Aleshores desem la nostra defconfig:

make savedefconfig

Configuració del nucli de Linux

La configuració del nucli de Linux s'invoca amb l'ordre següent:

make linux-menuconfig

Afegiu suport per a la targeta de vídeo Virtualbox

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Afegiu el suport d'integració de Virtualbox Guest

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Guardem i sortim. IMPORTANT: la configuració es desarà a output/build/linux-$version/config però no a board/my_x86_board/linux.config

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Per tant, heu de copiar manualment la configuració a la ubicació d'emmagatzematge:

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

Després d'això, realitzarem un muntatge complet de tot el sistema. buildroot no reconstrueix el que ja s'ha construït, heu d'especificar manualment els paquets a reconstruir. Per no perdre temps i nervis, és més fàcil reconstruir un petit sistema en conjunt):

make clean;make

Un cop finalitzat el muntatge, iniciem VirtualBox (provat a les versions 5.2 i 6.0) amb l'arrencada des del disc de CD. Paràmetres del sistema:

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

A partir de la iso construïda:

Buildroot - Part 1: descripció general, construcció mínima del sistema, configuració del menú

Llista de materials utilitzats

  1. Manual de buildroot

Font: www.habr.com

Afegeix comentari