Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

introducción

En esta serie de artículos, quiero analizar el sistema de compilación de distribución buildroot y compartir mi experiencia en su personalización. Se adquirirá experiencia práctica en la creación de un sistema operativo pequeño con una interfaz gráfica y una funcionalidad mínima.

En primer lugar, no debes confundir el sistema de compilación y la distribución. Buildroot puede construir un sistema a partir de un conjunto de paquetes que se le ofrecen. Buildroot se basa en archivos MAKE y, por lo tanto, tiene enormes capacidades de personalización. ¿Reemplazar un paquete con otra versión, agregar su propio paquete, cambiar las reglas para crear un paquete, personalizar el sistema de archivos después de instalar todos los paquetes? buildroot puede hacer todo esto.

En Rusia se utiliza buildroot, pero en mi opinión hay poca información en ruso para principiantes.

El objetivo del trabajo es montar un kit de distribución con descarga en vivo, interfaz icewm y navegador. La plataforma de destino es virtualbox.

¿Por qué construir tu propia distribución? A menudo se necesita una funcionalidad limitada con recursos limitados. Aún más a menudo en la automatización es necesario crear firmware. Adaptar una distribución de propósito general eliminando paquetes innecesarios y convirtiéndolos en firmware requiere más trabajo que crear una nueva distribución. Usar Gentoo también tiene sus limitaciones.

El sistema Buildroot es muy poderoso, pero no hará nada por ti. Solo puede habilitar y automatizar el proceso de ensamblaje.

Los sistemas de construcción alternativos (yocto, sistema de construcción abierto y otros) no se consideran ni comparan.

Dónde conseguirlo y cómo empezar

Sitio web del proyecto - buildroot.org. Aquí puede descargar la versión actual y leer el manual. Allí puedes contactar con la comunidad, hay un rastreador de errores, listas de correo y un canal irc.

Buildroot opera defconfigs para la placa de destino de la compilación. Defconfig es un archivo de configuración que almacena sólo opciones que no tienen valores predeterminados. Es él quien determina qué se recaudará y cómo. En este caso, puede configurar por separado las configuraciones de los cargadores de arranque Busybox, Linux-kernel, uglibc, u-boot y barebox, pero todos estarán vinculados a la placa de destino.
Después de descomprimir el archivo descargado o clonarlo desde git, obtenemos un buildroot listo para usar. Puedes leer más sobre la estructura de directorios en el manual, te contaré los más importantes:

tablero — un directorio con archivos específicos de cada placa. Estos pueden ser scripts para formar imágenes del sistema (iso, sdcart, cpio y otros), un directorio superpuesto, configuración del kernel, etc.
configs - la configuración de configuración real de la placa. Defconfig es una configuración de placa incompleta. Almacena sólo parámetros que difieren de la configuración predeterminada.
dl — directorio con códigos fuente/archivos descargados para ensamblar
salida/objetivo — el sistema de archivos ensamblado del sistema operativo resultante. Posteriormente, se crean imágenes a partir de él para su descarga/instalación.
salida/host - utilidades de host para el montaje
salida/construcción - paquetes ensamblados

El ensamblaje se configura a través de KConfig. El mismo sistema se utiliza para construir el kernel de Linux. Lista de los comandos más utilizados (ejecutados en el directorio buildroot):

  • make menuconfig: llama a la configuración de compilación. También puedes usar la interfaz gráfica (make nconfig, make xconfig, make gconfig)
  • make linux-menuconfig: llama a la configuración del kernel.
  • make clean: limpia los resultados de la compilación (todo lo almacenado en la salida)
  • hacer - construir un sistema. Esto no vuelve a ensamblar procesos ya ensamblados.
  • make defconfig_name - cambia la configuración a un defconfig específico
  • make list-defconfigs: muestra una lista de defconfigs
  • crear fuente: simplemente descargue los archivos de instalación, sin compilar.
  • hacer ayuda - enumerar posibles comandos

Notas importantes y consejos útiles

¡Buildroot no reconstruye paquetes que ya han sido creados! Por lo tanto, puede surgir una situación en la que sea necesario un reensamblaje completo.

Puede reconstruir un paquete separado con el comando hacer reconstrucción del nombre del paquete. Por ejemplo, puedes reconstruir el kernel de Linux:

make linux-rebuild

Buildroot almacena el estado de cualquier paquete creando archivos .stamp en el directorio salida/build/$nombredelpaquete:

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Por lo tanto, puedes reconstruir root-fs e imágenes sin reconstruir 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 tiene un conjunto de variables para una fácil configuración

  • $TOPDIR - directorio raíz de compilación
  • $BASEDIR - directorio de SALIDA
  • $HOST_DIR, $STAGING_DIR, $TARGET_DIR: directorios de compilación de host fs, staging fs y target fs.
  • $BUILD_DIR - directorio con paquetes descomprimidos y compilados

Visualización

buildroot tiene una función de visualización: puede crear un diagrama de dependencia, un gráfico de tiempo de compilación y un gráfico de tamaños de paquetes en el sistema final. Los resultados están en forma de archivos pdf (puede elegir entre svn,png) en el directorio de salida/gráfico.

Ejemplos de comandos de visualización:

  • make graph-depends construir árbol de dependencia
  • make <pkg>-graph-depends construir un árbol de dependencia para un paquete específico
  • BR2_GRAPH_OUT=png make graph-build tiempo de construcción de la trama con salida PNG
  • make graph-size tamaño del paquete de trama

Guiones útiles

Hay un subdirectorio en el directorio buildroot. utils con guiones útiles. Por ejemplo, existe un script que comprueba la exactitud de las descripciones de los paquetes. Esto puede resultar útil al agregar sus propios paquetes (lo haré más adelante). El archivo utils/readme.txt contiene una descripción de estos scripts.

Construyamos una distribución de acciones.

Es importante recordar que todas las operaciones se realizan en nombre de un usuario normal, no de root.
Todos los comandos se ejecutan en buildroot. El paquete buildroot ya incluye un conjunto de configuraciones para muchas placas y virtualización comunes.

Veamos la lista de configuraciones:

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Cambie a la configuración qemu_x86_64_defconfig

make qemu_x86_64_defconfig

Y empezamos el montaje.

make

La compilación se completa con éxito, mira los resultados:

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Buildroot ha compilado imágenes que puedes ejecutar en Qemu y verificar que funcionan.

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

El resultado es un sistema ejecutándose en qemu:

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Creando tu propia configuración de placa

Agregar archivos de tablero

Veamos la lista de configuraciones:

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

En la lista vemos pc_x86_64_efi_defconfig. Crearemos nuestro propio tablero copiándolo desde la configuración:

cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig

Creemos inmediatamente un directorio de placa para almacenar nuestros scripts, rootfs-overlay y otros archivos necesarios:

mkdir board/my_x86_board

Cambie a esta configuración defconfig:

make my_x86_board_defconfig

Por lo tanto, ahora la configuración de compilación (almacenada en .config en la raíz del directorio buildroot) corresponde a la máquina de destino de arranque heredada (bios) x86-64.

Copiemos la configuración del kernel de Linux (útil más adelante):

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

Configuración de parámetros de compilación a través de KConfig

Comencemos la configuración:

make menuconfig 

Se abrirá la ventana de KConfig. Es posible configurar con una interfaz gráfica (make nconfig, make xconfig, make gconfig):

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Entramos en el primer apartado Opciones de destino. Aquí puede seleccionar la arquitectura de destino para la cual se llevará a cabo la construcción.

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Opciones de compilación: aquí hay varias configuraciones de compilación. Puede especificar directorios con códigos fuente, la cantidad de subprocesos de compilación, espejos para descargar códigos fuente y otras configuraciones. Dejemos la configuración por defecto.

Cadena de herramientas: las herramientas de compilación se configuran aquí. Lea más sobre él.

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Tipo de cadena de herramientas: tipo de cadena de herramientas utilizada. Puede ser una cadena de herramientas integrada en buildroot o una externa (puede especificar el directorio con el ya creado o la URL para descargar). Hay opciones adicionales para diferentes arquitecturas. Por ejemplo, para el brazo, simplemente puede seleccionar la versión Linaro de la cadena de herramientas externa.

Biblioteca C: selección de la biblioteca C. De esto depende el funcionamiento de todo el sistema. Normalmente se utiliza glibc, que admite todas las funciones posibles. Pero puede ser demasiado grande para un sistema integrado, por lo que a menudo se eligen uglibc o musl. Seleccionaremos glibc (esto será necesario más adelante para usar systemd).

Serie de encabezados de kernel y encabezados de kernel personalizados: deben coincidir con la versión del kernel que estará en el sistema ensamblado. Para los encabezados del kernel, también puede especificar la ruta al repositorio tarball o git.

VERSIONES DEL COMPILADOR GCC: seleccione la versión del compilador que se utilizará para la compilación
Habilite la compatibilidad con C++: seleccione compilar con compatibilidad con bibliotecas de C++ en el sistema. Esto nos será útil en el futuro.

Opciones adicionales de gcc: puede configurar opciones adicionales del compilador. No lo necesitamos por ahora.

La configuración del sistema le permite establecer parámetros futuros del sistema creado:

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

La mayoría de los puntos quedan claros en el título. Prestemos atención a los siguientes puntos:
Ruta a las tablas de usuarios - tabla con los usuarios a crear (https://buildroot.org/downloads/manual/manual.html#makeuser-syntax).

Archivo de ejemplo. El usuario usuario se creará con la contraseña admin, automáticamente gid/uid, /bin/sh shell, usuario de grupo predeterminado, miembro raíz del grupo, comentario usuario Foo.

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

Directorios superpuestos del sistema de archivos raíz: directorio superpuesto sobre el target-fs ensamblado. Agrega nuevos archivos y reemplaza los existentes.

Scripts personalizados para ejecutar antes de crear imágenes del sistema de archivos: scripts ejecutados inmediatamente antes de plegar el sistema de archivos en imágenes. Dejemos el guión vacío por ahora.

Vayamos a la sección Kernel

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

La configuración del kernel se establece aquí. El kernel en sí se configura mediante make linux-menuconfig.
Puede configurar la versión del kernel de diferentes maneras: seleccione entre las ofrecidas, ingrese la versión manualmente, especifique un repositorio o un archivo tar listo para usar.

Configuración del kernel: ruta a la configuración del kernel. Puede seleccionar la configuración predeterminada para la arquitectura seleccionada o defocnfig desde Linux. El código fuente de Linux contiene un conjunto de configuraciones defconfig para diferentes sistemas de destino. Puedes encontrar el que necesitas mirando directamente las fuentes aquí. Por ejemplo, para una pizarra negra de hueso de beagle puedes seleccione configuración.

La sección Paquetes de destino le permite seleccionar qué paquetes se instalarán en el sistema que se está construyendo. Dejémoslo sin cambios por ahora. Agregaremos nuestros paquetes a esta lista más adelante.
Imágenes del sistema de archivos: una lista de imágenes del sistema de archivos que se recopilarán. Agregar una imagen iso

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Cargadores de arranque: selección de cargadores de arranque para recopilar. Elijamos isolinix

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Configurando Systemd

Systemd se está convirtiendo en uno de los pilares de Linux, junto con kernel y glibc. Por lo tanto, moví su configuración a un elemento separado.

Configurado a través de make menuconfig, luego Paquetes de destino → Herramientas del sistema → systemd. Aquí puede especificar qué servicios systemd se instalarán e iniciarán cuando se inicie el sistema.

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Guardar la configuración del sistema

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

Luego guarde nuestro defconfig:

make savedefconfig

Configuración del núcleo de Linux

La configuración del kernel de Linux se invoca con el siguiente comando:

make linux-menuconfig

Agreguemos soporte para la tarjeta de video Virtualbox.

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Agreguemos soporte de integración de Virtualbox Guest

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Guardar y Salir. IMPORTANTE: la configuración se guardará en salida/build/linux-$version/config, pero no en board/my_x86_board/linux.config

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Por lo tanto, debes copiar manualmente la configuración a una ubicación de almacenamiento:

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

Después de lo cual realizaremos un reensamblaje completo de todo el sistema. buildroot no reconstruye lo que ya se ha creado; debe especificar manualmente los paquetes para la reconstrucción. Para no perder tiempo y nervios, es más fácil reconstruir un sistema pequeño por completo):

make clean;make

Al finalizar la compilación, inicie VirtualBox (probado en las versiones 5.2 y 6.0) arrancando desde el CD.Parámetros del sistema:

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Ejecutando desde la ISO ensamblada:

Buildroot - parte 1. Información general, montaje de un sistema mínimo, configuración a través del menú

Lista de materiales utilizados

  1. manual de compilación raíz

Fuente: habr.com

Añadir un comentario