Emulation auf einem Linux-PC

48

Wie kann ich eine SD-Karte mit einem Raspberry Pi-Betriebssystem an meinen Linux-PC anschließen und das Betriebssystem in einem Emulator starten?

Warum funktioniert VMWare nicht?

Was sind die Einschränkungen dieser Methode?

Verwandte: Emulation auf einem Windows-PC

Alex L
quelle
Ist das nicht eine Virtualisierungsfrage statt einer Emulationsfrage?
Zoot
1
Ich mag die Emulation zur Virtualisierung nicht bearbeiten ... können wir darüber plaudern?
Alex Chamberlain
2
Das Grundproblem ist, dass der Pi über eine ARM-CPU verfügt, die nicht mit x86 kompatibel ist. VMWare kann das ausführen. Du brauchst einen Emulator.
Thorbjørn Ravn Andersen
Beachten Sie, dass eine Version von Debian, die mit vielen Funktionen von Raspbian (einschließlich der Desktop-Umgebung PIXEL und der meisten Anwendungen) angepasst wurde, zum Download von der Raspberry Pi-Website verfügbar ist
angussidney

Antworten:

52

Ja, das ist völlig möglich. In Wirklichkeit ist es jedoch ein bisschen anders, als Sie denken.


Präambel

Die SD-Karte enthält ein Image des Betriebssystems. Und funktioniert, indem dieses Bild aufgeblasen wird, wenn das Gerät eingeschaltet ist.

Wie Sie wahrscheinlich bereits wissen, flashen Sie dieses Image auf die SD-Karte, um ein funktionierendes System zu erstellen. Was Sie jedoch tun können, bevor Sie das Bild flashen , ist, mit QEMU , einem Prozessoremulator , ein wenig herumzuspielen und den ARM-Befehlssatz zu emulieren.

Auf diese Weise bleiben alle Änderungen, die Sie am Image vornehmen (Installieren, Kompilieren usw.), erhalten, nachdem Sie es auf die SD-Karte geflasht haben.

Ich werde Ihnen jetzt erklären, wie Sie mit QEMU das Image laden können. Ich werde es mit dem Arch Linux-Image demonstrieren, aber der Prozess sollte trotzdem der gleiche sein.


QEMU verwenden

Voraussetzungen

Sie müssen QEMU für Ihr System erwerben . QEMU sollte nur eine Anforderung haben. Damit Eingabegeräte funktionieren, muss das SDL-Entwicklungspaket installiert sein, das bei Ihrem Paketmanager erhältlich sein sollte.

Ich empfehle, das Paket mit Ihrem regulären Paketmanager herunterzuladen:

Bogen :

sudo pacman -S sdl qemu

Ubuntu :

Neuere Versionen (seit 14.04) haben ein Paket dafür:

sudo apt-get install qemu-system-arm

Für ältere Versionen:

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

QEMU selbst erstellen

Alternativ können Sie QEMU selbst erstellen. Dies ist großartig, wenn Sie eine neue Version ausprobieren möchten, diese kann jedoch langsam sein und auf viele Fehler beim Kompilieren vorbereitet sein! Beachten Sie, dass QEMU für die ARM-Unterstützung kompiliert werden muss, wenn es von ihrer Website erstellt wird. Überprüfen Sie also zuerst Ihre Distributionsspeicher. Das kann so gemacht werden;

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

Stellen Sie sicher, dass Sie ARM-Unterstützung haben mit:

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

Das Bild erhalten

Wir arbeiten mit Arch Linux, verwenden also das Arch Arm-Image. Aber ersetzen Sie dies durch das, womit Sie arbeiten möchten oder vielleicht haben Sie bereits ein Bild. In diesem Fall überspringen Sie diesen Schritt.

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 

Damit QEMU funktioniert, benötigen wir auch das Kernel-Image (das sich in der IMG-Datei befindet).

Hinweis: Ich denke nicht, dass dieser Schritt für Debian notwendig ist. Jemand bitte bestätigen.

Zum Glück gibt es vorkompilierte Bilder zur Verfügung, und Sie können das einer vom nutzen hier ( direkter Download ).

TODO: Demonstrieren Sie hier, wie ein Kernel-Image kompiliert wird?

Starten der VM

Sie sollten jetzt haben:

  • Eine img-Datei, die Sie mit dem mitgelieferten sha1 überprüfen können (empfohlen).
  • Ein Kernel-Image (zImage).
  • QEMU für ARM.

Die virtuelle Maschine kann jetzt mit dem folgenden langwierigen Befehl gestartet werden:

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

Beachten Sie, dass Sie mit dieser Methode nur über mehrere Hundert Megabyte Speicher verfügen (was auch immer auf dem Image frei ist). Eine virtuelle Festplatte kann anhand des QEMU-Benutzerhandbuchs erstellt werden .

Jivings
quelle
Dies ist mehr, was ich wollte - danke! Dies ist eine großartige Referenzantwort
Alex L
@Alex Kein Problem, lass es mich wissen, wenn du mich zum Ausarbeiten brauchst. Sagen Sie mir auch, ob ein Debian-Image funktioniert, und wir können es den Anweisungen hinzufügen, wenn es anders ist.
Jivings
Es gibt eine ziemlich gründliche Komplettlösung hier
Alex L
@Alex Das ist gut, das habe ich nicht gesehen.
Jivings
2
Die andere ist geschlossen, also kann ich nur für die Wiedereröffnung stimmen
Jivings
8

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

Bildbeschreibung hier eingeben

  1. Kompilieren Sie QEMU 2.9.0 aus dem Quellcode:

    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. Lade das Bild herunter und extrahiere den Kernel und dts daraus:

    1. Lade das Bild herunter und entpacke es:

      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. Hängen Sie das zweite Image der Partition ein. Der einfachste Weg ist:

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

      Dies funktioniert nur mit losetupUbuntu 16.04, andere Methoden unter: https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      Dies druckt ein Loop-Gerät, zB:

      /dev/loop0
      

      so machen wir es:

      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. Lauf:

    ./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 \
    ;
    

Sie können sich dann an dem Terminal anmelden, das auf Ihrem Host-Terminal angezeigt wird.

Aktuelle Einschränkungen:

  • -M raspi2wurde in QEMU 2.6.0 hinzugefügt, und Ubuntu 16.04 hat nur QEMU 2.5.0, daher müssen wir QEMU aus dem Quellcode kompilieren. Das ist aber nicht schwer.
  • Die GUI zeigt an, reagiert aber nicht auf die Maus / Tastatur, die auf SDL und VNC getestet wurde. CLI funktioniert jedoch einwandfrei. Sie können also genauso gut das Lite-Image verwenden, das für den Moment als GUI fungiert.
  • keine Vernetzung

Ubuntu 16.04, QEMU 2.5.0, Raspbian 2016-05-27, geänderter Kernel

Diese Methode verwendet -M versatilepbdie auf der QEMU 2.5.0 von Ubuntu 16.04 vorhandene.

Der Nachteil ist, dass Sie einen modifizierten Kernel herunterladen müssen (siehe Emulieren mit Qemu: Warum der zusätzliche Kernel? ) Und das Image modifizieren müssen, damit es weniger repräsentativ für das reale System ist.

  1. Download: https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/36ede073f4ccb64f60200ede36c231afe9502070/kernel-qemu-4.4.12-jessie

    Wir wählen, 4.4.12da dies die Kernel-Version im Raspbian-Image ist.

    Der Prozess zum Generieren dieses Kernel-Blobs ist im Repository unter https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools beschrieben

    Warum wird dieses zusätzliche Kernel-Image benötigt: Emulieren mit Qemu: Warum der zusätzliche Kernel?

  2. Ändern Sie das Raspbian-Image wie folgt: https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emulating-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c

    Zusammenfassung:

    1. Hängen Sie das Image genauso ein, wie wir es für das getan haben -M raspi2, aber verwenden Sie die zweite Partition anstelle der ersten:

      sudo mount /dev/loop0p2 /mnt/rpi
      
    2. Bearbeiten Sie das Bild:

      # 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. Lauf:

    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
    

[fehlgeschlagen] Ubuntu 17.04, QEMU 2.8.0-M raspi2, Raspbian 2016-05-27, Vanillekernel

Auf diesem neueren Ubuntu ist QEMU 2.8.0 der Standard, daher müssen wir QEMU nicht aus dem Quellcode für kompilieren -M raspi2. 2.8.0 hängt jedoch beim Booten nach der Meldung:

Console: switching to colour frame buffer device 100x30

Dies zeigt, wie instabil -M raspi2noch ist.

[fehlgeschlagen] Ubuntu 16.04, QEMU 2.9.0-M raspi2, Raspbian 2017-08-16, Vanillekernel

Auf diesem neueren Image kommt der Kernel nach der gleichen Methode für den 27.05.2016 beim Booten in Panik mit:

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 RPI3 Bare Metal auf QEMU

https://github.com/bztsrc/raspi3-tutorial ist eine gute Sammlung von Beispielen, die nur mit QEMU funktionieren. Eine schnelle Einführung finden Sie unter: So erstellen Sie eine QEMU-Emulation für Bare-Metal-Raspberry-Pi-Bilder

Ciro Santilli ist ein Schauspieler
quelle
2
Alter, du bist großartig!
Subin
4

Sie können nicht tun, was Sie vorschlagen, da Raspberry Pi eine andere Prozessorarchitektur als die meisten PCs hat. Während die meisten PCs x86-basiert sind, ist RPi ein ARM-basierter Computer.

Dies ist der gleiche Grund, warum Sie beispielsweise Microsoft Windows unter RPi nicht ausführen können.

VmWare funktioniert nicht, da es nur x86-basierte Betriebssysteme (32-Bit und 64-Bit) virtualisieren kann. Es gibt andere Emulatoren, die ARM virtualisieren können, z. B. QEMU. Auf diesen wird jedoch eine vollständige Software-Emulation ohne native CPU-Virtualisierungsunterstützung ausgeführt, sodass Sie davon ausgehen können, dass sie recht langsam sind.

Gemeinschaft
quelle
3
Können Sie weitere Informationen zum Emulieren von RasPi auf x86 (z. B. mit QEMU) hinzufügen? Darauf wollte ich mich wirklich konzentrieren, obwohl die Erklärung geschätzt wird.
Alex L
3
Tut mir leid, dass ich abstimmen muss, aber das erklärt nicht, wie der Fragesteller die gewünschten Ergebnisse erzielen kann.
G-.
Auf der anderen Seite werden andere Punkte der Frage angesprochen, die die andere Antwort nicht beantwortet. Ich denke, Ihre Ablehnungen sind unbegründet (es ist nicht so, dass diese Frage auch führt)
3
Auch ohne native virt-Unterstützung ist slow relativ, da Sie wahrscheinlich auf einer Maschine virtualisieren, die viel leistungsfähiger ist als ein Himbeer-Pi
Kenneth Wilke
0

Sie können problemlos einen Himbeer-Pi-Simulator ausprobieren, der im Lieferumfang von Sensor, Befehlszeile und Datei-Editor von iotify.io enthalten ist. Lesen Sie unsere Dokumentation unter https://docs.iotify.io/ , um mit den verschiedenen Projekten und dem Betriebssystem zu beginnen und sich mit der Arbeitsumgebung von Raspberry Pi vertraut zu machen.

Bildbeschreibung hier eingeben

iotifizieren
quelle
1
Obwohl dies technisch gesehen eine Antwort ist, nutzen Sie unsere Website ganz klar für kostenlose Werbung. Was Sie anbieten, ist zwar kostenlos, aber immer noch nicht in Ordnung. Wir bedanken uns für Ihren Beitrag zur Community, aber bitte schalten Sie Ihre Werbung woanders hin.
Darth Vader
4
@DarthVader: Da das Poster bekannt gab, dass sie mit dem Produkt verbunden sind und es die Frage beantwortet, neige ich dazu, es als akzeptabel zu bezeichnen.
Jacobm001