Yocto Project – Construindo uma distribuição para RaspberryPI

 

Vamos ver neste post como obter e configurar a ferramenta que irá customizar uma distribuição Linux para a Raspberry PI B.

Vamos usar entre as ferramentas disponíveis a Yocto Project, se você não conhece, acesse este post antes de continuar Yocto Project – Introdução[link].

 

Preparando o território

Primeiro, vamos preparar nosso computador/notebook para usar a ferramenta, estou usando como ambiente o Linux Mint 15, o procedimento abaixo pode ser replicado para um Ubuntu, Debian sem problemas e vamos instalar as seguintes dependências:

Se você esta usando outra distribuição, recomendo que acesse o Required Packages for the Host Development System[link] e verifique os pacotes que devem ser instalados em outras distribuições.

 

Obtendo o Yocto Project

Digamos que para “instalar” a ferramenta Yocto Project é bem fácil e tranquilo, o melhor de tudo isso que não poderíamos dizer que é instalação, porque na verdade clonamos o repositório do git, que é uma excelente opção para este tipo de ferramenta que sofre constantes atualizações.

No meu caso, e acho que é uma boa prática, irei clonar o repositório no home do meu usuário, outra questão a levantar é o branch a ser clonado, hoje na data que escrevo este post o Yocto Project esta na versão 1.8 (fido), porém a que vamos utilizar é a 1.7.1 (dizzy) que é a que mais utilizo depois da 1.6.2 (daizy), mais sobre as versões você pode ver no Yocto Project Wiki – Release[link].

Clonando o repositório para o computador/notebook.

A etapa de clonar o repositório é para ser rápida, porque não é tão grande, acima o tempo que levou no meu caso. Vamos ver como ficou o diretório.

 

O Yocto Project não é muito grande, mas é bom ter um bom espaço em disco, porque depois da construção da distribuição o seu HD não será mais o mesmo :).

 

Yocto Project e a Raspberry PI

Já preparamos o ambiente e obtemos a ferramenta, porém ainda não é possível construir a distribuição para a RaspberryPI, desta maneira até agora conseguimos construir para testar com qemux86 e para a Beaglebone Black, no caso para a RaspberryPI devemos adicionar a camada meta-raspberrypi.

Para saber qual a camada, ou que deve-se “clonar”, ou qual receita(recipe) já possui ou deve fazer uma, você pode descobrir acessando OpenEmbedded Metadata Index[link].

Pesquisando no branch dizzy, por machine com “raspberrypi”[link], obtemos a saída da Figura01.

OpenEmbeddedLayerRaspberryPI
Figura01 – Camada para RaspberryPI

Clicando em meta-raspberrypi abaixo de Layer irá nos levar para uma descrição de tudo que tem nessa camada e o caminho do repositório para ser adicionado, que é o que vamos fazer agora, acessando o diretório poky-dizzy e adicionando o repositório.

Muito rápido, porque a camada é bem pequena.

 

Criando o projeto

Com o ambiente preparado, yocto project(bitbake, poky e demais) já local, e com as camadas que precisamos já adicionadas, agora é só criar o projeto e configurar.

Para criar o projeto é muito fácil, já existe um script da própria ferramenta para isso, o oe-init-build-env.

Então, executando o comando como na tela acima, o diretório myrasppi é criado (myrasppi é o nome do meu projeto) e com toda a estrutura minima para construir uma distribuição.

 

Configurando o projeto

Depois de criar o projeto, vamos realizar uma configuração que não é obrigatória, mas que irá ajudar e/ou acelerar o processo agora e para futuros builds.

Primeiro configurando o conf/bblayers.conf e adicionar nossa nova camada meta-raspberrypi.

Em seguida,  editar o conf/local.conf onde iremos dizer que deverá ser criado a distribuição e toda estrutura para uma RaspberryPI, o arquivo é grande porém vou mostrar apenas as linhas que você deve procurar e alterar ou caso não exista, deve ser adicionada.

No começo é difícil entender toda a estrutura, só para deixar mais fácil de compreender, a variável TOPDIR é referência ao diretório do seu projeto, no meu caso seria /home/bueno/yocto/poky-dizzy/myrasppi que é o Build Directory[link] para a ferramenta.

 

Construindo a distribuição

Já era hora não? A hora tão esperada e mais demorada do post. Agora que iremos usar o poder da ferramenta, alias, a ferramenta e o computador em si, porque nós iremos apenas pegar o resultado final.

Vamos usar a core-image-minimal, é a receita de image mais enxuta “pronta” que a ferramenta oferece que vai dar vida a nossa plaquinha.

O processo para construir, onde entra checar o que foi configurado, baixar todos os pacotes e dependência, configurar, compilar, construir pacotes e por fim montar o rootfs e gerar image final.

A ferramenta que faz tudo isso é a bitbake e em seguida a receita core-image-minimal, o comando time antes é apenas para mostrar o tempo que a tarefa levou.

Nessa hora é bom você ir assistir um filme, tomar um café, alias, vários cafés.

Olhe o tempo que foi gasto para realizar todo o processo e entregar tudo prontinho pra você.

Agora uma visualização geral do tamanho dos diretórios do Yocto Project e o nosso projeto.

Como pode ver, só do nosso projeto foram quase 15G. A documentação da Yocto Project recomenda possuir 50G livre.

 

Gravando o SD-Card

No caso, sempre ao final do processo de construção, o resultado final(rootfs, kernel, bootloader, kernel-modules e afins) estão em projeto_criado/tmp/deploy/images/ no nosso caso myrasppi/tmp/deploy/images/rasppberrypi/.

Certo, não é difícil entender o que foi feito, em si no diretório bcm2835-bootfiles estão os arquivos configuração e binários para o bootloader, gerado o kernel (Image-raspberrypi.bin) que é um link-simbólico para Image–3.12.26+…tgz, o modules-raspberrypi.tgz que é outro link-simbólico para modules–3.12.26+…tgz e o rootfs, que é gerado um .ext3, .tar.bz2, e um .rpi-sdimg.

No caso do RaspberryPI, o core-image-minimal-raspberrypi.rpi-sdimg é o maior de todos, porque ele é a junção de bootloader + kernel + rootfs em um único arquivo para você apenas gravar no SD-Card, simples assim. Olhe a estrutura desse cara.

O comando a seguir mostra como gravar no SD-Card.

OBS: No meu caso, o SD-Card esta no /dev/sdb, em caso de duvidas, execute o sudo fdisk -l ou o gparted para interface gráfica e certifique qual o device do seu SD-Card.

Testando

Agora vamos inserir o SD-CARD na Raspberry PI e ligar.

Por dentro da RaspberryPI.

 

 

Adicional

O que fizemos hoje foi preparar todo o ambiente para construir e poder customizar images Linux para embarcados, algumas mudanças no que foi feito e podemos construir para Beaglebone Black, Wandboard entre outras.

Eu diria que o que vimos aqui, foi como se tivéssemos a armadura do homem de ferro e usássemos ela para acender um led oO. Pois é, não usufruímos dos muitos poderes que o Yocto Project nos proporciona.

Para aprender mais e ver o que mais podemos fazer, segue uma serie de posts relacionados ao tema que foi publicado no Portal Embarcados.

http://www.embarcados.com.br/raspberrypi-yocto/

http://www.embarcados.com.br/cozinhando-com-o-yocto-project/

http://www.embarcados.com.br/desvendando-yocto-project-primeiros-passos/

http://www.embarcados.com.br/raspberry-pi-qt5-yocto-parte-1/

http://www.embarcados.com.br/raspberry-pi-qt5-yocto-parte-2/

 

Espero que tenham gostado, até a próxima!

 

Referências

http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html

http://layers.openembedded.org

http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#intro-requirements

https://wiki.yoctoproject.org/wiki/Releases

http://www.yoctoproject.org/docs/1.7/dev-manual/dev-manual.html#build-directory

http://www.embarcados.com.br/cozinhando-com-o-yocto-project/

http://www.embarcados.com.br/raspberrypi-yocto/

Share Button

CC BY-NC-SA 4.0 Yocto Project – Construindo uma distribuição para RaspberryPI by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

  • Hemant

    Can this article be published in english?

  • Ulysses Fonseca

    Cleiton, excente postagem.

    Dúvida: como eu poderia pela minha receita do yocto, alterar variaveis do u-boot, como por exemplo o bootargs? Ou mesmo por um shell script na minha distribuição linux?

    • Olá Ulysses.
      Depende do caso e do projeto, mas você pode fazer assim:

      1) Criar uma receita em sua meta camada e criar um uEnv.txt, este deverá ser adicionado ao processo antes do do_rootfs, poderia ser até um .bbappend da u-boot para incluir este arquivo.

      2) Criar um .bbappend para modificar as variáveis durante o processo de buildo U-boot, ae você terá que dar uma olhada na receita do U-boot e seu .inc, o link abaixo deve ajudá-lo.

      http://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/recipes-bsp/u-boot/u-boot.inc?h=jethro#n56
      http://www.crashcourse.ca/wiki/index.php/Poky_Variable_Glossary#U-Boot

      3) Caso tenha criado o .conf para sua placa, você pode alterar uma das variaveis de configuração do U-boot, existem várias como UBOOT_MACHINE para especificar um _config do próprio U-boot, UBOOT_LOADADDRESS, UBOOT_SUFFIX, UBOOT_BINARY, UBOOT_IMAGE entre outros. Ae o que você pode fazer é criar um uEnv.txt em sua meta camada e e adicionar o uEnv.txt em UBOOT_ENV = “uEnv.txt” já usei e funciona bacana.

      Espero ter ajudado.

      Grande abraço.

      • Ulysses Fonseca

        Boa noite Cleiton,
        Obrigado pelas dicas, vou testar aqui.

        Vlw.
        Abraços