Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Introdução

Nesta série de artigos, quero dar uma olhada no sistema de compilação de distribuição buildroot e compartilhar minha experiência em personalizá-lo. Haverá experiência prática na criação de um pequeno sistema operacional com interface gráfica e funcionalidade mínima.

Primeiro de tudo, você não deve confundir o sistema de compilação e a distribuição. Buildroot pode construir um sistema a partir de um conjunto de pacotes que lhe são oferecidos. Buildroot é construído em makefiles e, portanto, possui enormes recursos de personalização. Substituir um pacote por outra versão, adicionar seu próprio pacote, alterar as regras para construir um pacote, personalizar o sistema de arquivos após instalar todos os pacotes? 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 é montar um kit de distribuição com download ao vivo, interface icewm e navegador. A plataforma de destino é o virtualbox.

Por que construir sua própria distribuição? Freqüentemente, é necessária funcionalidade limitada com recursos limitados. Ainda mais frequentemente na automação você precisa criar firmware. Adaptar uma distribuição de uso geral limpando pacotes desnecessários e transformando-os em firmware exige mais trabalho do que construir uma nova distribuição. Usar o Gentoo também tem suas limitações.

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

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

Onde conseguir e como começar

Site do projeto - buildroot.org. Aqui você pode baixar a versão atual e ler o manual. Lá você pode entrar em contato com a comunidade, há um rastreador de bugs, listas de e-mail e um canal de irc.

Buildroot opera defconfigs para o quadro de destino da compilação. Defconfig é um arquivo de configuração que armazena apenas opções que não possuem valores padrão. É ele quem determina o que será arrecadado e como. Neste caso, você pode configurar separadamente as configurações dos bootloaders busybox, linux-kernel, uglibc, u-boot e barebox, mas todos eles estarão vinculados à placa de destino.
Depois de descompactar o arquivo baixado ou clonar do git, obtemos um buildroot pronto para uso. Você pode ler mais sobre a estrutura de diretórios no manual; vou falar sobre os mais importantes:

borda — um diretório com arquivos específicos de cada placa. Podem ser scripts para formar imagens do sistema (iso, sdcart, cpio e outros), um diretório de sobreposição, configuração do kernel, etc.
configs — o defconfig real da placa. Defconfig é uma configuração de placa incompleta. Ele armazena apenas parâmetros que diferem das configurações padrão
dl — diretório com códigos-fonte/arquivos baixados para montagem
saída/alvo — o sistema de arquivos montado do sistema operacional resultante. Posteriormente, são criadas imagens a partir dele para download/instalação
saída/host - utilitários de host para montagem
saída/construção - pacotes montados

A montagem é configurada via KConfig. O mesmo sistema é usado para construir o kernel Linux. Lista dos comandos mais comumente usados ​​(executados no diretório buildroot):

  • make menuconfig - chama 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.
  • make clean - limpa os resultados da compilação (tudo armazenado na saída)
  • fazer - construir um sistema. Isso não remonta processos já montados.
  • make defconfig_name - muda a configuração para um defconfig específico
  • make list-defconfigs – mostra uma lista de defconfigs
  • make source - basta baixar os arquivos de instalação, sem compilar.
  • make help - lista os comandos possíveis

Notas importantes e dicas úteis

Buildroot não reconstrói pacotes que já foram compilados! Portanto, pode surgir uma situação em que seja necessária uma remontagem completa.

Você pode reconstruir um pacote separado com o comando faça a reconstrução do nome do pacote. Por exemplo, você pode reconstruir o kernel do Linux:

make linux-rebuild

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

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

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

buildroot possui um conjunto de variáveis ​​para fácil configuração

  • $TOPDIR – diretório buildroot
  • $BASEDIR - diretório de SAÍDA
  • $HOST_DIR, $STAGING_DIR, $TARGET_DIR — host fs, staging fs, diretórios de construção target fs.
  • $BUILD_DIR – diretório com pacotes descompactados e compilados

Visualização

buildroot possui um recurso de visualização. Você pode construir um diagrama de dependência, um gráfico de tempo de construção e um gráfico de tamanhos de pacotes 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 árvore de dependência
  • make <pkg>-graph-depends construir uma árvore de dependências para um pacote específico
  • BR2_GRAPH_OUT=png make graph-build tempo de construção do gráfico com saída PNG
  • make graph-size tamanho do pacote de plotagem

Scripts úteis

Existe um subdiretório no diretório buildroot útil com scripts úteis. Por exemplo, existe um script que verifica a exatidão das descrições dos pacotes. Isto pode ser útil ao adicionar seus próprios pacotes (farei isso mais tarde). O arquivo utils/readme.txt contém uma descrição desses scripts.

Vamos construir uma distribuição de ações

É importante lembrar que todas as operações são realizadas em nome de um usuário normal, não de root.
Todos os comandos são executados no buildroot. O pacote buildroot já inclui um conjunto de configurações para muitas placas comuns e virtualização.

Vejamos a lista de configurações:

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Mude para a configuração qemu_x86_64_defconfig

make qemu_x86_64_defconfig

E começamos a montagem

make

A compilação foi concluída com sucesso, veja os resultados:

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Buildroot compilou imagens que você pode executar no Qemu e verificar se 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 rodando em qemu:

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Criando sua própria configuração de placa

Adicionando arquivos de quadro

Vejamos a lista de configurações:

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Na lista vemos pc_x86_64_efi_defconfig. Criaremos nossa própria placa copiando-a da configuração:

cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig

Vamos criar imediatamente um diretório de placa 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

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

Vamos copiar a configuração do kernel do linux (útil mais tarde):

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

Configurando parâmetros de compilação via KConfig

Vamos começar a configuração:

make menuconfig 

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

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Entramos na primeira seção Opções de alvo. Aqui você pode selecionar a arquitetura alvo para a qual a construção será realizada.

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Opções de construção - existem várias configurações de construção aqui. Você pode especificar diretórios com códigos-fonte, o número de threads de construção, espelhos para download de códigos-fonte e outras configurações. Vamos deixar as configurações padrão.

Conjunto de ferramentas – as próprias ferramentas de construção são configuradas aqui. Leia mais sobre ele.

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Tipo de conjunto de ferramentas – tipo de conjunto de ferramentas usado. Este pode ser um conjunto de ferramentas embutido no buildroot ou externo (você pode especificar o diretório com o já compilado ou o URL para download). Existem opções adicionais para diferentes arquiteturas. Por exemplo, para arm você pode simplesmente selecionar a versão Linaro do conjunto de ferramentas externo.

Biblioteca C – seleção da biblioteca C. Disso depende o funcionamento de todo o sistema. Normalmente é usado o glibc, que suporta todas as funcionalidades possíveis. Mas pode ser muito grande para um sistema embarcado, então uglibc ou musl são frequentemente escolhidos. Selecionaremos glibc (isso será necessário posteriormente para usar o systemd).

Série Kernel Headers e Custom Kernel Headers – devem corresponder à versão do kernel que estará no sistema montado. Para cabeçalhos de kernel, você também pode especificar o caminho para o repositório tarball ou git.

VERSÕES DO COMPILADOR GCC – selecione a versão do compilador a ser usada para construção
Habilitar suporte C++ – selecione para construir com suporte para bibliotecas C++ no sistema. Isso será útil para nós no futuro.

Opções adicionais do gcc – você pode definir opções adicionais do compilador. Não precisamos disso por enquanto.

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

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

A maioria dos pontos fica clara no título. Vamos prestar atenção aos seguintes pontos:
Caminho para as tabelas de usuários - tabela com usuários a serem criados (https://buildroot.org/downloads/manual/manual.html#makeuser-syntax).

Arquivo de exemplo. O usuário user será criado com a senha admin, automaticamente gid/uid, /bin/sh shell, usuário de grupo padrão, membro do grupo root, 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 - diretório sobreposto ao target-fs montado. Adiciona novos arquivos e substitui os existentes.

Scripts personalizados para serem executados antes de criar imagens do sistema de arquivos - Scripts executados imediatamente antes de dobrar o sistema de arquivos em imagens. Vamos deixar o script vazio por enquanto.

Vamos para a seção Kernel

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

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

Configuração do kernel — caminho para a configuração do kernel. Você pode selecionar a configuração padrão para a arquitetura selecionada ou defocnfig do Linux. A fonte Linux contém um conjunto de defconfigs para diferentes sistemas de destino. Você pode encontrar o que precisa olhando diretamente para as fontes aqui. Por exemplo, para um quadro negro de osso de beagle você pode selecione configuração.

A seção Pacotes de destino permite selecionar quais pacotes serão instalados no sistema que está sendo compilado. Vamos deixar inalterado por enquanto. Adicionaremos nossos pacotes a esta lista mais tarde.
Imagens do sistema de arquivos – uma lista de imagens do sistema de arquivos que serão coletadas. Adicione uma imagem iso

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Bootloaders - seleção de bootloaders para coletar. Vamos escolher isolinix

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Configurando o Systemd

O Systemd está se tornando um dos pilares do Linux, junto com o kernel e o glibc. Portanto, mudei sua configuração para um item separado.

Configurado via make menuconfig, depois Pacotes de destino → Ferramentas do sistema → systemd. Aqui você pode especificar quais serviços do systemd serão instalados e iniciados quando o sistema for iniciado.

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Salvando a configuração do sistema

Salvamos esta configuração via KConfig.

Em seguida, salve nosso defconfig:

make savedefconfig

Configuração do Kernel Linux

A configuração do kernel Linux é invocada com o seguinte comando:

make linux-menuconfig

Vamos adicionar suporte para placa de vídeo Virtualbox

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Vamos adicionar suporte à integração do Virtualbox Guest

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Salvar e sair. IMPORTANTE: a configuração será salva em output/build/linux-$version/config, mas não em board/my_x86_board/linux.config

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

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

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

Após isso realizaremos uma remontagem completa de todo o sistema. buildroot não reconstrói o que já foi compilado, você deve especificar manualmente os pacotes para reconstrução. Para não perder tempo e nervosismo, é mais fácil reconstruir completamente um pequeno sistema):

make clean;make

Após a conclusão da compilação, inicie o VirtualBox (testado nas versões 5.2 e 6.0) inicializando a partir do CD. Parâmetros do sistema:

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Inicie a partir da iso montada:

Buildroot - parte 1. Informações gerais, montagem de um sistema mínimo, configuração através do menu

Lista de materiais usados

  1. Manual do Buildroot

Fonte: habr.com

Adicionar um comentário