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 na arquitetura pretendida.
Nesse post veremos como preparar um ambiente 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 note, 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 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
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. Ao término fiz o teste da imagem abaixo:
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!