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 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:
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ênciamake <pkg>-graph-depends
construir uma árvore de dependências para um pacote específicoBR2_GRAPH_OUT=png make graph-build
tempo de construção do gráfico com saída PNGmake 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:
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 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:
Criando sua própria configuração de placa
Adicionando arquivos de quadro
Vejamos a lista de configurações:
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):
Entramos na primeira seção Opções de alvo. Aqui você pode selecionar a arquitetura alvo para a qual a construção será realizada.
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.
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:
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 (
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
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
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
Bootloaders - seleção de bootloaders para coletar. Vamos escolher isolinix
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.
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
Vamos adicionar suporte à integração do Virtualbox Guest
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
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:
Inicie a partir da iso montada:
Lista de materiais usados
- Manual do Buildroot
Fonte: habr.com