En esta sección, examino algunas de las posibilidades de personalización que necesitaba. Esta no es una lista completa de lo que ofrece buildroot, pero son bastante funcionales y no requieren intervención en los archivos del propio buildroot.
Uso del mecanismo EXTERNAL para la personalización
se trató un ejemplo sencillo de agregar su propia configuración, mediante la adición del defconfig de la placa y los archivos necesarios directamente en el directorio de Buildroot.
Pero este método no es muy conveniente, especialmente al actualizar buildroot. Para resolver este problema existe el mecanismo external tree. La esencia es que en un directorio separado se pueden almacenar los directorios board, configs, packages y otros (por ejemplo, utilizo un directorio patches para aplicar parches a los paquetes, más detalles en una sección separada), y buildroot los añadirá automáticamente a los que ya tiene en su directorio.
Nota: se pueden aplicar varios external tree a la vez, hay un ejemplo en la guía de buildroot
Crearemos un directorio my_tree, que se ubicará junto al directorio de buildroot y trasladaremos nuestra configuración allí. En salida deberíamos obtener la siguiente estructura de archivos:
[alexey@alexey-pc my_tree]$ tree
.
├── board
│ └── my_x86_board
│ ├── bef_cr_fs_img.sh
│ ├── linux.config
│ ├── rootfs_overlay
│ └── users.txt
├── Config.in
├── configs
│ └── my_x86_board_defconfig
├── external.desc
├── external.mk
├── package
└── patches
6 directorios, 7 archivosComo se puede ver, en general la estructura repite la estructura de buildroot.
Directorio board contiene archivos específicos para cada placa en nuestro caso:
- bef_cr_fs_img.sh — script que se ejecutará después de construir el sistema de archivos objetivo, pero antes de empaquetarlo en imágenes. Más adelante lo utilizaremos
- linux.config — configuración del núcleo
- rootfs_overlay — directorio para superponer sobre el sistema de archivos objetivo
- users.txt — archivo con la descripción de los usuarios a crear
Directorio configs contiene los defconfigs de nuestras placas. En nuestro caso, solo tenemos uno.
Package — directorio con nuestros paquetes. Originalmente, buildroot contiene descripciones y reglas de construcción para un número limitado de paquetes. Más adelante añadiremos aquí el gestor de ventanas icewm y el gestor de inicio de sesión gráfico Slim.
Patches — permite almacenar fácilmente nuestros parches para diferentes paquetes. Más detalles en una sección separada más adelante.
Ahora necesitamos agregar los archivos de descripción de nuestro external-tree. Esto se realiza con 3 archivos: external.desc, Config.in, external.mk.
external.desc contiene la descripción en sí:
[alexey@alexey-pc my_tree]$ cat external.desc
name: my_tree
desc: Mi simple external-tree para el artículoLa primera línea es el nombre. Más adelante, buildroot creará una variable $(BR2_EXTERNAL_MY_TREE_PATH), que deberá utilizarse al configurar la compilación. Por ejemplo, la ruta al archivo con los usuarios se puede establecer de la siguiente manera:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txtLa segunda línea es una descripción breve y comprensible para las personas.
Config.in, external.mk son archivos para describir los paquetes que se agregan. Si no se añaden paquetes propios, estos archivos se pueden dejar vacíos. Por ahora, haremos así.
Ahora tenemos nuestro external-tree listo, que contiene el defconfig de nuestra placa y los archivos necesarios. Pasemos al directorio de buildroot y especificamos usar el external-tree:
[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# configuración escrita en /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfigEn el primer comando utilizamos el argumento BR2_EXTERNAL=../my_tree/, que indica el uso del external tree. Se pueden especificar varios external-tree para usar a la vez. Basta con hacerlo una vez, tras lo cual se genera el archivo output/.br-external.mk, que almacena información sobre el external-tree utilizado:
[alexey@alexey-pc buildroot]$ cat output/.br-external.mk
#
# Archivo generado automáticamente; NO EDITAR.
#
BR2_EXTERNAL ?= /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_NAMES =
BR2_EXTERNAL_DIRS =
BR2_EXTERNAL_MKS =
BR2_EXTERNAL_NAMES += my_tree
BR2_EXTERNAL_DIRS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_MKS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree/external.mk
export BR2_EXTERNAL_my_tree_PATH = /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
export BR2_EXTERNAL_my_tree_DESC = Mi simple external-tree para el artículo¡Importante! En este archivo, las rutas serán absolutas.
En el menú apareció la opción External options:

En este submenú estarán nuestros paquetes de nuestro external-tree. Ahora esta sección está vacía.
Ahora es más importante reescribir las rutas necesarias para usar el external-tree.
Tenga en cuenta que en la sección Build options → Location to save buildroot config, habrá una ruta absoluta al defconfig guardado. Se forma en el momento de especificar el uso del external_tree.
También en la sección System configuration ajustaremos las rutas. Para la tabla de usuarios creados:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txtEn la sección Kernel cambiaremos la ruta a la configuración del núcleo:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.configAhora, al ensamblar, utilizaremos nuestros archivos de nuestro external-tree. Al trasladar a otro directorio o actualizar buildroot, tendremos un mínimo de problemas.
Adición de root fs overlay:
Este mecanismo permite agregar/reemplazar fácilmente archivos en el sistema de archivos objetivo.
Si el archivo está en root fs overlay, pero no en el objetivo, se añadirá.
Si el archivo está en root fs overlay y en el objetivo, será reemplazado.
Primero estableceremos la ruta al directorio root fs overlay. Esto se hace en la sección Configuración del sistema → Directorios de superposición del sistema de archivos raíz:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/Ahora procederemos a crear dos archivos.
[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/etc/hosts
127.0.0.1 localhost
127.0.1.1 my_small_linux
8.8.8.8 google-public-dns-a.google.com.
[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt
Este es un nuevo archivo de la superposición.El primer archivo (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) reemplazará el archivo /etc/hosts en el sistema preparado. El segundo archivo (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) se añadirá.
Compilamos y verificamos:

Ejecución de scripts de personalización en diferentes etapas de la construcción del sistema.
A menudo es necesario realizar algunas acciones dentro del sistema de archivos objetivo antes de empaquetarlo en imágenes.
Esto se puede hacer en la sección Configuración del sistema:

Los primeros dos scripts se ejecutan después de construir el sistema de archivos objetivo, pero antes de empaquetarlo en imágenes. La diferencia es que el script fakeroot se ejecuta en el contexto de fakeroot, es decir, simula el trabajo del usuario root.
El último script se ejecuta después de crear las imágenes del sistema. En él se pueden realizar acciones adicionales, como copiar archivos necesarios a un servidor NFS o crear la imagen de firmware de su dispositivo.
Como ejemplo, crearé un script que escriba la versión y la fecha de construcción en /etc/.
Primero especificaré la ruta a este archivo en mi external-tree:

Y ahora el script en sí:
[alexey@alexey-pc buildroot]$ cat ../my_tree/board/my_x86_board/bef_cr_fs_img.sh
#! /bin/sh
echo "my small linux 1.0 pre alpha" > output/target/etc/mysmalllinux-release
date >> output/target/etc/mysmalllinux-releaseDespués de la construcción, se puede ver este archivo en el sistema.
En la práctica, el script puede volverse grande. Por lo tanto, en un proyecto real opté por un camino más avanzado:
- Creé un directorio (my_tree/board_my_x86_board/inside_fakeroot_scripts), donde hay scripts para ejecutar, con números de orden. Por ejemplo, 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
- Escribí un script (my_tree/board_my_x86_board/run_inside_fakeroot.sh), que recorre este directorio y ejecuta secuencialmente los scripts que contiene.
- Especificé este script en la configuración de la placa en la sección Configuración del sistema -> Scripts personalizados para ejecutar dentro del entorno fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh).
Fuente: habr.com
