Yocto Project: gerando distribuições GNU/Linux com o Toaster
- por Sergio Prado
O Yocto Project surgiu como solução para um problema frequente de quem trabalha nesta área: a falta de padrão para a construção de sistemas com Linux embarcado.
Sua arquitetura baseada em camadas, além de outros fatores como o forte apoio da Linux Foundation, serviram de motivação para os principais fabricantes de hardware utilizarem as ferramentas do Yocto Project para o desenvolvimento de BSPs para as suas plataformas de hardware. E isso acabou motivando também outras empresas, de fabricantes de módulos de hardware à desenvolvedoras de software, transformando o Yocto Project em um padrão para o desenvolvimento de distribuições Linux embarcadas.
Porém, ainda existe um problema. Sua curva de aprendizado é grande, o que acaba assustando um pouco os iniciantes na área.
Para resolver este problema foi criado o Hob, uma aplicação desktop que funciona como uma interface gráfica para o BitBake.
Pessoalmente, nunca gostei do Hob. Além de limitada, sua interface sempre precisou de um certo polimento, além dos frequentes problemas de lentidão e travamento. É aí que entra o Toaster.
O Toaster é uma ferramenta Web, que inicialmente foi criada para exibir estatísticas de compilação do Yocto Project. Porém, desde o ano passado, a equipe do projeto tem trabalhado para incluir nela a possibilidade de geração de imagens. E esta funcionalidade foi liberada na versão 1.8 do Yocto Project.
Para exemplificar o uso da ferramenta, vamos utilizá-la para gerar uma distribuição GNU/Linux para a Raspberry Pi 2.
INSTALANDO E CONFIGURANDO O TOASTER
Todos os procedimentos descritos neste artigo foram realizados em um PC com o Ubuntu 14.04 64 bits, mas devem funcionar nas principais distribuições GNU/Linux.
O primeiro passo é configurar a máquina de desenvolvimento para trabalhar com o Toaster. Para isso, veja o procedimento descrito no manual do Toaster.
Com a máquina configurada, crie um diretório para o Toaster e entre nele:
$ mkdir -p ~/toaster && cd ~/toaster |
Clone o repositório do Poky:
$ git clone git://git.yoctoproject.org/poky -b fido |
E execute o Toaster:
$ poky/bitbake/bin/toaster |
Na primeira execução, o Toaster irá iniciar o processo de configuração do ambiente de compilação.
Ao perguntar sobre a criação de um superusuário para o Django, responda com “no“.
You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): no |
Pressione ENTER para manter o diretório padrão de log do Toaster:
Toaster needs to know in which directory it can download build log files and other artifacts. Toaster suggests "/opt/labs/ex/toaster/toaster_build_artifacts/". Press Enter to select "/opt/labs/ex/toaster/toaster_build_artifacts/" or type the full path to a different directory: |
Pressione novamente ENTER para manter o diretório padrão de downloads das camadas:
Toaster needs to know in which directory it should check out the layers that will be needed for your builds. Toaster suggests "/opt/labs/ex/toaster". If you select this directory, a layer like "meta-intel" will end up in "/opt/labs/ex/toaster/meta-intel". Press Enter to select "/opt/labs/ex/toaster" or type the full path to a different directory (must be a parent of current checkout directory): |
Digite o diretório de build do Toaster (ex: /home/sprado/toaster/build):
-- Validation: The build directory must be set. Toaster needs to know where is your build directory. The build directory is where all the artifacts created by your builds will be stored. Type the full path to the directory (for example: " /home/labworks/build") /home/sprado/toaster/build |
Por fim, digite “1” para selecionar o arquivo de configuração padrão que deve ser carregado pelo Toaster:
Toaster will list now the configuration files that it found. Select the number to use the desired configuration file. [1] - /opt/labs/ex/toaster/poky/meta-yocto/conf/toasterconf.json [0] - Exit without importing any file Enter your option: 1 |
Ao final da configuração, deverá ser aberta automaticamente uma página no seu navegador web padrão. Caso contrário, abra seu navegador web e acesse o Toaster em http://localhost:8000.
Clique em “To start building, create your first Toaster project” para criar um novo projeto.
Digite o nome do projeto e selecione o último release do Yocto (1.8 no momento em que escrevo este artigo). Depois clique em “Create Project” para que seja aberta a janela inicial de configuração do projeto.
No campo de texto com o botão Build, é possível processar qualquer receita.
Abaixo deste campo, temos 3 colunas:
- À esquerda, podemos selecionar qualquer camada compatível com o Toaster. As camadas selecionadas serão baixadas automaticamente da Internet ao iniciar a compilação.
- No meio, podemos identificar e selecionar as receitas disponíveis para compilação.
- À direita, podemos selecionar a MACHINE (plataforma-alvo) e configurar qualquer outra variável do BitBake.
Na configuração das camadas, clique em “View all compatible layers“, procure por raspberry e selecione a camada meta-raspberry.
Retorne para a tela principal. À direita, selecione o campo Machine e digite raspberrypi2.
Retorne para a tela principal. Se quiser, clique em “Edit configuration variables” para editar qualquer variável antes de iniciar o processamento da receita.
Agora é só gerar a imagem. Na parte superior da tela principal, digite core-image-minimal e clique em Build.
Primeiro o Toaster irá baixar todas as camadas selecionadas e depois iniciará a compilação. Durante a compilação, o status do andamento da compilação será exibido na página inicial do projeto. Na minha máquina, a compilação levou 45 minutos.
No final, as imagens estarão disponíveis no diretório de compilação do Toaster:
$ ls ~/toaster/build/tmp/deploy/images/raspberrypi2/ bcm2835-bootfiles Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-raspberrypi2-20150606172007.bin core-image-minimal-raspberrypi2-20150606172007.rootfs.ext3 Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-w1-gpio-overlay-20150606172007.dtb core-image-minimal-raspberrypi2-20150606172007.rootfs.jffs2 Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-w1-gpio-pullup-overlay-20150606172007.dtb core-image-minimal-raspberrypi2-20150606172007.rootfs.manifest Image-bcm2708-rpi-b.dtb core-image-minimal-raspberrypi2-20150606172007.rootfs.tar.bz2 Image-bcm2708-rpi-b-plus.dtb core-image-minimal-raspberrypi2.ext3 Image-bcm2709-rpi-2-b.dtb core-image-minimal-raspberrypi2.jffs2 Image-ds1307-rtc-overlay.dtb core-image-minimal-raspberrypi2.manifest Image-hifiberry-amp-overlay.dtb core-image-minimal-raspberrypi2.tar.bz2 Image-hifiberry-dac-overlay.dtb Image Image-hifiberry-dacplus-overlay.dtb Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-bcm2708-rpi-b-20150606172007.dtb Image-hifiberry-digi-overlay.dtb Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-bcm2708-rpi-b-plus-20150606172007.dtb Image-iqaudio-dac-overlay.dtb Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-bcm2709-rpi-2-b-20150606172007.dtb Image-iqaudio-dacplus-overlay.dtb Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-ds1307-rtc-overlay-20150606172007.dtb Image-lirc-rpi-overlay.dtb Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-hifiberry-amp-overlay-20150606172007.dtb Image-pcf8523-rtc-overlay.dtb Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-hifiberry-dac-overlay-20150606172007.dtb Image-pps-gpio-overlay.dtb Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-hifiberry-dacplus-overlay-20150606172007.dtb Image-raspberrypi2.bin Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-hifiberry-digi-overlay-20150606172007.dtb Image-w1-gpio-overlay.dtb Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-iqaudio-dac-overlay-20150606172007.dtb Image-w1-gpio-pullup-overlay.dtb Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-iqaudio-dacplus-overlay-20150606172007.dtb modules--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-raspberrypi2-20150606172007.tgz Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-lirc-rpi-overlay-20150606172007.dtb modules-raspberrypi2.tgz Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-pcf8523-rtc-overlay-20150606172007.dtb README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt Image--3.18.5+gita6cf3c99bc89e2c010c2f78fbf9e3ed478ccfd46-r0-pps-gpio-overlay-20150606172007.dtb |
FUTURO
O Toaster está bem amigável e estável. Ainda faltam muitas opções que podem ser incluídas na configuração, como por exemplo a habilitação do build history, a configuração de mirrors de download e a criação de receitas de imagem.
Mas as perspectivas são boas para que esta ferramenta diminua a curva de aprendizado e motive mais desenvolvedores e hobbystas a utilizarem as ferramentas providas pelo Yocto Project para construir distribuições Linux customizadas para sistemas embarcados.
Um abraço,
Sergio Prado