Buildroot — parte 2. Criação da configuração da sua placa; aplicação de external tree, rootfs-overlay, scripts pós-construção

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

No artigo anterior 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 files

Como 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 artigo

A 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.txt

A 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 menuconfig

No 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 artigo

Importante! Neste arquivo, os caminhos serão absolutos!

No menu, surgiu a opção External options:

Buildroot — parte 2. Criação da configuração da sua placa; aplicação de external tree, rootfs-overlay, scripts pós-construção

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.txt

Na seção Kernel, alteramos o caminho para a configuração do kernel:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.config

Agora, 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 overlay

O 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:

Buildroot — parte 2. Criação da configuração da sua placa; aplicação de external tree, rootfs-overlay, scripts pós-construção

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:

Buildroot — parte 2. Criação da configuração da sua placa; aplicação de external tree, rootfs-overlay, scripts pós-construção

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:

Buildroot — parte 2. Criação da configuração da sua placa; aplicação de external tree, rootfs-overlay, scripts pós-construção

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-release

Apó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:

  1. 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
  2. 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.
  3. 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

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster