Yocto Project: Definições e Conceitos

yocto project introdução
Este post faz parte da série Yocto Project. Leia também os outros posts da série:

Na primeira parte dessa série apresentamos os prós e contras ao se utilizar distribuições Linux prontas e customizadas, uma breve introdução sobre o Yocto Project, bem como suas características principais e seus diferenciais.

  

Nessa segunda parte veremos em detalhes a arquitetura desse sistema de build assim como alguns conceitos e definições importantes que nos darão a base necessária para desenvolvermos distribuições Linux embarcado customizadas a serem utilizadas em produtos eletrônicos.

 

Yocto Project - Arquitetura

 

A figura 1 apresenta um panorama da arquitetura do ambiente de desenvolvimento do Yocto Project:

 

Yocto Project Definições e Conceitos
Figura 1 - Arquitetura do ambiente de desenvolvimento do Yocto Project

 

Basicamente podemos considerar que temos 6 entidades principais no sistema: 

  • Código fonte upstream (Upstream sources);
  • Metadados e entradas (Metada/Inputs);
  • Sistema de Build propriamente dito (Build System);
  • Pacotes resultantes (Output Packages);
  • Tarefas (Process steps - tasks);
  • Imagem resultante (Output Data Image).

 

De posse das configurações de usuário, BSP (board support package) e políticas, juntamente com os metadados, o Bitbake irá processar tais informações e criar uma cadeia de execução de tarefas ordenadas de acordo com suas interdependências. O workflow comumente encontrado das tarefas (tasks) é o representado na figura 1, onde: 

  1. O código fonte é baixado;
  2. Aplicação de patches se necessários;
  3. Configuração e compilação;
  4. Análise do resultado para a divisão do pacote e suas relações de dependência;
  5. Geração de pacotes (rpm, deb ou ipk);
  6. Testes de garantia de qualidade dos pacotes gerados (ex.: verificação se todos os binários esperados estão presentes no pacote);
  7. Geração do feed de pacotes;
  8. Geração da imagem ou do SDK.

 

Yocto Project - Conceitos e Definições

 

Layer (camada)

Grupo de metadados (metadata) que podem ser incorporados ao sistema de build de forma a estendê-lo (ex.: Software, BSP e Distro).

 

Distro (distribuição)

Configurações, políticas e regras para geração da imagem do sistema.

 

Machine (máquina)

Plataforma de hardware alvo da distribuição a ser gerada, implementada através de uma camada de BSP.

 

Image (imagem)

Imagem final do rootfs do sistema gerado para determinada máquina, implementado através de uma receita de imagem.

 

Task (tarefa)

Procedimentos executados pelo sistema de build ao processar as receitas.

 

Package (pacote)

Resultado do processamento da receita de um componente de software, agregado em algum formato popular de empacotamento (.ipk, .deb, .rpm).

 

Tipos de Metadados

Recipes - Receitas (*.bb)

  • Descrevem instruções de como se constrói um pacote;
  • Podem ser estendidas em outras camadas (.bbappend);
  • Podem compartilhar “dados” através de arquivos “.inc”.

 

PackageGroups - Grupos de Pacotes (*.bb)

Usado para agrupar pacotes para serem inclusos em uma imagem.

 

Classes (*.bbclass)

Mecanismo de herança para prover funcionalidades comuns.

 

Configuration - Configuração (*.conf)

Dita o comportamento do processo de build de maneira global.

 

Detalharemos a diante cada um desses conceitos apresentados.

 

 

Layer

 

Estrutura típica de diretórios (ex.: meta-yocto-bsp):

 

 

Possui um arquivo de configuração a ser usado pelo Bitbake para processamento dos metadados (ex.: meta-yocto-bsp/conf/layer.conf):

 

 

As camadas devem ser adicionadas no arquivo "build/conf/bblayers.conf". Exemplo:

 

 

Documentação sobre Layers

 

Distro

 

Possui um arquivo de configuração a ser usado pelo Bitbake para definição de regras e políticas da imagem a ser gerada (ex.: meta-poky/conf/distro/poky.conf):

 

 

Basicamente define toolchain, libc, sistema de init e versões de determinados pacotes. Possui a variável DISTRO_FEATURES que pode receber os seguintes valores:

 

 

A figura 2 ilustra as principais distribuições disponíveis.

 

Principais distribuições disponíveis no Yocto Project.
Figura 2 - Principais distribuições disponíveis no Yocto Project.

 

Para configurarmos qual distribuição queremos gerar devemos atribuir o nome da distribuição à variável DISTRO no arquivo build/conf/local.conf.

 

Documentação sobre DISTRO e DISTRO_FEATURES.

 

Machine

 

A Machine é a nossa plataforma alvo, ou seja, a placa para a qual desejamos gerar a nossa distribuição customizada. Ela é definida através de um arquivo de configuração a ser usado pelo Bitbake que armazena as features de hardware que vão influenciar a compilação e instalação pacotes, bem como quais receitas de bootloader e kernel a serem consideradas. Vejamos o exemplo da Beaglebone Black (arquivo meta-yocto-bsp/conf/machine/beaglebone.conf):

 

 

A Machine possui uma variável (MACHINE_FEATURES) para definição de suas características que pode receber os seguintes valores:

 

 

Para configurarmos para qual Machine queremos gerar a distribuição devemos atribuir o nome da  Machine à variável MACHINE no arquivo build/conf/local.conf.

 

Documentação sobre MACHINE e MACHINE_FEATURES.

 

Receitas

 

As Receitas (recipes) disponibilizam os “ingredientes” e as instruções de “culinária” a serem consumidas pelo Bitbake para se construir um determinado pacote ou imagem. São nomeadas da seguinte maneira: basename_version.bb. Onde: basename representa o nome do pacote e version a versão do pacote em questão. As recipes sempre terão a extensão ".bb" como identificação.

 

Dentro de uma receita as informações comumente encontradas são:

DESCRIPTION
HOMEPAGE
LICENSE
SECTION
DEPENDS
LIC_FILES_CHKSUM
SRC_URI

 

Documentação sobre as variáveis que podem ser utilizadas em uma receita.

 

Vejamos o exemplo da receita para o pacote libogg na versão 1.3.2 (meta/recipes-multimedia/libogg/libogg_1.3.2.bb):

 

 

As receitas podem ser modificadas através de arquivos ".bbappend" (e.: libogg_1.3.2.bbappend) localizados em outras camadas. Dessa maneira não precisamos editar a receita original e podemos concentrar todas as customizações necessárias em uma camada específica, facilitando a manutenção e controle de mudanças.

 

De posse dos ingredientes e instruções básicas o Bitbake irá executar tarefas (tasks) para construção da receita. A seguir listamos as tasks comumentes executadas para uma receita:

  • do_fetch: Localiza e baixa o código fonte;
  • do_unpack: desempacota o fonte no diretório de trabalho;
  • do_patch: aplica patches se necessários;
  • do_configure: executa se necessário alguma configuração pré-build;
  • do_compile: compila o código fonte;
  • do_install: instalação dos artefatos de software resultantes do build em um local temporário;
  • do_populate_sysroot: copia os artefatos para o sysroot (área comum a ser usada para satisfação de dependência);
  • do_package_*: cria os pacotes de instalação.

 

 

Tudo começa no local.conf

 

O arquivo "build/conf/local.conf" irá ditar "as regras do jogo". A partir dele com configurações mínimas da DISTRO e MACHINE que iremos utilizar o Bitbake será capaz de construir imagens e  pacotes presentes nas camadas definidas no arquivo"build/conf/bblayers.conf". Exemplo de um arquivo"local.conf":

 

 

Conclusão 

 

Na segunda parte dessa série vimos em mais detalhes a arquitetura e conceitos e definições do Yocto Project. Na terceira parte faremos um Quick Start e demonstraremos na prática o uso dos conceitos aqui apresentados.

Outros artigos da série

<< Yocto Project: IntroduçãoYocto Project: Quick Start >>
Este post faz da série Yocto Project. Leia também os outros posts da série:
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Diego Sueiro
Formado em Engenharia de Controle e Automação pela UNIFEI e CEO do Embarcados, atualmente trabalho na Inglaterra com Desenvolvimento de Sistemas Linux Embarcado Real Time. Sou consultor e desenvolvedor de software para Sistemas Embarcados com vasta experiência em projetos com processadores de 8bits a 32bits, sistemas bare metal, RTOS, Linux Embarcado e Android Embarcado. Um apaixonado por Pink Floyd e Empreendedorismo.

Deixe um comentário

avatar
 
  Notificações  
Notificar