Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Introdución

Nesta serie de artigos, quero ver o sistema de compilación da distribución buildroot e compartir a miña experiencia na súa personalización. Haberá experiencia práctica na creación dun sistema operativo pequeno cunha interface gráfica e unha funcionalidade mínima.

En primeiro lugar, non debes confundir o sistema de compilación e a distribución. Buildroot pode construír un sistema a partir dun conxunto de paquetes que se lle ofrecen. Buildroot está construído sobre makefiles e, polo tanto, ten enormes capacidades de personalización. Substitúe un paquete por outra versión, engade o teu propio paquete, cambia as regras para construír un paquete, personaliza o sistema de ficheiros despois de instalar todos os paquetes? buildroot pode facer todo isto.

En Rusia utilízase buildroot, pero na miña opinión hai pouca información en ruso para principiantes.

O obxectivo do traballo é montar un kit de distribución con descarga en directo, interface icewm e navegador. A plataforma de destino é virtualbox.

Por que construír a súa propia distribución? Moitas veces é necesaria unha funcionalidade limitada con recursos limitados. Aínda máis frecuentemente na automatización necesitas crear firmware. Adaptar unha distribución de propósito xeral limpando paquetes innecesarios e converténdoa en firmware é máis laborioso que construír unha nova distribución. Usar Gentoo tamén ten as súas limitacións.

O sistema Buildroot é moi poderoso, pero non fará nada por ti. Só pode activar e automatizar o proceso de montaxe.

Os sistemas de compilación alternativos (yocto, open build system e outros) non se consideran nin se comparan.

Onde conseguilo e como comezar

Páxina web do proxecto - buildroot.org. Aquí podes descargar a versión actual e ler o manual. Alí podes contactar coa comunidade, hai un rastreador de erros, listas de correo e unha canle irc.

Buildroot opera defconfigs para o taboleiro de destino da compilación. Defconfig é un ficheiro de configuración que almacena só opcións que non teñen valores predeterminados. É el quen determina o que se recollerá e como. Neste caso, pode configurar por separado as configuracións dos cargadores de arranque busybox, linux-kernel, uglibc, u-boot e barebox, pero todas estarán ligadas ao taboleiro de destino.
Despois de desempaquetar o arquivo descargado ou clonar desde git, obtemos un buildroot listo para usar. Podes ler máis sobre a estrutura do directorio no manual; vouche falar dos máis importantes:

placa — un directorio con ficheiros específicos de cada placa. Estes poden ser scripts para formar imaxes do sistema (iso, sdcart, cpio e outros), un directorio de superposición, configuración do núcleo, etc.
config — a configuración real do taboleiro. Defconfig é unha configuración de placa incompleta. Almacena só os parámetros que difiren da configuración predeterminada
dl — directorio con códigos fonte descargados/ficheiros para a montaxe
saída/obxectivo — o sistema de ficheiros ensamblado do SO resultante. Posteriormente, créanse imaxes a partir del para a súa descarga/instalación
saída/host - utilidades host para a montaxe
saída/construción - paquetes montados

O conxunto está configurado mediante KConfig. O mesmo sistema úsase para construír o núcleo de Linux. Lista dos comandos máis utilizados (executados no directorio buildroot):

  • make menuconfig: chame á configuración de compilación. Tamén podes usar a interface gráfica (make nconfig, make xconfig, make gconfig)
  • make linux-menuconfig - chame a configuración do núcleo.
  • make clean - limpa os resultados da compilación (todo o almacenado na saída)
  • facer - construír un sistema. Isto non remonta os procesos xa montados.
  • make defconfig_name: cambia a configuración a un defconfig específico
  • make list-defconfigs: mostra unha lista de defconfigs
  • facer fonte: só tes que descargar os ficheiros de instalación sen construír.
  • make help: enumera os posibles comandos

Notas importantes e consellos útiles

Buildroot non reconstruír paquetes que xa foron construídos! Polo tanto, pode xurdir unha situación na que se requira unha montaxe completa.

Podes reconstruír un paquete separado co comando facer paquetename-rebuild. Por exemplo, pode reconstruír o núcleo de Linux:

make linux-rebuild

Buildroot almacena o estado de calquera paquete creando ficheiros .stamp no directorio output/build/$packagename:

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Polo tanto, pode reconstruír root-fs e imaxes sen reconstruír paquetes:

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

Variables útiles

buildroot ten un conxunto de variables para facilitar a súa configuración

  • $TOPDIR - directorio buildroot
  • $BASEDIR - directorio OUTPUT
  • $HOST_DIR, $STAGING_DIR, $TARGET_DIR — host fs, staging fs, destino fs directorios de compilación.
  • $BUILD_DIR - directorio con paquetes descomprimidos e construídos

Visualización

buildroot ten unha función de visualización. Podes crear un diagrama de dependencias, un gráfico de tempo de compilación e un gráfico de tamaños de paquetes no sistema final. Os resultados están en forma de ficheiros pdf (podes escoller entre svn,png) no directorio saída/gráfico.

Exemplos de comandos de visualización:

  • make graph-depends construír unha árbore de dependencias
  • make <pkg>-graph-depends construír unha árbore de dependencias para un paquete específico
  • BR2_GRAPH_OUT=png make graph-build trazar o tempo de construción con saída PNG
  • make graph-size tamaño do paquete de trazado

Guións útiles

Hai un subdirectorio no directorio buildroot útiles con guións útiles. Por exemplo, hai un script que verifica a corrección das descricións dos paquetes. Isto pode ser útil ao engadir os teus propios paquetes (fareino máis tarde). O ficheiro utils/readme.txt contén unha descrición destes scripts.

Imos construír unha distribución de accións

É importante lembrar que todas as operacións realízanse en nome dun usuario normal, non root.
Todos os comandos execútanse no buildroot. O paquete buildroot xa inclúe un conxunto de configuracións para moitas placas comúns e virtualización.

Vexamos a lista de configuracións:

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Cambie á configuración qemu_x86_64_defconfig

make qemu_x86_64_defconfig

E comezamos a montaxe

make

A compilación rematou correctamente, mira os resultados:

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Buildroot compilou imaxes que pode executar en Qemu e verificar que funcionan.

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

O resultado é un sistema que se executa en qemu:

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Creando a súa propia configuración de placa

Engadindo ficheiros do taboleiro

Vexamos a lista de configuracións:

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Na lista vemos pc_x86_64_efi_defconfig. Crearemos o noso propio taboleiro copiándoo desde a configuración:

cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig

Imos crear inmediatamente un directorio do taboleiro para almacenar os nosos scripts, rootfs-overlay e outros ficheiros necesarios:

mkdir board/my_x86_board

Cambia a este defconfig:

make my_x86_board_defconfig

Así, agora a configuración de compilación (almacenada en .config na raíz do directorio buildroot) corresponde á máquina de destino de arranque x86-64 legacy(bios).

Imos copiar a configuración do núcleo de linux (útil máis tarde):

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

Establecer parámetros de compilación mediante KConfig

Imos comezar a configuración:

make menuconfig 

Abrirase a xanela de KConfig. É posible configurar cunha interface gráfica (make nconfig, make xconfig, make gconfig):

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Entramos na primeira sección Opcións de destino. Aquí pode seleccionar a arquitectura de destino para a que se realizará a construción.

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Opcións de compilación: aquí hai varias opcións de compilación. Podes especificar directorios con códigos fonte, o número de fíos de compilación, réplicas para descargar códigos fonte e outras opcións. Deixemos a configuración por defecto.

Cadea de ferramentas: aquí configúranse as propias ferramentas de construción. Ler máis sobre el.

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Tipo de cadea de ferramentas: tipo de cadea de ferramentas utilizada. Esta pode ser unha cadea de ferramentas integrada en buildroot ou externa (podes especificar o directorio co xa construído ou o URL para descargar). Hai opcións adicionais para diferentes arquitecturas. Por exemplo, para brazo pode simplemente seleccionar a versión Linaro da cadea de ferramentas externa.

Biblioteca C: selección da biblioteca C. O funcionamento de todo o sistema depende diso. Normalmente, úsase glibc, que admite todas as funcións posibles. Pero pode ser demasiado grande para un sistema integrado, polo que adoitan escollerse uglibc ou musl. Seleccionaremos glibc (iso será necesario máis adiante para usar systemd).

Serie Cabeceiras do núcleo e Cabeceiras do núcleo personalizadas: deben coincidir coa versión do núcleo que estará no sistema ensamblado. Para as cabeceiras do núcleo, tamén pode especificar o camiño ao repositorio tarball ou git.

VERSIÓNS DO COMPILADOR GCC: seleccione a versión do compilador que se utilizará para a creación
Activar compatibilidade con C++: seleccione para compilar con soporte para bibliotecas C++ no sistema. Isto será útil para nós no futuro.

Opcións adicionais de gcc: pode configurar opcións adicionais do compilador. Non o necesitamos polo momento.

A configuración do sistema permítelle configurar futuros parámetros do sistema creado:

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

A maioría dos puntos están claros polo título. Prestemos atención aos seguintes puntos:
Camiño ás táboas de usuarios: táboa cos usuarios que se van crear (https://buildroot.org/downloads/manual/manual.html#makeuser-syntax).

Ficheiro de exemplo. O usuario usuario crearase co contrasinal admin, automaticamente gid/uid, /bin/sh shell, usuario de grupo predeterminado, root membro do grupo, usuario Foo de comentarios

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

Directorios de superposición do sistema de ficheiros raíz: directorio superposto enriba do target-fs ensamblado. Engade novos ficheiros e substitúe os existentes.

Scripts personalizados para executar antes de crear imaxes do sistema de ficheiros - Scripts executados inmediatamente antes de dobrar o sistema de ficheiros en imaxes. Deixemos o guión baleiro polo momento.

Imos á sección Kernel

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

A configuración do núcleo está definida aquí. O propio núcleo está configurado mediante make linux-menuconfig.
Pode configurar a versión do núcleo de diferentes xeitos: seleccione entre as que se ofrecen, introduza a versión manualmente, especifique un repositorio ou un tarball preparado.

Configuración do núcleo: camiño á configuración do núcleo. Pode seleccionar a configuración predeterminada para a arquitectura seleccionada ou defocnfig desde Linux. A fonte de Linux contén un conxunto de defconfigs para diferentes sistemas de destino. Podes atopar o que necesitas mirando directamente as fontes aquí. Por exemplo, para unha pizarra negra de óso de beagle podes seleccione config.

A sección Paquetes de destino permítelle seleccionar que paquetes se instalarán no sistema que se está a construír. Deixemos por agora sen cambios. Engadiremos os nosos paquetes a esta lista máis tarde.
Imaxes do sistema de ficheiros: unha lista de imaxes do sistema de ficheiros que se recollerán. Engade unha imaxe iso

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Cargadores de arranque: selección de cargadores de arranque para recoller. Imos escoller isolinix

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Configuración de Systemd

Systemd estase a converter nun dos piares de Linux, xunto co núcleo e a glibc. Polo tanto, mudei a súa configuración a un elemento separado.

Configurado mediante make menuconfig, despois Paquetes de destino → Ferramentas do sistema → systemd. Aquí pode especificar que servizos systemd se instalarán e se iniciarán cando se inicie o sistema.

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Gardando a configuración do sistema

Gardamos esta configuración a través de KConfig.

A continuación, garda o noso defconfig:

make savedefconfig

Configuración do núcleo de Linux

A configuración do núcleo de Linux invócase co seguinte comando:

make linux-menuconfig

Engademos soporte para a tarxeta de vídeo Virtualbox

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Engademos soporte para a integración de Virtualbox Guest

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Garda e sae. IMPORTANTE: a configuración gardarase en output/build/linux-$version/config, pero non en board/my_x86_board/linux.config

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Polo tanto, cómpre copiar manualmente a configuración nun lugar de almacenamento:

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

Despois diso, realizaremos unha montaxe completa de todo o sistema. buildroot non reconstruíu o que xa foi construído, debes especificar manualmente os paquetes para reconstruír. Para non perder tempo e nervios, é máis fácil reconstruír un pequeno sistema por completo):

make clean;make

Ao completar a montaxe, inicie VirtualBox (probado nas versións 5.2 e 6.0) iniciando desde o CD. Parámetros do sistema:

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Executando desde a iso ensamblada:

Buildroot - parte 1. Información xeral, montaxe dun sistema mínimo, configuración a través do menú

Lista de materiais empregados

  1. Manual de buildroot

Fonte: www.habr.com

Engadir un comentario