Meu TCC estou trabalhando com Linux Embarcado e em especial utilizando o Raspberry PI B. Porém nem todos os dias eu podia levar o Rb PI para a empresa e no horário do almoço realizar testes, ou para a faculdade com medo de danificar no transporte e sem contar que é chato ligar tudo e blá blá blá. Então pensei, será que não tem como eu virtualizar apenas para testar os recursos que irão rodar no ARM e depois só passo a versão final?
E quem procura acha (Google!), vi alguns sites mostrando como criar maquinas virtuais com Qemu, que já uso bastante por sinal, então para ter o Qemu com suporte a arquitetura ARM podemos fazer de duas maneiras:
cleiton@lab-linux:~/projeto/qemu/$ sudo apt-get update #No Ubuntu cleiton@lab-linux:~/projeto/qemu/$ sudo apt-get install qemu-kvm qemu-kvm-extras # No Debian cleiton@lab-linux:~/projeto/qemu/$ sudo apt-get install qemu
Você pode compilar na mão baixando o fonte do site, eu não fiz, mas pelo README que dei uma olhada é só no momento da compilação adicionar a opção –target-list=arm-softmmu mas não fiz este procedimento o acima foi suficiente.
Se você digitar qemu e pressionar duas vezes o tab irá aparecer várias comandos, mas o que interessa para nós é qemu-system-arm e é claro ter suporte ao processador ARM que o Raspberry PI utiliza, para verificar isso:
cleiton@lab-linux:~/projeto/qemu/$ qemu-system-arm -cpu ? Available CPUs: arm926 arm946 arm1026 arm1136 arm1136-r2 arm1176 arm11mpcore cortex-m3 cortex-a8 cortex-a8-r2 cortex-a9 ti925t pxa250 sa1100 sa1110 pxa255 pxa260 pxa261 pxa262 pxa270 pxa270-a0 pxa270-a1 pxa270-b0 pxa270-b1 pxa270-c0 pxa270-c5 any
O SoC que o Raspberry PI utilizado é da Broadcom BCM2835 que já integra CPU, GPU, DSP e SDRAM, porém nosso CPU em questão é ARM1176JZF-S família ARM11 (Armv6), por curiosidade o J é de ARM Jazelle, que é uma característica de processadores ARM que permitem executar aplicações Java é um Java embarcado, mas isso é tema para outro post.
Então sabemos que o processador procurado é o arm1176. Que também seria facil saber verificando dentro do Raspberry PI ligado visualizando o conteudo de /proc/cpuinfo.
cleiton@lab-linux:~/projeto/qemu/$ qemu-system-arm -cpu ? | grep arm1176 arm1176
Agora vamos baixar a imagem do Linux Debian direto do site do Raspberry e o Kernel para o Qemu.
cleiton@lab-linux:~/projeto/qemu/$ wget http://downloads.raspberrypi.org/images/raspbian/2013-05-25-wheezy-raspbian/2013-05-25-wheezy-raspbian.zip cleiton@lab-linux:~/projeto/qemu/$ wget http://xecdesign.com/downloads/linux-qemu/kernel-qemu
Agora descompacte a imagem e execute o script para iniciar a VM:
cleiton@lab-linux:~/projeto/qemu/$ sudo qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -append "root=/dev/sda2 panic=1" -hda 2013-05-25-wheezy-raspbian.img
Problemas e soluções:
Tive problema ao iniciar a VM e ficar um loop pedindo para digitar raspi-config porém não era possivel até que surgia um SIGNAL e um reboot era feito, ou surgia uma tela com (none) login: e não autenticava o usuario pi e senha raspberry como padrão, para resolver:
cleiton@lab-linux:~/projeto/qemu/$ mkdir -p /mnt/rbpi cleiton@lab-linux:~/projeto/qemu/$ sudo mount 2013-05-25-wheezy-raspbian.img -o offset=62914560 /mnt/rbpi cleiton@lab-linux:~/projeto/qemu/$ ls -l /mnt/rbpi/etc/ | grep ld ld.so.cache ld.so.conf ld.so.conf.d ld.so.preload cleiton@lab-linux:~/projeto/qemu/$ vim /mnt/rbpi/etc/ld.so.preload #Comente a linha e salve #/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so cleiton@lab-linux:~/projeto/qemu/$ sudo umount /mnt/rbpi
Não tive mais problemas, mas em um terceiro Linux que realizei o procedimento não sei se foi de tantos testes com a imagem foi reportado um erro de inconsistência de dados no /dev/sda2 e ele mesmo recomendava o fsck e foi o que resolveu:
pi@raspberrypi ~ $ sudo fsck -fy /dev/sda2
Agora mais iniciar com o script abaixo:
cleiton@lab-linux:~/projeto/qemu/$ sudo qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=10" -hda 2013-05-25-wheezy-raspbian.img -redir tcp:2722::22
Não adianta eu mostrar e não comentar sobre os parâmetros, o mais básico que utilizo é este e as opções significam:
qemu-system-arm: Estou dizendo que é baseado em arm o sistema que irei subir
-kernel: Não preciso nem dizer né, irei fornece o arquivo kernel para o qemu utilizar
-cpu arm1176: Esse é muito importante aqui o modelo do processador ARM
-m 256: Esse é autoexplicativo mas vamos la estou passando a quantidade de memoria RAM a ser utilizada.
-M versatilepb: Placa emulada, baseada em uma placa real que utiliza um processador ARM, e inclui diversos periféricos, servindo como uma ótima opção para desenvolvimento e aprendizado, é uma base para o kernel ter de periféricos.
-no-reboot: Desabilitar o reboot da VM, caso contrario você consegue reiniciar dando um reboot no Linux
-serial stdio: Vai fazer aparecer no stdout tudo o que os programas a executar internamente enviarem para a porta serial; e tudo o que for escrito pelo utilizador no seu stdin, vai aparecer como “entrando” pela porta serial da máquina virtual.
-append “root=/dev/sda2 panic=10”: Linha de comando para o kernel, no caso passamos para o root ser em /dev/sda2 e panic=1 que estamos falando que em caso de crash rebootar em 1s, eu deixo em 10s em desenvolvimento e depois diminuo.
-hda 2013-05-25-wheezy-raspbian.img: Estou passando a minha imagem para ele montar e usar
-redir tcp:2722::22: Direcionar a porta 2722 para a porta 22 da VM no protocolo tcp
Tem uma infinidade de comandos e combinações com o Qemu mas pretendo abordar em um post sobre Qemu em virtualização, bom espero ajudar alguém como isso tem me ajudado.
Até a próxima!
Qemu – Emulando o Raspberry PI by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.