Qemu – Emulando o Raspberry PI

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

Qemu-raspberry-boot1

Qemu-raspberry-boot2

Qemu-raspberry-login

Qemu-raspberry-hw

Qemu-raspberry-login-terminal

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!

Share Button

CC BY-NC-SA 4.0 Qemu – Emulando o Raspberry PI by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.