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 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:
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ènciesmake <pkg>-graph-depends
construir l'arbre de dependències d'un paquet específicBR2_GRAPH_OUT=png make graph-build
traça un gràfic de temps de construcció amb sortida PNGmake 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:
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 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:
Creeu la vostra pròpia configuració de tauler
Afegint fitxers de la junta
Consulteu la llista de configuracions:
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):
Entrem a la primera secció Opcions de destinació. Aquí podeu seleccionar l'arquitectura de destinació per a la qual es realitzarà el muntatge.
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.
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:
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 (
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
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
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
Carregadors d'arrencada: l'elecció dels carregadors d'arrencada recollits. Trieu isolinix
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.
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
Afegiu el suport d'integració de Virtualbox Guest
Guardem i sortim. IMPORTANT: la configuració es desarà a output/build/linux-$version/config però no a board/my_x86_board/linux.config
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:
A partir de la iso construïda:
Llista de materials utilitzats
- Manual de buildroot
Font: www.habr.com