Gerando distribuições Linux vs Usando distribuições prontas

- por Sergio Prado

Categorias: Linux Tags: ,

Uma dúvida que sempre aparece durante as fases iniciais do desenvolvimento de um sistema com Linux embarcado é sobre qual distribuição utilizar. Devemos utilizar uma distribuição pronta disponibilizada pelo fabricante do hardware ou pela comunidade, ou devemos criar uma distribuição GNU/Linux customizada para a plataforma de hardware?O uso de uma distribuição pronta traz algumas vantagens para o desenvolvimento do projeto.

A primeira grande vantagem é a facilidade para colocar a distribuição para funcionar, bastando copiar a imagem da distribuição para o dispositivo de armazenamento da plataforma de hardware.

Por exemplo, imagine que você tenha escolhido desenvolver um produto baseado na Raspberry Pi. A distribuição padrão da Raspberry Pi é o Raspbian, que pode ser gravado facilmente no cartão SD com o comando abaixo:

$ sudo dd if=2018-04-18-raspbian-stretch.img of=/dev/sdX bs=4M conv=fsync

Feito! A distribuição está pronta para uso.

Outra grande facilidade provida por uma distribuição pronta é a possibilidade de estender seu funcionamento. Por exemplo, para instalar a biblioteca de desenvolvimento USB (libusb) no Raspbian, basta executar o comando abaixo com a Raspberry Pi conectada à Internet:

# apt-get install libusb-dev

Isso sem contar que as distribuições prontas podem ter um ambiente completo de desenvolvimento disponível, então é possível desenvolver e compilar dentro da plataforma de hardware, sem a necessidade de um ambiente de compilação cruzada!

Estas vantagens são realmente atrativas e auxiliam bastante nas fases iniciais de prototipação do projeto. Mas se fossem só vantagens, não existiriam ferramentas capazes de criar distribuições Linux, e ninguém se preocuparia em criar distribuições Linux customizadas para dispositivos com Linux embarcado.

O fato é que existem muitas desvantagens em utilizar uma distribuição pronta em um produto com Linux embarcado, começando pela falta de flexibilidade para adaptar a distribuição às características do hardware e às necessidades do projeto.

Uma distribuição Linux costuma ser bastante monolítica. Isso significa que seus componentes são interdependentes, então pode ser complicado remover de uma distribuição pronta componentes de software desnecessários para o seu projeto.

Por exemplo, ao rodar o comando ps você verá diversos processos em execução. Será que a sua aplicação precisa dos daemons dbus, xinetd, e cron? Possivelmente não, mas se tentar removê-los ou desabilitá-los, poderá ter problemas com outros processos que utilizam os recursos providos por estes daemons.

Com poucas possibilidades de customização da distribuição, precisamos nos adaptar às suas características. E isso gera alguns problemas.

Por exemplo, o rootfs de uma distribuição pronta é grande e pode chegar a ocupar mais de 1GB de armazenamento. Neste caso, você vai precisar de uma memória flash ou eMMC com boa capacidade de armazenamento.

Pelo fato de muitos daemons serem executados no boot de uma distribuição pronta, o tempo de boot é relativamente alto, podendo passar de 2 minutos! E com muitos processos rodando em background, o uso de memória é elevado, deixando menos recursos para as aplicações.

Imagine que a sua plataforma de hardware seja um ARM Cortex-A9 com suporte a instruções multimedia NEON e ponto flutuante em hardware. Será que a distribuição foi compilada com um toolchain capaz de se beneficar destes recursos? Caso contrário, você irá subutilizar os recursos disponíveis no hardware.

Existe também o fato da distribuição estar executando processos que você não tem controle, e muitas vezes não faz a menor idéia do que eles fazem. E isso pode ser um problema grave de segurança!

Outro ponto importante é com relação aos componentes de software de licença copyleft (GPL, LGPL, etc). Ao colocar no mercado um produto com software livre, você tem a obrigação de liberar para seus clientes o código-fonte das aplicações baseadas em GPL (e suas variações). E como você faz para identificar todos os componentes GPL de uma distribuição pronta? E onde está o código-fonte destes componentes? São perguntas bem difíceis de responder.

Na prática, será necessário investir um tempo considerável na tentativa de customização da distribuição. E mesmo que seja possível chegar em um nível aceitável de customização, o que fazer em uma possível atualização da distribuição? Será necessário investir novamente um tempo na customização da nova versão da distribuição, causando trabalho duplicado e difícil de automatizar!

A conclusão? Utilizar uma distribuição pronta será ruim para o seu projeto. Irá consumir recursos desnecessários de hardware como CPU, memória e flash, irá impactar no tempo de boot do sistema, pode gerar problemas de segurança e dificultará a conformidade com licenças de software livre, além de causar possíveis retrabalhos de customização em futuros updates da distro.

Por experiência própria, posso garantir que será uma dor de cabeça manter um projeto com alguns anos de vida utilizando uma distribuição Linux pronta.

A solução para este problema é simples, basta utilizar uma ferramenta de build (buildsystem) e gerar uma distribuição Linux customizada para seu produto.

Uma ferramenta de build é capaz de construir todos os componentes de uma distribuição GNU/Linux (toolchain, bootloader, kernel, rootfs), provendo a flexibilidade necessária para configurar cada componente do sistema operacional e permitindo gerar uma imagem de acordo com as necessidades do projeto, utilizando de forma eficiente os recursos de hardware e facilitando a manutenção e o controle da distribuição em futuros updates.

Atualmente, o Buildroot e o Yocto Project são os dois projetos mais utilizados para construir distribuições Linux. O Buildroot é mais simples e intuitivo, já o Yocto Project é mais completo e flexível. Ambos projetos são muito bem documentados e fáceis de aprender, apesar do Yocto Project ter uma curva de aprendizado bem maior.

Minha percepção é de que muitos projetos são desenvolvidos utilizando uma distribuição pronta por falta de conhecimento, porque utilizar uma ferramenta de build para construir um sistema Linux é bem simples. Por exemplo, os comandos abaixo irão gerar um sistema Linux completo para a Raspberry Pi 3:

$ wget https://buildroot.org/downloads/buildroot-2018.02.4.tar.gz
$ tar xfv buildroot-2018.02.4.tar.gz && cd buildroot-2018.02.4/
$ make raspberrypi3_defconfig
$ make

E então, o que você está esperando para construir a sua distribuição GNU/Linux? :-)

Um abraço,

Sergio Prado

  • danilo capelo de castro

    Sergio, gostaria de lhe fazer uma pergunta sobre o texto, nele voce aborda o fato de criar uma distribuição customizada para o projeto e comenta sobre a utilização de distribuições prontas com relação a atualização e problemas de segurança, minha dúvida é caso seja feita uma distribuição totalmente customizavel em uma futura atualização de kernel a unica coisa que devemos fazer é refazer o build com todos os componentes e alterar o kernel, so isso bastaria ? ( claro se não existir dependencias etc)

    • Olá Danilo,

      É isso mesmo.

      A interface de chamada de sistemas do kernel Linux é bastante estável, então uma atualização do kernel não deverá causar problemas de compatibilidade com as aplicações rodando em espaço de usuário.

      Dito isso, e considerando que foram feitos os testes necessários, para atualizar o kernel basta recompilar e atualizar a imagem no target.

      É importante ressaltar que, se estiver utilizando módulos do kernel, é necessário atualizar também os módulos.

      Um abraço!

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.