Wie emuliere ich Himbeer-Pi 2 auf Ubuntu 14.04 PC?

7

Hier habe ich ein Bild von Raspberry Pi (neu gestaltet). Nennen wir espi2-16gb.img

Emulieren Sie ARM Raspberry Pi 2 Modell B v1.1 auf einem Ubuntu-PC

Jetzt möchte ich es emulieren, bevor ich es physisch in einen Pi 2 einfüge.

Ich habe ein Startskript start_arm_pi.shwie folgt erstellt:

#!/bin/bash
# Starts raspberry pi image in configuration mode

qemu-system-arm -kernel ./boot_for_pi2/kernel.img \
    -cpu arm1176 -m 1024 \
    -M versatilepb -no-reboot -serial stdio \
    -append "root=/dev/mapper/crypt_sdcard cryptdevice=/dev/mmcblk0p2:crypt_sdcard panic=1 rootfstype=ext4 rw init=/bin/bash" \
    -hda /path/to/pi2-16gb.img 

Aber mit Fehler:

pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument

Über das Bild

Tatsächlich gibt es zwei Partitionen der Bilddatei pi2-16gb.img.

/boot/von /dev/mmcblk0p1und /von /dev/mmcblk0p2. Das /dev/mmcblk0p2wird aber durch LUKS-Verschlüsselung verschlüsselt .

Das kernel.imgwird von der unverschlüsselten Partition abgeleitet/dev/mmcblk0p1

Alle Dateien in der Partition /dev/mmcblk0p1(werden wie /boot/in diesem Bild bereitgestellt bereitgestellt.

Geben Sie hier die Bildbeschreibung ein

Und ich denke, die Datei cmdline.txt und die Datei config.txt können hilfreich sein.

Inhalt von cmdline.txt

dwc_otg.fiq_fix_enable = 0 console = ttyAMA0,115200 kgdboc = ttyAMA0,115200 console = tty1 lift = Deadline root = / dev / mapper / crypt_sdcard cryptdevice = / dev / mmcblk0p2: crypt_sdcard rootfstype = ext4 rootwait

Inhalt von config.txt

initramfs initramfs.gz 0x00f00000 hdmi_ignore_hotplug = 1

Haben Sie einige Ideen, die Pi auf meinem Ubuntu-PC emulieren?

Vielen Dank, eine Million!


Aktualisiert

Ich hatte einen physischen Pi 2, auf dem dieses Bild ausgeführt wurde.

Und von der seriellen TTL-Schnittstelle (Tx, Rx) erhielt ich folgende Nachrichten:

Pastebin (Punkt) com / Y7Xg5WRg

Es wurde eine Infozeile zum Kernel-Befehl gefunden:

[0.000000] Kernel-Befehlszeile: dma.dmachans = 0x7f35 bcm2708_fb.fbwidth = 656 bcm2708_fb.fbheight = 416 bcm2709.boardrev = 0xa21041 bcm2709.serial = 0x2925606f smsc95xx.macadf: B: 25: = 1 bcm2709.disk_led_gpio = 47 bcm2709.disk_led_active_low = 0 sdhci-bcm2708.emmc_clock_freq = 250000000 vc_mem.mem_base = 0x3dc00000 vc_mem.mem_size = 0x3f000000 dwc_0 = root = / dev / mapper / crypt_sdcard cryptdevice = / dev / mmcblk0p2: crypt_sdcard rootfstype = ext4 rootwait

Wird das hilfreich sein?


Aktualisiert

Ich hatte festgestellt, dass qemuRaspberry Pi 2 ab Version 2.6.0 gemäß seiner Dokumentseite unterstützt wird: wiki.qemu (dot) org / ChangeLog / 2.6

Also habe ich qemuVersion 2.6.0 auf meinem Ubuntu 14.04 x86_64 PC kompiliert . Und ich habe es mit diesem Befehl gestartet.

/usr/local/src/qemu-2.6.0/bin/debug/native/arm-softmmu/qemu-system-arm \
    -kernel /path/to/boot_for_pi2/kernel7.img \
    -cpu arm1176 -m 256 \
    -M raspi2 \
    -no-reboot \
    -serial stdio \
    -sd /path/to/pi2-16gb.img \
    -append "dwc_otg.fiq_fix_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 elevator=deadline root=/dev/mapper/crypt_sdcard cryptdevice=/dev/mmcblk0p2:crypt_sdcard rootfstype=ext4"

Und hier ist jetzt die Ausgabe.

WARNING: Image format was not specified for '/path/to/pi2-16gb.img' and probing guessed raw.
        Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
        Specify the 'raw' format explicitly to remove the restrictions.
Uncompressing Linux... done, booting the kernel.

Aber es hörte hier auf und das Qemu-Fenster ist schwarz mit nichts ...

Bedeutet das, dass etwas mit dem Kernel nicht stimmt?

Die Datei kernel7.imgwird /boot/tatsächlich von ihrer Partition abgeleitet .


Aktualisiert

Ich habe den Emulator erfolgreich gestartet, aber mit einem Fehler ...

/usr/local/src/qemu-2.6.0/bin/debug/native/arm-softmmu/qemu-system-arm \
-kernel /path/to/kernel-qemu-4.4.11-jessie \
-m 256 \
-cpu arm1176 \
-M versatilepb \
-no-reboot \
-serial stdio \
-hda /media/alex/F049-1FB6/2016-05-27-raspbian-jessie.img \
-append "dwc_otg.lpm_enable=0 root=/dev/sda2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait init=/bin/bash" \

Der Treiber kann montiert werden. Hier habe ich es mit einem neuesten rasbianischen Bild getestet2016-05-27-raspbian-jessie.img

Der Qemu-Kernel, den ich verwendet habe, stammt von:

github (dot) com / dhruvvyas90 / qemu-rpi-kernel

Aber ich hatte eine Kernel-Panik ...

Hier ist der Fehler im Detail.

Debug-Fehler Kernel-Panik

Dotslash
quelle
Es sieht nicht so aus, als ob zwischen dem #!und dem ein Leerzeichen vorhanden ist. /bin/bashIch glaube, der Leerzeichen ist erforderlich, damit Ihr Skript funktioniert.
Sir_ian
Es ist in Ordnung. Nicht dieses Ding.
Dotslash
Sie sollten keinen "Versatile" - oder "Qemu" -Kern mit der neuesten QEMU-Version verwenden. Verwenden Sie den echten Himbeerkern (aus dem Bild extrahieren?).
Flakeshake
Ich habe den vom Image abgeleiteten Kernel ausprobiert, aber er wurde nicht einmal geladen. Welches CPU-Modell sollte ich für die Verwendung mit qemu2.6 einstellen ?
Dotslash
2
Mögliches Duplikat der Emulation auf einem Linux-PC
Ciro Santilli 法轮功 病毒 审查 审查.

Antworten:

2

Es ist mir gelungen, Raspbian Jessie Lite auf Kubuntu 14.04 zu starten, nachdem ich QEMU aus git kompiliert hatte. Es gibt jedoch ein kleines Problem: Ich habe die Tastatureingabe nicht zum Laufen gebracht (ich muss stattdessen ein virtuelles serielles Terminal verwenden).

Wie auch immer, hier ist was ich getan habe:

1) Kompilieren Sie QEMU aus Git (passen Sie die Konfigurationsoptionen an Ihre Bedürfnisse an, aber diese haben für mich gut genug funktioniert):

$ sudo apt-get build-dep qemu
$ git clone https://github.com/qemu/qemu
$ cd qemu
$ ./configure --prefix=$HOME/opt/qemu --with-sdlabi=1.2 \
  --disable-gtk --enable-sdl
$ make
$ make install

2) Bestimmen Sie das Layout der Raspbian-Bildpartition:

$ fdisk -l 2017-07-05-raspbian-jessie-lite.img

Disk 2017-07-05-raspbian-jessie-lite.img: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders, total 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x5e88b289

                              Device Boot      Start         End      Blocks   Id  System
2017-07-05-raspbian-jessie-lite.img1            8192       93596       42702+   c  W95 FAT32 (LBA)
2017-07-05-raspbian-jessie-lite.img2           94208     4194303     2050048   83  Linux

3) Die erste Partition des Mount Raspbian-Images unter Berücksichtigung der oben angegebenen Zahlen für den Beginn der Partitionen (Sektor 8192 für Partition 1):

$ cd ~/raspbian
$ sudo mkdir -pv /mnt/tmp
$ sudo mount ./2017-07-05-raspbian-jessie-lite.img /mnt/tmp/ -oloop,offset=$((8192*512))

4) Nehmen Sie von dort die erste cmdline.txt sowie den richtigen Kernel und die richtige .dtbDatei:

$ cp -v /mnt/tmp/{kernel7.img,bcm2709-rpi-2-b.dtb,cmdline.txt} .

5) Hängen Sie das Bild aus:

$ sudo umount /mnt/tmp

6) Um zu verhindern, dass sich der Kernel beschwert, dass die Root-Partition über die SD-Kartengröße hinausgeht, fügen Sie dem Image ein paar Nullen hinzu (hier wähle ich 2 GiB - dies ist ein bisschen übertrieben, tut aber nicht weh, passen Sie es an Bedürfnisse):

$ fallocate -l 2G ./2017-07-05-raspbian-jessie-lite.img

7) Endlich können wir einen ersten Start durchführen, bei dem das anfängliche Skript die Größe des Dateisystems an das gesamte Gerät anpasst:

$ ~/opt/qemu/bin/qemu-system-arm -M raspi2 -kernel ./kernel7.img \
   -dtb ./bcm2709-rpi-2-b.dtb -sd ./2017-07-05-raspbian-jessie-lite.img \
   -append "$(<cmdline.txt)"

Der Kernel kann nicht zurückgesetzt werden. Wenn er gedruckt wird sysrq: SysRq: Resetting, beenden Sie QEMU einfach über Strg + C oder schließen Sie das Fenster.

8) Mounten Sie die Boot-Partition erneut und kopieren Sie die aktualisierte cmdline.txt:

$ sudo mount ./2017-07-05-raspbian-jessie-lite.img /mnt/tmp/ -oloop,offset=$((8192*512))
$ cp -v /mnt/tmp/cmdline.txt .
$ sudo umount /mnt/tmp

9) Starten Sie abschließend QEMU wie in Schritt 7) und Raspbian startet normal. Nach ein oder zwei Minuten sind Sie an der Anmeldeaufforderung.

Da die Tastatur nicht funktioniert (scheint eine QEMU-Einschränkung für RPi zu sein), möchten Sie wahrscheinlich die virtuelle serielle Konsole einrichten. Stellen Sie dazu sicher, dass das Finale vorhanden cmdline.txtist console=ttyAMA0,115200(und keine weiteren Erwähnungen von ttyAMA0) und die QEMU-Befehlszeilenoption -serial stdiovorhanden ist. Dadurch erhalten Sie eine Anmeldeaufforderung in dem von QEMU verwendeten Terminal, in das Sie Ihr System eingeben und verwenden können.

Um zu vermeiden, dass QEMU beendet wird, wenn Sie Strg + C in die serielle Konsole eingeben , lesen Sie diesen Unix.SE-Beitrag .

Ruslan
quelle
Danke für das Teilen! Ich habe es auch mit einigen Einstellungen hier gemacht
Dotslash
0

Sie können nur die Geräte emulieren, die speziell unterstützt werden (oder die Sie hinzugefügt haben), z . B. http://qemu.weilnetz.de/qemu-doc.html#ARM-System-emulator .

AFAICT Einige Teile der RPi-Hardware werden ohne Anpassung nicht unterstützt.

Dave Newton
quelle
Aber ich sehe, dass qemuVersion 2.6 Himbeer-Pi 2 bereits unterstützt. wiki.qemu.org/ChangeLog/2.6 Mit welchen Befehlen sollte ich dieses Image jetzt starten? Ich habe qemu 2.6bereits eine neuere zum Test zusammengestellt.
Dotslash
In den Versionshinweisen, die Sie zitieren, heißt es: "Neue teilweise Raspberry Pi 2-Emulation mit dem Maschinentyp" raspi2 ". Derzeit können ältere Versionen von Windows und Raspbian gestartet werden, es fehlen jedoch eine Reihe von Geräten, einschließlich USB." Wahrscheinlich können Sie dies nur Verwenden Sie Wheezy-Bilder (nicht Jessie-Bilder), und USB funktioniert nicht (was ziemlich trivial ist).
Phil B.
@PhilB. "... fehlt eine Reihe von Geräten" ist ziemlich vage, nein? Dies bedeutet, dass integrierte Hardware wie Audio möglicherweise nicht funktioniert.
Dave Newton
@PhilB. Ich habe diese Frage aktualisiert. Und das Qemu hat den Kernel nicht richtig gebootet. @ Dave Newton, ich werde jetzt kein anderes Gerät daran anschließen. Es sollte möglich sein, es zu emulieren, nur die imgDatei selbst.
Dotslash