Manual

do

Maker

.

com

Emulação de ARM com QEMU e Debian

Emulação de ARM com QEMU e Debian

Montar um toolkit para cross-compiling é fundamental para o desenvolvimento de um sistema a ser utilizado em arquiteturas diferentes de x86. Mas às vezes é necessário apenas compilar algum programa para embarcar em um sistema já pronto e nesse caso, pode ser melhor utilizar uma máquina virtual para fazer emulação da arquitetura pretendida.

Nesse post veremos como preparar um ambiente de emulação para essa tarefa de compilação transparente utilizando Debian e o QEMU para execução de um sistema virtual na plataforma ARM.

Instalando o QEMU

Uma das opções é baixar e compilar. Se for sua opção preferida, sinta-se a vontade para baixá-lo do site oficial. Eu estou utilizando Mint no meu notebook, então preferi utilizar o apt-get:

sudo apt-get install qemu-kvm qemu-kvm-extras

Tendo-o instalado, o próximo passo é baixar o instalador do Debian.

Baixando o sistema ARM

Esse link certamente quebrará muito cedo devido ao dinamismo das atualizações. No momento desse post estavam disponíveis o kernel e o initrd nestas versões abaixo, mas se o link estiver quebrado quando você for baixá-lo, basta seguir a raiz do link em dois pontos:

  • até o codinome - por exemplo, poderia ser lenny onde está wheezy.
  • até a versão do kernel - esse certamente é mais dinâmico que a versão do SO.

Baixe então o kernel e o initrd:

wget ftp://ftp.debian.org/debian/dists/wheezy/main/installer-armel/current/images/versatile/netboot/vmlinuz-3.2.0-4-versatile
wget ftp://ftp.debian.org/debian/dists/wheezy/main/installer-armel/current/images/versatile/netboot/initrd.gz

Criando o arquivo RAW

Crie o arquivo que será o HD dessa instalação com o comando:

qemu-img create -f raw Debian.img 2G

Esse é um processo bastante rápido, mas não fique muito animado porque o processo lento ainda está por vir.

Instalando Debian for ARM

Eu criei um diretório chamado "embedded" contendo o kernel, initrd e o arquivo raw. Faça algo parecido e a partir desse diretório execute o seguinte comando:

qemu-system-arm -m 512 -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.gz -hda Debian.img -append "root=/dev/ram" -M versatilepb

No comando acima, o parâmetro '-m' reserva 512MB de memória. Creio que 256 seja suficiente já que nesse momento é apenas o recurso reservado para a instalação. Os demais parâmetros são auto-explicativos, sem bem que o parâmetro de memória é 'auto-dedutível'.

O tempo de instalação aqui está diretamente relacionado à velocidade de sua conexão com a internet.

No particionamento, simplesmente criei a partição raiz. A partição swap não é obrigatória em nenhum sistema e certamente não fará diferença aqui. Quando o particionador perguntar se realmente deseja fazer o particionamento sem swap, confirme e siga adiante.

Ao término da instalação será exibida uma mensagem relacionada ao gerneciador de boot que não foi instalado devido à arquitetura, seguido da recomendação para fazer o boot. Confirme e aguarde o reboot.

No reboot do instalador, siga novamente os passos até o particionamento de disco. Chegando nesse ponto, use Alt+F2 para entrar em uma tty. Nesse ponto será necessário montar o disco e migrar a raiz de forma a poder utilizar o sistema virtual para copiar o kernel e o initrd ao sistema nativo. Segue o exemplo, considerando que tenha escolhido o mesmo sistema de arquivos que eu:

mount /dev/sda1 /mnt -t ext4
mount -o bind /dev/ /mnt/dev
mount -o bind /proc /mnt/proc
chroot /mnt

A partir de agora tudo o que está contido em sua instalação da máquina virtual poderá ser utilizado, incluindo o ssh, que utilizaremos para a copia. Na instalação configurei o dominio como intranet.local, para que a resolução de nomes seja feita pelo servidor DNS que instalei em meu note para resolver nomes para a rede local. Se quiser fazê-lo, o procedimento pode ser visto nesse post. Então:

scp /boot/{vmlinuz,initrd}*-3.2.0-4-versatile djames@dom0:~/

Agora sua máquina virtual está pronta para o boot. Desmonte tudo e feche a janela do instalador.

Boot da imagem ARM com kernel e initrd copiados

Mova o kernel e o initrd para o mesmo diretório que contém a imagem do sistema (Debian.img) e para não se tornar repetitivo, crie um script para iniciar sua máquina virtual (eu renomeei o initrd para initrd.img) contendo a seguinte linha de comando:

qemu-system-arm -m 512 -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.img -hda Debian.img -append "root=/dev/sda1"

O boot deverá exibir algo parecido com a imagem inicial desse post. Depois disso, inicia-se o processo de instalação das ferramentas via apt-get !
O comando apt-get install gcc resultará na instalação de algumas outras dependências gerando um total de 48MB em pacotes.

Como se pode ver, o processo é lento, mas descomplicado.
Estou preparando material para um próximo post com uma i.MX53, onde mostrarei como compor o sistema operacional, mas ainda não é 'from scratch'. Acompanhe!

Se gostou, não deixe de compartilhar; dê seu like no video e inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.