Compile uma Distro de Linux para a Raspberry Pi 3 usando Yocto

Raspberry pi 3 usando Yocto

O Yocto Project

 

Acredito que a melhor maneira de explicar o que é o Yocto, é mostrando qual é o problema que ele tenta solucionar. Gerar sistemas baseados em Linux, especialmente embarcados, pode se tornar astronomicamente complexo sem as ferramentas certas. Você pode tentar procurar uma distro pronta em algum canto da Internet e por sua conta e risco, colocá-la em seu hardware e ver se ela atende aos seus requisitos. Se você estiver trabalhando com sistemas embarcados, provavelmente não irá encontrar um candidato viável.

 

Sistemas embarcados são muito particulares, além de terem recursos limitados. Você precisa colocar somente o necessário dentro do sistema, e nada mais. A dúvida fica: como criar sistemas customizados baseados em Linux sem que sejam necessários meses de estudo que provavelmente vão resultar em embranquecimento capilar precoce? A resposta: o Yocto Project.

 

O Yocto Project (YP) é um projeto open source colaborativo que ajuda desenvolvedores a criar sistemas customizados baseados em Linux independente da arquitetura de hardware. - Yocto Project

 

O Yocto é um conjunto de ferramentas que irá te ajudar a construir um sistema Linux a partir do código fonte de uma maneira automatizada. Ele lida desde o cross-compiling do kernel, dos módulos e dos apps até a criação do toolchain para que você já possa desenvolver em seu novo ambiente. Só faltou passar o café.

 

YP é bem poderoso, mas há um pequeno detalhe: sua curva de aprendizado é bem íngreme, especialmente se você estiver interessado em realmente entender o que esta acontecendo por debaixo dos panos; algo que é necessário caso queira fazer customizações de baixo nível. De qualquer maneira, a curva não é tão íngreme quanto fazer tudo na mão, sozinho. A questão é que com o Yocto, a customização pode se tornar virtualmente sem fim.

 

O input do Yocto são chamadas de receitas, essas receitas são arquivos legíveis que descrevem como cada elemento no sistema é construído. Isso pode ir desde a URL em que o código fonte deve ser baixado a até quais as flags que serão usadas pelo compilador. Além disso, podem descrever elementos simples como uma árvore de arquivos qualquer, ou complexos, como compilar o kernel do Linux para a arquitetura alvo. As receitas podem depender ou ser componentes de outras. Comece a encadear essas receitas e quando menos esperar, terá um sistema Linux operacional.

 

Outro grande diferencial do Yocto é ele ser um projeto open source colaborativo. Isso significa que a chance de alguém, em algum lugar da Internet, já ter desenvolvido uma receita que supra suas necessidades é alta. As receitas são organizadas em pacotes chamados layers, ou camadas, que você combinará para construir seu sistema. Isso ficará mais claro logo mais. No OpenEmbedded Layer Index você encontra uma série de layers, cada uma com sua descrição, funcionalidade e código fonte. As layers são divididas nas seguintes categorias: Base, Machine (BSP), Distribution, Miscellaneous and Software. Cada uma trata de uma parte do sistema final.

 

Em um exemplo bem simplificado, vamos supor que você gostaria de rodar uma aplicação de nodejs em um computador embarcado baseado em um chipset Allwinner, comum nos Orange Pi's. Nesse caso, as seguintes layers provavelmente seriam utilizadas:

 

Estou omitindo vários passos nesse exemplo, mas acredito que deu para sentir a ideia. Após compilar esse sistema, você terá uma imagem preparada especialmente para rodar sua aplicação na placa alvo.

 

Se estiver interessado em aprender mais, dê uma olhada na documentação oficial do Yocto e seu principal componente OpenEmbedded. Prepare-se, pois a documentação é enorme.

 

Vamos tentar

 

O melhor jeito de entender o Yocto é tentando fazer algo com ele. Acredito que o seguinte exemplo é um bom lugar para começar. Pense nele como um hello world.

 

Vamos compilar a distro Angstrom para uma Raspberry Pi 3. O Angstrom é uma distro bem minimalista, ideal para sistema embarcados. Sem exageros, a distro inteira, sem modificações, ocupa 58 MB. Pense no Angstrom como um bom ponto de partida para seu sistema se basear, afinal não há porque reinventar a roda.

 

Iremos fazer uma única modificação no sistema. Vamos usar o U-Boot como nosso bootloader e faremos isso mudando apenas uma linha de código. Essa única linha dirá ao Yocto que ele deve fazer a compilação, instalação e configuração de um novo bootloader. É evidente que existe uma enorme receita que descreve esse processo inteiro, mas é incrível poder encapsular esse processo em uma única linha. Isso exemplifica o poder de customização do Yocto.

 

Compilar um sistema inteiro demanda muito do sistema host. Seja paciente pois o processo pode demorar várias horas além de consumir cerca de 20 GB de espaço de armazenamento.

 

  1. Prepare as dependências no host.

 

  • Ubuntu and Debian:

 

  • Fedora:

 

  • OpenSUSE:

 

  • CentOS:

 

2. Clone o Yocto:

 

Até o momento da escrita deste artigo, a versão mais nova do Yocto é chamada de thud. Note que todos os branches dizem respeito à versão thud do Yocto.

 

  1. Clone a layer do Angstrom:

 

4. Clone a Layer da Raspberry Pi:

 

Esse é nossa Machine(BSP) Layer.

 

  1. Clone a Layer do Qt 5:

 

Ela será indiretamente necessária.

 

  1. Abra um terminal e inicie o ambiente de desenvolvimento:

 

Isso será necessário em todo terminal que seja usado para manipular as ferramentas do Yocto. Caso essa seja a primeira vez executando esse comando, uma série de pastas serão criadas e populadas. Alguns desses arquivos criados serão modificados a seguir.

 

7. Inclua todas as layers clonadas modificando o seguinte arquivo:

 

Mesmo as layers já estando dentro do diretório do Yocto, é necessário dizer explicitamente ao sistema que elas devem ser usadas. Isso é feito modificando o arquivo bblayers.conf. Já vou me adiantar e adicionar algumas outras Layers que serão necessárias. Essas layers estão dentro do repositório do Yocto, mas não estão ativadas por padrão.

 

  1. Modifique alguns parâmetros globais no arquivo local.conf:

 

9. É só isso. Vamos compilar o sistema:

 

bitbake é a principal ferramenta do Yocto, é esse comando que compila as receitas. core-image-base é uma receita que descreve uma imagem mínima para um sistema. Ela inclui somente o necessário para podermos bootar a placa. A partir dessa receita, as outras milhares de receitas são encadeadas e executadas precisamente. Se tudo der certo você verá o seguinte resumo:

 

 

Após o processo terminar, procure a imagem nos seguintes diretórios:

 

Note que o nome exato da imagem pode variar dependendo da versão que estiver compilado. Procure pelo arquivo .rpi-sdimg.

 

10. Passe a imagem para o cartão microSD e veja o resultado! Use qualquer método que preferir para transferir a imagem. Recomendo fortemente o Etcher.

 

Espero que, depois desse texto, eu tenha ajudado a desmistificar o Yocto e o desenvolvimento de aplicações para Linux embarcado, e que você se sinta encorajado a conhecer mais sobre o assunto. Essa é uma excelente maneira de aprender como o Linux funciona e quais são seus blocos constituintes. Em um próximo artigo, vamos ver como podemos construir um sistema customizado a partir dessa base que criamos.

 

Enquanto isso, te convido a conhecer meu blog pessoal, onde você pode conferir outros conteúdos sobre engenharia de hardware e software!

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.

Bernardo Rodrigues
Olá! Sou Engenheiro da Computação Pela USP, mestrando pela Unicamp e Desenvolvedor de Software com experiência em design, implementação e manutenção de aplicações de IIoT e Indústria 4.0. Nos últimos anos, trabalhei em projetos que combinavam computação em nuvem , aprendizado de maquina e sistemas embarcados com a intenção de trazer um novo entendimento aos processos industriais.

4
Deixe um comentário

avatar
 
2 Comment threads
2 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
3 Comment authors
Gustavo JoséLeonardo VeigaClayton Da Silva Costa Junior Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Gustavo José
Visitante
Gustavo

Olá, como eu posso acessar o sistema através do comando ssh?

Clayton Da Silva Costa Junior
Membro
Clayton da Silva Costa Junior

Gostaria de um artigo sobre Buildroot imx6 ou imx7 + carrier board ou viola plus.
Obrigado.

Leonardo Veiga
Visitante
Leonardo Veiga

Prezado Clayton,

A Embedded Labworks (Sérgio Prado) realiza treinamento de Linux embarcado com Colibri iMX6 e Aster e usa buildroot: https://e-labworks.com/treinamentos/linux-embarcado/

Os slides do treinamento são open source, sugiro dar uma olhada.

p.s. eu trabalho para a Toradex, que fornece as BSPs oficialmente por meio do Yocto/OpenEmbedded https://developer.toradex.com/knowledge-base/yocto-project

Atenciosamente,
Leonardo

Clayton Da Silva Costa Junior
Membro
Clayton da Silva Costa Junior

Obrigado vou dar uma olhada, abraços.