Buildroot - parte 2. Criando a configuração da sua placa; usando árvore externa, sobreposição de rootfs, scripts pós-construção

Nesta seção, examino algumas das opções de personalização de que precisava. Esta não é uma lista completa do que o buildroot oferece, mas são bastante funcionais e não requerem intervenção nos arquivos do próprio buildroot.

Usando o mecanismo EXTERNAL para personalização

Em um artigo anterior Vimos um exemplo simples de como adicionar sua própria configuração adicionando o defconfig da placa e os arquivos necessários diretamente ao diretório Buildroot.

Mas este método não é muito conveniente, especialmente ao atualizar o buildroot. Existe um mecanismo para resolver este problema árvore externa. Sua essência é que você pode armazenar placas, configurações, pacotes e outros diretórios em um diretório separado (por exemplo, eu uso o diretório patches para aplicar patches a pacotes, mais detalhes em uma seção separada) e o próprio buildroot irá adicioná-los àqueles em seu diretório.

Nota: você pode sobrepor várias árvores externas ao mesmo tempo, há um exemplo no manual do buildroot

Vamos criar um diretório my_tree, localizado próximo ao diretório buildroot e transferir nossa configuração para lá. A saída deve ser a seguinte estrutura de arquivo:

[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 você pode ver, em geral a estrutura repete a estrutura do buildroot.

Каталог borda contém arquivos específicos para cada placa no nosso caso:

  • bef_cr_fs_img.sh é um script que será executado após a construção do sistema de arquivos de destino, mas antes de empacotá-lo em imagens. Vamos usá-lo no futuro
  • linux.config - configuração do kernel
  • rootfs_overlay - diretório para sobrepor no sistema de arquivos de destino
  • users.txt - um arquivo que descreve os usuários a serem criados

Каталог configs contém defconfig de nossas placas. Nós só temos um.

Pacote - catalogar com nossos pacotes. Inicialmente, buildroot contém descrições e regras para construir um número limitado de pacotes. Mais tarde adicionaremos o gerenciador de janelas icewm e o gerenciador de login gráfico Slim aqui.
Patches — permite armazenar convenientemente seus patches para diferentes pacotes. Mais detalhes em uma seção separada abaixo.
Agora precisamos adicionar os arquivos de descrição para nossa árvore externa. Existem 3 arquivos responsáveis ​​por isso: external.desc, Config.in, external.mk.

externo.desc contém a descrição real:

[alexey@alexey-pc my_tree]$ cat external.desc 
name: my_tree
desc: My simple external-tree for article

A primeira linha é o título. No futuro buildroot crie uma variável $(BR2_EXTERNAL_MY_TREE_PATH), que deve ser usado ao configurar o assembly. Por exemplo, o caminho para o arquivo do usuário pode ser definido da seguinte forma:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt

A segunda linha é uma descrição curta e legível.

Config.in, externo.mk — arquivos para descrever pacotes adicionados. Se você não adicionar seus próprios pacotes, esses arquivos poderão ficar vazios. Por enquanto, é isso que faremos.
Agora temos nossa árvore externa pronta, contendo o defconfig da nossa placa e os arquivos que ela necessita. Vamos para o diretório buildroot e especificar o uso de árvore externa:

[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# configuration written to /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfig

No primeiro comando usamos o argumento BR2_EXTERNAL=../minha_árvore/, indicando o uso de uma árvore externa. Você pode especificar várias árvores externas para uso ao mesmo tempo. Neste caso, você só precisa fazer isso uma vez, após a qual é criado um arquivo output/.br-external.mk que armazena informações sobre a árvore externa usada:

[alexey@alexey-pc buildroot]$ cat output/.br-external.mk 
#
# Automatically generated file; DO NOT EDIT.
#

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 = My simple external-tree for article

Importante! Os caminhos neste arquivo serão absolutos!

Um item de opções externas apareceu no menu:

Buildroot - parte 2. Criando a configuração da sua placa; usando árvore externa, sobreposição de rootfs, scripts pós-construção

Este submenu conterá nossos pacotes de nossa árvore externa. Esta seção está vazia no momento.

Agora é mais importante reescrever os caminhos necessários para usar a árvore externa.

Observe que na seção Opções de compilação → Local para salvar a configuração do buildroot, haverá um caminho absoluto para o defconfig salvo. É formado no momento de especificar o uso de extgernal_tree.

Também corrigiremos os caminhos na seção Configuração do sistema. Para uma tabela com usuários criados:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt

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

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

Agora nossos arquivos da nossa árvore externa serão usados ​​durante a montagem. Ao mudar para outro diretório ou atualizar o buildroot, teremos um mínimo de problemas.

Adicionando sobreposição root fs:

Este mecanismo permite adicionar/substituir facilmente arquivos no sistema de arquivos de destino.
Se o arquivo estiver na sobreposição root fs, mas não no destino, ele será adicionado
Se o arquivo estiver na sobreposição root fs e no destino, ele será substituído.
Primeiro, vamos definir o caminho para o diretório de sobreposição root fs. Isso é feito na seção Configuração do sistema → Diretórios de sobreposição do sistema de arquivos raiz:

$(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 
This is new file from overlay

O primeiro arquivo (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) substituirá o arquivo /etc/hosts no sistema finalizado. O segundo arquivo (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) será adicionado.

Coletamos e verificamos:

Buildroot - parte 2. Criando a configuração da sua placa; usando árvore externa, sobreposição de rootfs, scripts pós-construção

Execução de scripts de customização em diferentes etapas de montagem do sistema

Freqüentemente, você precisa realizar algum trabalho dentro do sistema de arquivos de destino antes de ele ser empacotado em imagens.

Isso pode ser feito na seção Configuração do sistema:

Buildroot - parte 2. Criando a configuração da sua placa; usando árvore externa, sobreposição de rootfs, scripts pós-construção

Os dois primeiros scripts são executados após a construção do sistema de arquivos de destino, mas antes de ser empacotado em imagens. A diferença é que o script fakeroot é executado no contexto do fakeroot, que simula o trabalho do usuário root.

O último script é executado após a criação das imagens do sistema. Você pode realizar ações adicionais nele, por exemplo, copiar os arquivos necessários para um servidor NFS ou criar uma imagem do firmware do seu dispositivo.

Por exemplo, criarei um script que gravará a versão e a data de construção em /etc/.
Primeiro vou indicar o caminho para este arquivo na minha árvore externa:

Buildroot - parte 2. Criando a configuração da sua placa; usando árvore externa, sobreposição de rootfs, scripts pós-construção

E agora o script em si:

[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 montagem, você poderá ver este arquivo no sistema.

Na prática, o script pode ficar grande. Portanto, no projeto real segui um caminho mais avançado:

  1. Criei um diretório (my_tree/board_my_x86_board/inside_fakeroot_scripts) no qual existem scripts para serem executados, com números de série. Por exemplo, 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
  2. Eu escrevi um script (my_tree/board_my_x86_board/run_inside_fakeroot.sh) que passa por este diretório e executa sequencialmente os scripts contidos nele
  3. Especificou este script nas configurações da placa na seção Configuração do sistema -> Scripts personalizados para execução dentro do ambiente fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)

Fonte: habr.com

Adicionar um comentário