Emulação em um PC Linux

48

Como conectar um cartão SD contendo um Raspberry Pi OS ao meu PC Linux e inicializá-lo em um emulador?

Por que o VMWare não funciona?

Quais são as limitações deste método?

Relacionados: Emulação em um PC com Windows

Alex L
fonte
Não é uma questão de virtualização em vez de uma questão de emulação?
21712 Zoot
1
Não gosto da emulação na edição da virtualização ... podemos conversar sobre isso?
Alex Chamberlain
2
O problema básico é que o Pi possui uma CPU ARM incompatível com o x86, que é o que o VMWare sabe como executar. Você precisa de um emulador.
Thorbjørn Ravn Andersen
Note-se que uma versão do debian personalizado com muitas das características de Raspbian (incluindo o PIXEL ambiente de trabalho, ea maioria das aplicações) está disponível para download no website Raspberry Pi
angussidney

Respostas:

52

Sim, isso é completamente possível. No entanto, na realidade, é um pouco diferente de como você está pensando.


Preâmbulo

O cartão SD contém uma imagem do sistema operacional. E funciona inflando esta imagem quando o dispositivo está ligado.

Como eu espero que você já saiba, você atualiza esta imagem no cartão SD para criar um sistema em funcionamento. No entanto, o que você pode fazer antes de exibir a imagem é brincar com ela usando o QEMU , que é um emulador de processador , e nos permite emular o conjunto de instruções do ARM.

Dessa forma, todas as alterações feitas na imagem (instalação, compilação etc.) continuarão lá depois que você a fizer no cartão SD.

Agora vou falar sobre como usar o QEMU para carregar a imagem. Vou demonstrar com a imagem do Arch Linux, mas o processo deve ser o mesmo, independentemente.


Usando QEMU

Pré-requisitos

Você precisará adquirir o QEMU para o seu sistema. O QEMU deve ter apenas um requisito; para que os dispositivos de entrada funcionem, é necessário ter o pacote de desenvolvimento SDL instalado, que deve estar disponível no seu gerenciador de pacotes.

Eu recomendo baixar o pacote usando seu gerenciador de pacotes comum:

Arco :

sudo pacman -S sdl qemu

Ubuntu :

Versões mais recentes (desde 14.04) têm um pacote para isso:

sudo apt-get install qemu-system-arm

Para versões mais antigas:

sudo apt-get install libsdl-dev
sudo add-apt-repository ppa:linaro-maintainers/tools
sudo apt-get update
sudo apt-get install qemu-system

Construindo o QEMU você mesmo

Como alternativa, você mesmo pode criar o QEMU. Isso é ótimo se você quiser experimentar uma nova versão, mas ela pode ser lenta e estar preparada para muitos erros durante a compilação! Observe que, se estiver construindo o QEMU a partir do site deles, ele deverá ser compilado para suporte ao ARM. Portanto, verifique primeiro seus repositórios de distribuição. Isso pode ser feito assim;

mkdir rpi-emu && cd rpi-emu
wget http://wiki.qemu.org/download/qemu-1.1.0-1.tar.bz2
tar xvjf qemu-1.1.0-1.tar.bz2
cd qemu-1.1.0-1
./configure –target-list=arm-softmmu,arm-linux-user
make
sudo make install

Verifique se você tem suporte ao ARM com:

qemu-system-arm --version
QEMU emulator version 1.0,1, Copyright (c) 2003-2008 Fabrice Bellard

Obtendo a imagem

Estamos trabalhando com o Arch Linux, então usaremos a imagem do Arch Arm. Mas substitua-o pelo que você deseja trabalhar, ou talvez você já tenha uma imagem. Nesse caso, pule esta etapa.

wget http://anorien.csc.warwick.ac.uk/mirrors/raspberrypi.org/images/archlinuxarm/archlinuxarm-29-04-2012/archlinuxarm-29-04-2012.zip
unzip archlinuxarm-29-04-2012.zip 

Para que o QEMU funcione, também precisamos da imagem do kernel (que estaria dentro do arquivo .img).

Nota: Eu não acho que esta etapa seja necessária para o Debian. Alguém por favor confirme.

Felizmente, existem imagens pré-compiladas disponíveis e você pode usá-las aqui ( download direto ).

TODO: Demonstre como compilar uma imagem do kernel aqui?

Iniciando a VM

Agora você deve ter:

  • Um arquivo img que você pode verificar usando o sha1 fornecido (recomendado).
  • Uma imagem do kernel (zImage).
  • QEMU para ARM.

A máquina virtual agora pode ser iniciada usando o seguinte comando longo:

qemu-system-arm -kernel zImage -cpu arm1176 -M versatilepb -serial stdio -append "root=/dev/sda2" -hda archlinuxarm-29-04-2012.img -clock dynticks

Observe que você só terá várias centenas de megabytes de armazenamento usando esse método (o que resta na imagem). Um disco rígido virtual pode ser criado seguindo o guia do usuário do QEMU .

Jivings
fonte
Isso é mais do que eu estava procurando - obrigado! Esta é uma resposta de referência grande
Alex L
@ Alex Não tem problema, deixe-me saber se você precisa de mim para elaborar. Além disso, diga-me se você tem uma imagem debian funcionando e podemos adicioná-la às instruções, se diferente.
Jivings
Há uma explicação razoavelmente completa aqui
Alex L
@ Alex Essa é boa, eu não tinha visto isso.
Jivings
2
O outro é fechado, então tudo o que posso fazer é votar para reabrir
Jivings
8

Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 27-05-2016, kernel vanilla

insira a descrição da imagem aqui

  1. Compile o QEMU 2.9.0 da fonte:

    sudo apt-get build-dep qemu-system-arm
    git clone --recursive git://git.qemu-project.org/qemu.git
    cd qemu
    git checkout v2.9.0
    ./configure
    make `nproc`
    
  2. Faça o download da imagem e extraia o kernel e o dts:

    1. Baixe a imagem e descompacte-a:

      wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2016-05-31/2016-05-27-raspbian-jessie.zip
      unzip 2016-05-27-raspbian-jessie.zip
      
    2. Monte a segunda imagem da partição. A maneira mais fácil é:

      sudo losetup -f --show -P 2016-05-27-raspbian-jessie.img
      

      Isso funciona apenas com as losetupversões mais recentes do Ubuntu 16.04, outros métodos em: https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      Isso imprime um dispositivo de loop, por exemplo:

      /dev/loop0
      

      assim fazemos:

      sudo mkdir /mnt/rpi
      sudo mount /dev/loop0p1 /mnt/rpi
      cp /mnt/rpi/kernel7.img bcm2709-rpi-2-b.dtb .
      sudo umount /mnt/rpi
      sudo losetup -d /dev/loop0
      
  3. Corre:

    ./arm-softmmu/qemu-system-arm \
        -M raspi2 \
        -append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2" \
        -cpu arm1176 \
        -dtb bcm2709-rpi-2-b.dtb \
        -sd 2016-05-27-raspbian-jessie.img \
        -kernel kernel7.img \
        -m 1G \
        -smp 4 \
        -serial stdio \
    ;
    

Você pode fazer login no terminal exibido no terminal host.

Limitações atuais:

  • -M raspi2foi adicionado no QEMU 2.6.0 e o Ubuntu 16.04 possui apenas o QEMU 2.5.0, portanto, precisamos compilar o QEMU a partir da fonte. Mas isso não é difícil.
  • a GUI mostra, mas não está respondendo ao mouse / teclado, testado no SDL e no VNC. Porém, a CLI funciona perfeitamente. Então, você também pode usar a imagem Lite, que agora é GUI.
  • sem rede

Ubuntu 16.04, QEMU 2.5.0, Raspbian 27/05/2016, kernel modificado

Este método usa o -M versatilepbque está presente no QEMU 2.5.0 do Ubuntu 16.04.

A desvantagem é que você precisa fazer o download de um kernel modificado (consulte Emulando com o Qemu: por que o kernel extra? ) E modificar a imagem, para que seja menos representativo do sistema real.

  1. Faça o download: https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/36ede073f4ccb64f60200ede36c231afe9502070/kernel-qemu-4.4.12-jessie

    Nós escolhemos 4.4.12uma vez que essa é a versão do kernel na imagem Raspbian.

    O processo para gerar esse blob do kernel está descrito no repositório em: https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools

    Por que essa imagem extra do kernel é necessária: Emulando com o Qemu: por que o kernel extra?

  2. Modifique a imagem Raspbian conforme mencionado em: https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emulating-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c

    Resumo:

    1. Monte a imagem exatamente como fizemos para o -M raspi2, mas use a segunda partição em vez da primeira:

      sudo mount /dev/loop0p2 /mnt/rpi
      
    2. Edite a imagem:

      # Comment out the line present there with #
      sudo vim /mnt/rpi/etc/ld.so.preload
      # Comment out the lines of type: "/dev/mmcblk*"
      sudo vim /mnt/rpi/etc/fstab
      
  3. Corre:

    sudo apt-get install qemu-system-arm
    qemu-system-arm \
        -kernel kernel-qemu-4.4.12-jessie \
        -cpu arm1176 \
        -m 256 \
        -M versatilepb \
        -no-reboot \
        -serial stdio \
        -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
        -hda 2016-05-27-raspbian-jessie.img
    

[falhou] Ubuntu 17.04, QEMU 2.8.0 -M raspi2, Raspbian 27-05-2016, kernel vanilla

Neste Ubuntu mais recente, o QEMU 2.8.0 é o padrão, portanto, não precisamos compilar o QEMU da fonte para -M raspi2. No entanto, o 2.8.0 trava na inicialização após a mensagem:

Console: switching to colour frame buffer device 100x30

Isso mostra o quão instável -M raspi2ainda é.

[falhou] Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 16/08/2017, kernel vanilla

Nesta imagem mais recente, usando o mesmo método para 27/05/2016, o kernel entra em pânico na inicialização com:

Please append a correct "root=" boot option; here are the available partitions:
...
[    4.138114] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

bztsrc/raspi3-tutorial Metal desencapado RPI3 em QEMU

https://github.com/bztsrc/raspi3-tutorial é um bom conjunto de exemplos que funcionam apenas no QEMU, iniciando com ultra-rápida em: Como fazer a emulação QEMU para imagens simples do Raspberry Pi

Ciro Santilli adicionou uma nova foto
fonte
2
Cara, você é ótimo!
Subin
4

Você não pode fazer o que está sugerindo, porque o Raspberry Pi possui uma arquitetura de processador diferente da maioria dos PCs. Enquanto a maioria dos PCs são baseados em x86, o RPi é um computador baseado em ARM.

Esse é o mesmo motivo pelo qual você não pode executar, por exemplo, o Microsoft Windows no RPi.

O VmWare não funcionará, pois só pode virtualizar sistemas operacionais baseados em x86 (32 e 64 bits). Existem outros emuladores que podem virtualizar o ARM, como o QEMU, mas eles estão executando a emulação de software completa sem o suporte nativo à virtualização da CPU, portanto, você pode esperar que eles sejam bastante lentos.

Comunidade
fonte
3
Você poderia incluir mais informações sobre como emular o RasPi no x86 (ou seja, com o QEMU)? Era nisso que eu realmente queria focar essa pergunta, embora a explicação seja apreciada.
Alex L
3
Desculpe votar, mas isso não explica como alcançar o que o solicitante precisa.
G-.
Por outro lado, aborda outros pontos da pergunta que a outra resposta não aborda. Acho que seus downvotes são imerecido (não é como esta questão está levando qualquer um)
3
Mesmo sem o apoio virt nativa, lento é muito relativa, pois você provavelmente está virtualizando em uma máquina muito mais poderoso do que um pi framboesa
Kenneth Wilke
0

Você pode facilmente experimentar um simulador do Raspberry Pi incluído no sensor, linha de comando e editor de arquivos no iotify.io. Confira nossa documentação em https://docs.iotify.io/ para iniciar os diferentes projetos, SO e familiarizar-se com o ambiente de trabalho do Raspberry Pi.

insira a descrição da imagem aqui

iotificar
fonte
1
Embora tecnicamente essa seja uma resposta, você está claramente usando nosso site para obter publicidade gratuita. Embora o que você oferece possa ser gratuito, ainda não está ok. Agradecemos sua contribuição à comunidade, mas leve sua publicidade para outro lugar.
Darth Vader
4
@DarthVader: Como o pôster fez saber que eles são afiliados ao produto e responde à pergunta, estou inclinado a chamá-lo de aceitável.
Jacobm001