Qemu: Emulando o Raspberry PI

Publicado: 26 de junho de 2013 em Qemu, Raspberry
Tags:, , , , , , , , ,

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 familia ARM11 (Armv6), por curiosidade o J é de ARM Jazelle, que é uma caracteristica 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!

Licença Creative Commons
Este trabalho de Cleiton Bueno, foi licenciado sob uma Licença Creative Commons Atribuição-NãoComercial-CompartilhaIgual 3.0 Brasil.
Baseado no trabalho em http://www.cleitonbueno.wordpress.com.

comentários
  1. uilianries disse:

    Show de bola!
    Parabéns pelo artigo.
    Essa é uma ótima maneira de ajudar a estudar a Raspberry Pi.

  2. Ao executar o comando “sudo mount 2013-05-25-wheezy-raspbian.img -o offset=62914560 /mnt/rbpi” é retornado um erro: “mount: mount point /mnt/rbpi does not exist”.

  3. A propósito, meu TCC também é sobre o raspberry. Falta voce passar o comando sudo mkdir pra criar os diretorios.

    • cleitonbueno disse:

      Que legal Rodrigo. Eu queria ter adquirido o BeagleBone Black mas na época não estava enviando para o Brasil tinha poucos distribuidores, mas o Raspberry PI B me atendeu super bem, tanto que comecei com o Raspbian e o boot estava com 40s e para ficar tudo up próximo a 01:15s.
      Depois de ler muito sobre embarcar com Linux meu kernel ficou com 2.8M e meu rootfs próximo a 25M e meu boot completo caiu pra cerca de 12s, mas isso utilizando Busybox e totalmente customizado para a minha aplicação tanto que levei próximo a 6 meses pra deixar como queria.
      Mas acabando o TCC irei explicar como fiz tudo isso, pois não achei blogs brasileiros passando essas informações.
      O seu é sobre o que? Abraço, obrigado pela correção.

  4. Leandro disse:

    otimo post!
    So fiquei com duas duvidas, se eu configurar a placa de rede do raspi na mesma faixa de IP que eu utilizo meu Debian, o raspi ira navegar na internet?
    Estou travado na resolucao 640×480… tem como mudar isso?

  5. manotroll disse:

    e como altera a resolução (pergunta)
    pois essa fixa e pequena pra um teste que quero fazer.

  6. manotroll disse:

    compilei o qemu e mesmo assim não esta instalando
    esta pedindo a dependência libspice-server1
    como faz pra compilar com todas as opções (pergunta)
    to no Linux (koppix) e não esta dando pra configurar o teclado

  7. Jack Beefree disse:

    Valeu Cleiton Bueno o qemu aqui no meu Ubuntu seguindo o teu tutorial funcionou certinho, tive que criar os diretório /mnt/rpbi, fsck também pois sem os procedimentos dava problemas no boot. Por fim depois de tudo ajustado até o modo grafico funfou.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s