Buildroot - Parte 1. Informações gerais, construindo um sistema mínimo, configurando através do menu

1. Introdução


Nesta série de artigos, quero considerar o sistema de distribuição de buildroot e compartilhar a experiência de personalizá-lo. Aqui, você terá experiência prática na criação de um pequeno sistema operacional com uma interface gráfica e funcionalidade mínima.


Primeiro de tudo, você não deve confundir o sistema de compilação e a distribuição. O Buildroot pode construir um sistema a partir do conjunto de pacotes que foi oferecido. O Buildroot é construído em makefiles e, portanto, possui enormes recursos de personalização. Substitua o pacote por outra versão, inclua seu pacote, altere as regras de criação do pacote, personalize o sistema de arquivos após instalar todos os pacotes? O Buildroot pode fazer tudo isso.


Na Rússia, o buildroot é usado, mas, na minha opinião, há poucas informações em russo para iniciantes.


O objetivo do trabalho é criar um kit de distribuição com download ao vivo, interface do icewm e navegador. A plataforma de destino é o virtualbox.


Por que construir sua distribuição? Muitas vezes, você precisa de funcionalidade limitada com recursos limitados. Com mais freqüência na automação, você precisa criar firmware. Adaptar uma distribuição de uso geral, limpar pacotes extras e transformá-la em firmware é uma maneira mais demorada do que construir um novo distrib. O uso do Gentoo também tem suas limitações.


O sistema Buildroot é muito poderoso, mas não faz nada por você. Ele só pode dar oportunidades e automatizar o processo de montagem.


Sistemas de construção alternativos (yocto, sistema de construção aberto etc.) não são considerados ou comparados.


Onde obter e como começar


O site do projeto é buildroot.org . Aqui você pode baixar a versão atual e ler o manual. Você também pode entrar em contato com a comunidade, há um rastreador de erros, listas de e-mail e um canal irc.


O Buildroot opera com defconfig para a placa de destino da montagem. Defconfig é um arquivo de configuração que armazena apenas opções que não possuem valores padrão. É ele quem determina o que e como será coletado. Nesse caso, você pode configurar separadamente o busybox, o linux-kernel, o uClibc, os carregadores de inicialização u-boot e o barebox, mas todos eles serão vinculados à placa de destino.
Após descompactar o arquivo baixado ou a clonagem do git, preparamos o buildroot para o trabalho. Detalhes sobre a estrutura de diretórios podem ser encontrados no manual, vou falar sobre o mais importante:


board - um diretório com arquivos específicos para cada board. Podem ser scripts para formar imagens do sistema (iso, sdcart, cpio etc.), diretório de sobreposição, configuração do kernel, etc.
configs - na verdade, defconfig boards. Defconfig é uma configuração incompleta da placa. Somente parâmetros diferentes das configurações padrão são armazenados nele.
dl - diretório com códigos-fonte / arquivos baixados para montagem
output / target - o sistema de arquivos montado do SO resultante. Posteriormente, são criadas imagens para download / instalação.
output / host - utilitários de host para construção
output / build - pacotes compilados


A configuração da compilação é feita através do KConfig. O mesmo sistema é usado para construir o kernel do linux. Lista dos comandos mais usados ​​(executados no diretório buildroot):


  • make menuconfig - chame a configuração de compilação. Você também pode usar a interface gráfica (make nconfig, make xconfig, make gconfig)
  • make linux-menuconfig - chama a configuração do kernel.
  • faça resultados de montagem limpos e claros (tudo o que é armazenado na saída)
  • make - construa o sistema. Ele não reconstrói processos já coletados
  • make defconfig_name - alterne a configuração para um defconfig específico
  • make list-defconfigs - mostra uma lista de defconfig
  • make source - faça o download apenas dos arquivos de instalação, sem montagem.
  • make help - lista possíveis comandos

Notas e dicas importantes


O Buildroot não reconstrói pacotes já empacotados! Portanto, uma situação pode surgir quando uma remontagem completa é necessária.


Você pode reconstruir um único pacote com o comando make packagename-rebuild. Por exemplo, você pode reconstruir o kernel do linux:


make linux-rebuild 

O Buildroot armazena o estado de qualquer pacote criando arquivos .stamp no diretório output / build / $ packagename:



Portanto, você pode reconstruir root-fs e imagens sem reconstruir pacotes:


 rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make 

Variáveis ​​úteis


O Buildroot possui um conjunto de variáveis ​​para facilitar a configuração


  • $ TOPDIR - diretório raiz do buildroot
  • Diretório $ BASEDIR - OUTPUT
  • $ HOST_DIR, $ STAGING_DIR, $ TARGET_DIR - diretórios de montagem hospedam fs, preparo de fs, destino fs.
  • $ BUILD_DIR - diretório com pacotes descompactados e montados

Visualização


O Buildroot tem a capacidade de visualizar.Você pode criar um diagrama de dependência, uma linha do tempo de construção, um gráfico de tamanho de pacote no sistema final. Os resultados estão na forma de arquivos pdf (você pode escolher entre svn, png) no diretório output / graph.


Exemplos de comandos de visualização:


  • make graph-depends construir uma árvore de dependência
  • make <pkg>-graph-depends constrói uma árvore de dependência de pacote
  • BR2_GRAPH_OUT=png make graph-build crie um gráfico do tempo de montagem com saída em PNG
  • make graph-size pacote de plotagem em make graph-size gráfico

Scripts úteis


O diretório buildroot possui um subdiretório utils com scripts úteis. Por exemplo, há um script que verifica a descrição correta dos pacotes. Isso pode ser útil ao adicionar meus pacotes (farei isso mais tarde). O arquivo utils / readme.txt contém uma descrição desses scripts.


Vamos construir uma distribuição de estoque


É importante lembrar que todas as operações são executadas em nome de um usuário comum, não raiz.
Todos os comandos são executados na raiz do buildroot. O pacote buildroot já possui um conjunto de configurações para muitas placas e virtualização comuns.


Examinamos a lista de configurações:



Alterne para a configuração qemu_x86_64_defconfig


 make qemu_x86_64_defconfig 

E começamos a montagem


 make 

A montagem é concluída com sucesso, olhamos para os resultados:



O Buildroot compilou imagens que você pode executar no Qemu e verifique se elas funcionam.


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

O resultado é um sistema em execução no qemu:



Criando uma configuração de placa personalizada


Adicionando arquivos da placa


Examinamos a lista de configurações:



Na lista, vemos pc_x86_64_bios_defconfig. Criaremos nossa placa copiando-a da configuração:


 cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig 

Crie imediatamente o diretório do quadro para armazenar nossos scripts, rootfs-overlay e outros arquivos necessários:


 mkdir board/my_x86_board 

Mude para este defconfig:


 make my_x86_board_defconfig 

Portanto, agora a configuração da compilação (armazenada em .config na raiz do diretório buildroot) corresponde à máquina legada (bios) de destino x86-64, carregando.


Copie a configuração linux-kernel (útil no futuro):


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

Configurar opções de compilação através do KConfig


Execute a instalação:


 make menuconfig 

A janela do KConfig é aberta. É possível configurar com uma interface gráfica (make nconfig, make xconfig, make gconfig):



Entramos na primeira seção das Opções de destino. Aqui você pode escolher a arquitetura de destino para a qual a montagem será conduzida.



Opções de compilação - existem várias configurações de compilação aqui. Você pode especificar diretórios com códigos-fonte, o número de encadeamentos de montagem, espelhos para baixar códigos-fonte e outras configurações. Deixe as configurações padrão.


Cadeia de ferramentas - aqui as ferramentas de construção são configuradas. Mais sobre ele.



Tipo de cadeia de ferramentas - tipo de cadeia de ferramentas usada. Ele pode ser incorporado à buildroot ou a uma cadeia de ferramentas externa (você pode especificar um diretório com um URL ou URL pré-criado para download). Para diferentes arquiteturas, existem opções adicionais. Por exemplo, para arm, você pode simplesmente selecionar a versão da cadeia de ferramentas externa Linaro.


Biblioteca C - a escolha da biblioteca C. A operação de todo o sistema depende disso. Glibc geralmente usado, suportando todas as funcionalidades possíveis. Mas pode ser muito grande para o sistema incorporado, portanto, uClibc ou musl são frequentemente escolhidos. Escolheremos glibc (no futuro será necessário usar o systemd).


Séries de cabeçalhos do kernel e cabeçalhos personalizados do kernel - devem corresponder à versão do kernel que estará no sistema de compilação. Para cabeçalhos do kernel, você também pode especificar o caminho para o repositório tarball ou git.


VERSÕES DO GCC COMPILER - selecione a versão do compilador que será usada para montagem
Ativar suporte C ++ - selecione para montagem com suporte para bibliotecas c ++ no sistema. No futuro, isso será útil.


Opções adicionais do gcc - você pode definir opções adicionais do compilador. Não precisamos até agora.


A configuração do sistema permite definir parâmetros futuros para o sistema criado:



A maioria dos pontos é clara a partir do nome. Preste atenção aos seguintes pontos:
Caminho para as tabelas de usuários - tabela com usuários criados ( https://buildroot.org/downloads/manual/manual.html#makeuser-syntax ).


Exemplo de arquivo. O usuário usuário será criado com a senha admin, automaticamente gid / uid, / bin / sh shell, usuário padrão do grupo, membro do grupo raiz, comentário Foo user


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

Diretórios de sobreposição do sistema de arquivos raiz - um diretório sobreposto ao target-fs montado. Adiciona novos arquivos e substitui os existentes.


Scripts personalizados para execução antes de criar imagens do sistema de arquivos - Scripts que são executados imediatamente antes do sistema de arquivos ser recolhido nas imagens. O script em si ficará em branco por enquanto.


Vamos para a seção Kernel



As configurações do kernel são definidas aqui. O próprio kernel é configurado através do make linux-menuconfig.
Você pode definir a versão do kernel de diferentes maneiras: escolha uma das propostas, insira a versão manualmente, especifique o repositório ou o tarball finalizado.


Configuração do kernel - o caminho para a configuração do kernel. Você pode escolher a configuração padrão para a arquitetura selecionada ou defocnfig no Linux. As fontes Linux têm um conjunto de defconfig para diferentes sistemas de destino. Você pode encontrar o caminho certo olhando diretamente para a fonte aqui . Por exemplo, para uma placa preta de osso beagle, você pode selecionar uma configuração .


A seção Pacotes de destino permite escolher quais pacotes serão instalados no sistema de compilação. Deixe inalterado por enquanto. Mais tarde, adicionaremos nossos pacotes a esta lista.
Imagens do sistema de arquivos - uma lista de imagens do sistema de arquivos a serem compiladas. Adicionar imagem iso



Carregadores de inicialização - a escolha dos gerenciadores de inicialização montados. Escolha isolinix



Configuração do Systemd


O Systemd se torna um dos pilares do linux, junto com o kernel e o glibc. Portanto, eu fiz sua configuração em um parágrafo separado.


Ele é configurado através do make menuconfig e, em seguida, direciona os pacotes → Ferramentas do sistema → systemd. Aqui você pode especificar quais serviços systemd serão instalados e iniciados na inicialização do sistema.



Salvando a configuração do sistema


Salve esta configuração via KConfig.


Salve nosso defconfig:


 make savedefconfig 

Configuração do kernel Linux


A configuração do kernel do linux é chamada com o seguinte comando:


 make linux-menuconfig 

Adicione suporte para a placa gráfica Virtualbox



Adicionar suporte à integração do Virtualbox Guest



Salve e saia. IMPORTANTE : a configuração será salva na saída / build / linux- $ version / config, mas não na placa / my_x86_board / linux.config



Portanto, você precisa copiar manualmente a configuração no local de armazenamento:


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

Com este comando, copio a configuração FULL do kernel, que nem sempre é necessária. Uma maneira mais correta é manter o kernel defconfig:


 make linux-update-defconfig 

Depois disso, realizamos uma remontagem completa de todo o sistema. Como o buildroot não remonta o já montado, você deve especificar manualmente os pacotes para remontagem. Para não perder tempo e nervos, é mais fácil reconstruir todo o pequeno sistema):


 make clean;make 

Após a conclusão da compilação, execute o VirtualBox (testado nas versões 5.2 e 6.0) com a inicialização a partir da unidade de CD.



A partir do iso montado:



Lista de materiais utilizados


  1. Manual do Buildroot

Source: https://habr.com/ru/post/pt448638/


All Articles