Rodando contêineres e aplicações Linux x86 no Raspberry Pi
Antes que perguntem por que alguém quer rodar uma aplicação ou mesmo um sistema operacional x86 já em "desuso" em um RPI, já vou dando a resposta. A indústria.
Introdução
Quem é do ramo de automação industrial sabe que existem uma infinidade de sistemas e aplicações proprietários legados, geralmente compostos por hardwares e softwares muito antigos. Quando ocorre a queima de um hardware dedicado geralmente é uma agonia. Os fabricantes das máquinas industriais quando dispõe do dispositivo cobram fortunas. Para terem uma ideia recentemente fiz um trabalho onde um simples PC industrial da Phoenix Contact com a solução para a máquina industrial custava em seu país de origem a bagatela de ? 13.000,00 (treze mil euros) fora frete e impostos de importação e nem vou mencionar que normalmente não dispõem desses dispositivos para pronta entrega e levam semanas e até meses para disponibilizá-lo.
Não vou abordar a instalação do sistema operacional pois há farto material sobre o assunto.
apt-get update -y
Em seguida:
apt-get install qemu qemu-user qemu-user-static -y
Somente com esses pacotes já é possível fazer um chroot de um sistema x86 no RPI.
Agora vamos à instalação do Docker.
Instalando a chave do repositório:
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
Exatamente como acima, com hífen ao fim da linha.
Para ARM64:
echo 'deb [arch=arm64] https://download.docker.com/linux/debian buster stable' | tee /etc/apt/sources.list.d/docker.list
Para ARM32:
echo 'deb [arch=armhf] https://download.docker.com/linux/debian buster stable' | tee /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install docker-ce
usermod -aG docker $USER
E finalmente:
systemctl restart docker.service
E verifique se o serviço subiu corretamente:
systemctl status docker.service
Para testar se o Docker está funcionando corretamente:
docker run hello-world
Testando com uma imagem i386:
docker pull i386/debian
Em seguida:
docker run -it --rm --name i386 --hostname i386 i386/debian
Fontes:
Por que contêiner e não VM?
Cada caso é um caso e há situações em que é mais fácil ou até mesmo possível fazer com um ou com outro. Em automação industrial não há consensos nem padrões para nada com exceção do protocolo MODBUS e ainda assim há fabricantes que usam seus protocolos proprietários para assegurar a "fidelidade" dos clientes. Nesse artigo vou abordar o uso de contêiner Docker. O Contêiner apresenta a facilidade de contornar situações onde por exemplo não é possível fazer um Linux antigo rodar dispositivos de hardware novos, ou ainda como eu peguei uma vez todo o sistema raiz estava em um initrd com Squashfs, onde foi preciso fazer um unsquashfs do initrd para gerar a imagem e só havia um único driver de interface de rede compilado para um chipset específico e mesmo que eu conseguisse uma interface de rede com esse chipset ficaria impossibilitado de instalá-la no PC industrial pois sequer havia um slot PCI disponível.Instalando o RaspOS ARM64 (Raspbian)
A imagem pode ser obtida nos servidores da Raspberry Foundation. Usei a versão 64bit por uma questão de compatibilidade pois podemos rodar tanto contêineres x86 quando 64. Segue o link para o diretório:Não vou abordar a instalação do sistema operacional pois há farto material sobre o assunto.
Instalando os pacotes necessários
Logado como root, e conectado à internet proceda:apt-get update -y
Em seguida:
apt-get install qemu qemu-user qemu-user-static -y
Somente com esses pacotes já é possível fazer um chroot de um sistema x86 no RPI.
Agora vamos à instalação do Docker.
Instalando a chave do repositório:
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
Exatamente como acima, com hífen ao fim da linha.
Para ARM64:
echo 'deb [arch=arm64] https://download.docker.com/linux/debian buster stable' | tee /etc/apt/sources.list.d/docker.list
Para ARM32:
echo 'deb [arch=armhf] https://download.docker.com/linux/debian buster stable' | tee /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install docker-ce
usermod -aG docker $USER
E finalmente:
systemctl restart docker.service
E verifique se o serviço subiu corretamente:
systemctl status docker.service
Para testar se o Docker está funcionando corretamente:
docker run hello-world
Testando com uma imagem i386:
docker pull i386/debian
Em seguida:
docker run -it --rm --name i386 --hostname i386 i386/debian
Considerações finais
Só ressaltando que o desempenho não é dos melhores, visto que não trata-se de virtualização e sim emulação. Nem todas as aplicações são possíveis ou viáveis rodando dessa forma.Fontes:
Legal.
___________________________________
Conhecimento não se Leva para o Túmulo.