Uma das características bastante vantajosas do Yocto Project é a possibilidade de se gerar uma distribuição Linux embarcado com suporte ao gerenciamento de pacotes. O gerenciamento de pacotes é especialmente interessante durante o processo de desenvolvimento de uma distribuição, bem como sistemas que demandam atualizações depois que foram enviados para “campo”.
Dependendo da complexidade do sistema, quantidade de pacotes e cadeia de dependência entre eles, o processo de desenvolvimento de uma distribuição pode demandar adições de pacotes ao longo do ciclo de desenvolvimento do produto. Durante esse processo ter à disposição uma ferramenta que possibilite a fácil adição de novos pacotes para testes e novas implementações, traz agilidade e economia de tempo e recursos.
Quando o produto já está em campo ele potencialmente irá apresentar falhas e tendo a mãos um gerenciador de pacotes, os custos de manutenção serão reduzidos e a possibilidade em se adicionar novas “features” também será facilitada.
Gerenciadores de pacotes do Yocto Project
O Yocto pode gerar pacotes nos três formatos mais comumente encontrados em sistemas embarcados:
Uma observação a ser feita é que: o Yocto Project gera uma distribuição Linux embarcados criada por VOCÊ e que disponibiliza a inclusão de um ou mais gerenciadores de pacotes para a SUA distribuição. Isso quer dizer que sua distribuição NÃO É compatível com Ubuntu/Debian (deb) ou Fedora/Red Hat (rpm), pois as definições e nomeações de arquitetura e versões de pacotes provavelmente serão diferentes daquelas utilizadas pelas distribuições de desktop citadas.
Você até consegue instalar os pacotes pré-compilados para estas distribuições em seu sistema gerado, desde que use parâmetros para ignorar algumas flags e forçar a instalação. Isso pode acarretar em problemas que podem não ser muito facilmente detectados e rastreados.
Se você não conhece o Yocto e/ou nunca gerou uma imagem com ele, sugiro que procure entendê-lo e conhecer pelo menos superficialmente o processo de construção. Aqui no Embarcados temos diversos artigos que abordam esses aspectos e que em especial podemos destacar:
- Apresentação no Seminário Linux Embarcado 2015: Desenvolvendo Sistemas Linux Embarcado com Yocto Project – Diego Sueiro;
- Introdutório ao Yocto: BeagleBone Black + Yocto – Henrique Rossi;
- Intel Edison + Yocto – Como construir sua própria distribuição Linux Embarcado – Diego Sueiro;
- Qt5.4 na Raspberry Pi 2 com Yocto Project (fido) – Parte 1 – Diego Sueiro.
Neste artigo iremos mostrar como configurar sua estação de trabalho (computador Host onde o sistema é gerado) para que ele sirva como um repositório de pacotes. Esse processo também está documento no manual do Yocto.
Requisitos da imagem para usar o gerenciamento de pacotes
Basicamente você deverá configurar duas variáveis para que sua imagem tenha suporte ao gerenciamento de pacotes:
- PACKAGE_CLASSES – a ser preenchida no arquivo local.conf ou no arquivo de configuração da distribuição.
- Pode receber os seguintes valores: “package_rpm“, “package_deb“, “package_ipk“;
- IMAGE_FEATURES – a ser preenchida no arquivo local.conf , ou no arquivo de configuração da distribuição, ou na receita da imagem.
- Deve conter o valor “package-management“.
Como exemplo, teremos em nosso arquivo conf/local.conf inserido no diretório de build:
PACKAGE_CLASSES = "package_ipk" IMAGE_FEATURES += "package-management"
Após configuradas, você irá gerar uma nova imagem (comando “bitbake <nome_da_imagem>“) e instala-la em seu target.
Preparação do Host
Para que o target consulte o servidor de pacotes via web temos que configurar o Host com um servidor HTTP apontando para o local onde o Yocto “entrega” os pacotes gerados. Estamos usando nesse exemplo um Host Ubuntu 14.04 64-bits com o Nginx.
Vamos realizar as instalações e configurações necessárias. Abra um terminal e digite:
sudo apt-get install nginx
Se você tiver o apache2 instalado, é necessário que você pare o seu serviço através do comando:
sudo service apache2 stop
Crie o arquivo de configuração /etc/nginx/sites-enabled/fido-repo com o seguinte conteúdo:
server {
listen 80 default_server;
root /home/dsueiro/yocto/build-fido/tmp/deploy/ipk/;
autoindex on;
}
Note que nesse caso o Yocto está fazendo deploy dos pacotes gerados em “/home/dsueiro/yocto/build-fido/tmp/deploy/ipk/“. Faça as modificações no caminho necessárias para que reflita o ambiente que você está utilizando.
Agora vamos remover e fazer backup da configuração padrão do Nginx e adicionar o nosso repositório de pacotes:
sudo rm /etc/nginx/sites-enabled/default sudo mv /etc/nginx/sites-available/default ~/nginx-sites-available-default.bak sudo ln -s /etc/nginx/sites-enabled/fido-repo /etc/nginx/sites-available/fido-repo
Para que o servidor HTTP funcione corretamente nós devemos adicionar o nosso usuário ao seguinte arquivo de configuração do Nginx /etc/nginx/nginx.conf:
user dsueiro;
Modifique o nome de usuário que você esteja utilizando em seu ambiente.
Agora iremos reiniciar o servidor HTTP com o comando:
sudo service nginx restart
Para testar veremos se no borwser do Host aparece o repositório de pacotes através do endereço: https://localhost
Pela figura acima, onde temos um sistema gerado para a Raspberry Pi 2, podemos notar que o Yocto separa os pacotes em 3 principais tipos:
- Pacotes independentes de arquitetura – all;
- Exemplos: update-rc.d e tzdata.
- Pacotes dependentes da arquitetura da CPU – cortexa7hf-vfp-vfpv4-neon;
- Exemplos: busybox e libstdc++.
- Pacotes dependentes da MACHINE – raspberrypi2.
- Exemplos: u-boot e kernel.
Em cada subdiretório teremos, além dos binários dos pacotes, os arquivos texto “Packages” que contém a lista e informações dos pacotes gerados.
Configurando o Target
Em nosso exemplo, na imagem está inserido o gerenciador de pacotes opkg e para que o Target “enxergue” nosso servidor de pacotes devemos configurar o arquivo “/etc/opkg/base-feeds.conf“ no Target com o seguinte conteúdo:
src/gz all https://10.42.0.1/all src/gz raspberrypi2 https://10.42.0.1/raspberrypi2 src/gz cortexa7hf-vfp-vfpv4-neon https://10.42.0.1/cortexa7hf-vfp-vfpv4-neon
Nesse exemplo o Host está configurado com o IP 10.42.0.1 e como servidor DHCP também. A conexão entre ele e o target está sendo feita via cabo Ethernet. Modifique o endereço de IP de acordo com o ambiente que você esteja utilizando.
Agora iremos atualizar o Target com as informações de pacotes disponíveis no servidor através do comando:
opkg update
Instalando novos pacotes no Target
Para instalar novos pacotes no target, como por exemplo o alsa-utils, primeiro teremos que gerá-lo no Host através do Yocto:
bitbake alsa-utils
Atualizar o índice de pacotes no Host:
bitbake package-index
ou
bitbake alsa-utils package-index
Atualizar o índice de pacotes no Target:
opkg update
E instalar o pacote no target:
opkg install alsa-utils
Conclusão
O processo de configuração tanto do Host quanto do Target para uso de gerenciamento de pacotes em sistemas Linux embarcado gerados pelo Yocto é bastante simples e direto. Neste artigo mostramos como montar esse setup para uma conexão local, mas que pode ser facilmente estendida para conexões via internet.









Como sempre ótimo artigo e de grande valor. Valeu Diegão!
Olá Robinson,
Obrigado pelo apoio.