Nesta seção, abordo algumas das opções de personalização que foram necessárias para mim. Esta não é uma lista completa do que o buildroot oferece, mas são funcionais e não requerem intervenção nos arquivos do próprio buildroot.
Uso do mecanismo EXTERNAL para personalização
considerou-se um exemplo simples de adição da sua configuração, através da inclusão do defconfig da placa e dos arquivos necessários diretamente no diretório do Buildroot.
Mas esse método não é muito conveniente, especialmente ao atualizar o buildroot. Para resolver este problema, existe o mecanismo external tree. A essência dele é que em um diretório separado, você pode armazenar os diretórios board, configs, packages e outros (por exemplo, eu uso um diretório patches para aplicar patches em pacotes, mais detalhes em uma seção separada) e o buildroot irá adicioná-los automaticamente ao que já existe em seu diretório.
Observação: é possível aplicar vários external trees ao mesmo tempo, há um exemplo no manual do buildroot
Vamos criar um diretório my_tree, localizado ao lado do diretório do buildroot e transferir nossa configuração para lá. No final, devemos obter a seguinte estrutura de arquivos:
[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 directories, 7 filesComo pode ser visto, a estrutura geral repete a estrutura do buildroot.
Diretório board contém arquivos específicos de cada placa no nosso caso:
- bef_cr_fs_img.sh — um script que será executado após a construção do sistema de arquivos target, mas antes de empacotá-lo em imagens. Mais tarde, iremos utilizá-lo
- linux.config — configuração do kernel
- rootfs_overlay — diretório para sobrepor ao sistema de arquivos target
- users.txt — arquivo com a descrição dos usuários a serem criados
Diretório configs contém os defconfigs das nossas placas. Temos apenas um.
Pacote — um diretório com nossos pacotes. Inicialmente, o buildroot contém descrições e regras de construção de um número limitado de pacotes. Posteriormente, adicionaremos aqui o gerenciador de janelas icewm e o gerenciador de login gráfico Slim.
Patches — permite armazenar convenientemente seus patches para diferentes pacotes. Mais detalhes em uma seção separada adiante.
Agora precisamos adicionar os arquivos de descrição do nosso external tree. Para isso, existem 3 arquivos: external.desc, Config.in, external.mk.
external.desc contém na verdade a descrição:
[alexey@alexey-pc my_tree]$ cat external.desc
name: my_tree
desc: Minha árvore externa simples para o artigoA primeira linha é o título. No futuro, o buildroot criará uma variável $(BR2_EXTERNAL_MY_TREE_PATH), que deverá ser utilizada na configuração da construção. Por exemplo, o caminho para o arquivo com os usuários pode ser definido da seguinte forma:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txtA segunda linha é uma descrição breve e compreensível.
Config.in, external.mk — arquivos para descrever os pacotes adicionados. Se não forem adicionados pacotes próprios, esses arquivos podem ser deixados vazios. Por enquanto, faremos isso.
Agora temos nosso external-tree pronto, contendo o defconfig da nossa placa e os arquivos necessários. Vamos ao diretório buildroot e especificamos o uso do external-tree:
[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# configuração gravada em /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfigNo primeiro comando, usamos o argumento BR2_EXTERNAL=../my_tree/, que indica o uso do external tree. É possível especificar vários external-trees ao mesmo tempo. Para isso, basta fazer isso uma vez, após o que um arquivo output/.br-external.mk será criado, armazenando informações sobre o external-tree utilizado:
[alexey@alexey-pc buildroot]$ cat output/.br-external.mk
#
# Arquivo gerado automaticamente; NÃO EDITE.
#
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 = Minha árvore externa simples para o artigoImportante! Neste arquivo, os caminhos serão absolutos!
No menu, surgiu a opção External options:

Neste sub-menu estarão nossos pacotes do nosso external-tree. Neste momento, esta seção está vazia.
Agora, o mais importante é reescrever os caminhos necessários para utilizar o external-tree.
Note que na seção Build options → Location to save buildroot config, haverá um caminho absoluto para o defconfig salvo. Ele é formado no momento em que se especifica o uso do external_tree.
Além disso, na seção System configuration, vamos corrigir os caminhos. Para a tabela com os usuários criados:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txtNa seção Kernel, alteramos o caminho para a configuração do kernel:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.configAgora, durante a construção, nossos arquivos do external-tree serão utilizados. Ao transferir para outro diretório ou atualizar o buildroot, teremos o mínimo de problemas.
Adicionando root fs overlay:
Este mecanismo permite adicionar/substituir arquivos facilmente no sistema de fichiers do target.
Se um arquivo existir no root fs overlay, mas não no target, ele será adicionado.
Se o arquivo estiver presente no overlay do sistema de arquivos root e no target, ele será substituído.
Primeiro, vamos definir o caminho para o diretório do overlay do sistema de arquivos root. Isso é feito na seção Configuração do Sistema → Diretórios do overlay do sistema de arquivos root:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/Agora vamos criar dois arquivos.
[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 é um novo arquivo do overlayO primeiro arquivo (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) substituirá o arquivo /etc/hosts no sistema final. O segundo arquivo (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) será adicionado.
Construindo e verificando:

Execução de scripts de personalização em diferentes etapas da construção do sistema
Ocasionalmente, é necessário realizar algumas ações dentro do sistema de arquivos target antes que ele seja empacotado em imagens.
Isso pode ser feito na seção Configuração do Sistema:

Os dois primeiros scripts são executados após a construção do sistema de arquivos target, mas antes de empacotá-lo em imagens. A diferença é que o script fakeroot é executado no contexto de fakeroot, ou seja, simula a operação do usuário root.
O último script é executado já após a criação das imagens do sistema. Nele, podem ser executadas ações adicionais, como copiar arquivos necessários para um servidor NFS ou criar a imagem do firmware do dispositivo.
Como exemplo, vou criar um script que escreverá a versão e a data da construção em /etc/.
Primeiro, vou indicar o caminho para este arquivo na minha árvore externa:

E agora o próprio script:
[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-releaseApós a construção, este arquivo pode ser encontrado no sistema.
Na prática, o script pode ficar bastante extenso. Portanto, em um projeto real, optei por uma abordagem mais avançada:
- Criei um diretório (my_tree/board_my_x86_board/inside_fakeroot_scripts), onde os scripts para execução estão organizados com números sequenciais. Por exemplo, 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
- Escrevi um script (my_tree/board_my_x86_board/run_inside_fakeroot.sh) que percorre este diretório e executa sequencialmente os scripts que nele estão.
- Indiquei este script nas configurações da placa na seção Configuração do Sistema → Scripts personalizados para executar dentro do ambiente fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)
Fonte: habr.com
