如何使用QEMU模拟Raspberry Pi Raspbian?

Ale*_*x44 22 linux qemu linux-kernel raspberry-pi raspbian

我正在尝试使用QEMU使用Raspian OS模拟Raspberry Pi.我尝试过在互联网上描述的几种方法但没有任何成功.

我想我需要修补一个适合所需操作系统的Linux内核.在我的例子中,我选择了带有内核4.4的Rasbian Lite:

wget https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2016-05-31/2016-05-27-raspbian-jessie-lite.zip
unzip 2016-05-27-raspbian-jessie-lite.zip
rm 2016-05-27-raspbian-jessie-lite.zip
Run Code Online (Sandbox Code Playgroud)

接下来,我从https://www.kernel.org/加载内核:

wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.16.tar.gz
tar -xzf linux-4.4.16.tar.gz
rm linux-4.4.16.tar.gz
Run Code Online (Sandbox Code Playgroud)

现在交叉编译内核:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
cd linux-4.4.16
make vexpress_defconfig
make all
cd ..
Run Code Online (Sandbox Code Playgroud)

现在我可以将启动映像(即在RAM中自动提取的压缩内核映像)复制到我的工作区:

cp linux-4.4.16/arch/arm/boot/zImage zImage
Run Code Online (Sandbox Code Playgroud)

并运行QEMU

qemu-system-arm -kernel zImage -M vexpress-a9 -m 1024 -cpu cortex-a9 -no-reboot -serial stdio -hda 016-05-27-raspbian-jessie-lite.img -append "root=/dev/sda2 rootfstype=ext4"
Run Code Online (Sandbox Code Playgroud)

但我所看到的只是一个黑色的QEMU窗口.:(

我认为问题是获得正确的内核.从Internet复制某些内核从未取得成功,因为它们不适合操作系统.

如何构建/修补适合操作系统的内核(不下载现有的内核)以及如何正确运行QEMU?

先谢谢
Alex


第二种方法

kernel-qemu从这里加载一个https://www.dropbox.com/s/g8u93xblz1v1ly0/kernel-qemu?dl=0并用它运行QEMU:

qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2" -hda 2016-05-27-raspbian-jessie-lite.img
Run Code Online (Sandbox Code Playgroud)

这给我带来了以下输出: 在此输入图像描述 这对我来说很有意义,因为内核是3.10.25并且比使用内核4.4.16的Raspbian Jessie更老.

使用来自https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/kernel-qemu-4.4.12-jessie的qemu内核

qemu-system-arm -kernel kernel-qemu-4.4.12-jessie -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2016-05-27-raspbian-jessie-lite.img
Run Code Online (Sandbox Code Playgroud)

我得到了类似的结果: 在此输入图像描述

使用新内核-qemu 4.4.16的新尝试:

  1. https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/master/tools复制build-kernel-qemu 并添加以下行以签出内核4.4.16的版本:

    git checkout b05965f284db3e086022f4e318e46cb5bffb1376
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行build-kernel-qemu以构建内核

    sh build-kernel-qemu
    
    Run Code Online (Sandbox Code Playgroud)
  3. 运行QEMU

    qemu-system-arm -kernel kernel-qemu -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2016-05-27-raspbian-jessie-lite.img
    
    Run Code Online (Sandbox Code Playgroud)

    结果: 在此输入图像描述

Dad*_*fix 12

您应该在开始之前展开Raspbian Image文件

使用kpartx挂载Raspbian映像文件(可能必须安装kpartx)

$ sudo kpartx -av your-image.img
add map loop0p1 (252:5): 0 117187 linear /dev/loop0 1
add map loop0p2 (252:6): 0 3493888 linear /dev/loop0 118784

$ sudo mount /dev/mapper/loop0p2 /mnt/img1
$ cd /mnt/img1
Run Code Online (Sandbox Code Playgroud)

修改/ etc/fstab并注释掉MMCBLK挂载

$ sudo nano etc/fstab

proc            /proc           proc    defaults          0       0
#/dev/mmcblk0p1  /boot           vfat    defaults          0       2
#/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
Run Code Online (Sandbox Code Playgroud)

修改/etc/ld.so.preload并注释掉行...

$ sudo nano etc/ld.so.preload

#/usr/lib/arm-linux-gnueabihf/libarmmem.so
Run Code Online (Sandbox Code Playgroud)

从kpartx 卸载并销毁循环

$ sudo umount /mnt/img1
$ sudo kpartx -d your-image.img
Run Code Online (Sandbox Code Playgroud)

在这里获取与Raspbian图像匹配的Qemu内核 ...

https://github.com/dhruvvyas90/qemu-rpi-kernel

我用这个命令成功模拟了Raspbian Jessie

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" \
-redir tcp:5022::22 \
-hda 2016-05-27-raspbian-jessie-lite.img
Run Code Online (Sandbox Code Playgroud)


nac*_*ker 7

您需要修改内核才能在QEMU中运行,因为QEMU中没有raspberry PI板硬件.这就是你的第一种方法失败的原因.

你的第二种方法是使用适当修补的内核在多功能板上运行(由QEMU支持),所以这很好,但内核3.x对于现代Raspbian来说太旧了.原则上你的最后一种方法应该有效.

我推荐这个更新的指南(2017年2月),我用4.4内核测试它,它可以立即使用.

qemu-system-arm -kernel $KERNEL -cpu arm1176 -m 256 -M versatilepb -net nic,macaddr=$MAC -net tap -no-reboot -append "root=/dev/sda2 panic=1" -drive format=raw,file=$IMG
Run Code Online (Sandbox Code Playgroud)

我不得不使用format=raw,file=$IMG选项来避免QEMU警告.

你不需要注释掉/etc/fstab,你可以添加/etc/udev/rules.d/90-qemu.rules

KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
KERNEL=="sda2", SYMLINK+="root"
Run Code Online (Sandbox Code Playgroud)

此外,ld.so.preload的东西很旧,不再适用了

上述指南中提供的脚本为您完成了所有这些操作,并通过与raspbian共享您的网络接口提供对您的raspbian的网络访问.


Cir*_*四事件 5

Ubuntu 16.04 主机,QEMU 2.9.0 -M raspi2,Raspbian 2016-05-27,vanilla 内核

在此处输入图片说明

好处:

  • -M raspi2,我们可以使用香草内核,所以该系统是比较有代表性的

限制:

  • -M raspi2是在 QEMU 2.6.0 中添加的,而 Ubuntu 16.04 只有 QEMU 2.5.0,所以我们必须从源代码编译 QEMU。但这并不难。
  • GUI 显示但不响应鼠标/键盘,已在 SDL 和 VNC 上测试。但是 CLI 工作得很好。因此,您现在不妨使用具有 go GUI 的 Lite 图像。
  • 没有网络

脚步:

  1. 从源代码编译 QEMU 2.9.0:

    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`
    
    Run Code Online (Sandbox Code Playgroud)
  2. 下载图像并从中提取内核和 dts:

    1. 下载图片并解压:

      wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2016-05-31/2016-05-27-raspbian-jessie.zip
      unzip 2016-05-27-raspbian-jessie.zip
      
      Run Code Online (Sandbox Code Playgroud)
    2. 挂载分区的第二个映像。最简单的方法是:

      sudo losetup -f --show -P 2016-05-27-raspbian-jessie.img
      
      Run Code Online (Sandbox Code Playgroud)

      这仅适用losetup于 Ubuntu 16.04上的最新版本,其他方法位于:https : //askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      这将打印一个循环设备,例如:

      /dev/loop0
      
      Run Code Online (Sandbox Code Playgroud)

      所以我们这样做:

      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
      
      Run Code Online (Sandbox Code Playgroud)
  3. 跑:

    ./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 \
    ;
    
    Run Code Online (Sandbox Code Playgroud)

然后,您可以登录主机终端上显示的终端。

[失败] Ubuntu 17.04、QEMU 2.8.0 -M raspi2、Raspbian 2016-05-27、vanilla 内核

在这个较新的 Ubuntu 上,QEMU 2.8.0 是默认的,所以我们不需要从源代码为-M raspi2. 但是,2.8.0 在出现以下消息后挂起:

Console: switching to colour frame buffer device 100x30
Run Code Online (Sandbox Code Playgroud)

这表明-M raspi2仍然不稳定。

[失败] Ubuntu 16.04、QEMU 2.9.0 -M raspi2、Raspbian 2017-08-16、vanilla 内核

在这个较新的映像上,使用与 2016-05-27 相同的方法,内核在启动时出现以下情况:

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)
Run Code Online (Sandbox Code Playgroud)

bztsrc/raspi3-tutorial QEMU 上的 RPI3 裸机

https://github.com/bztsrc/raspi3-tutorial是一组很好的例子,只适用于 QEMU,超快速入门:https ://raspberrypi.stackexchange.com/questions/34733/how-to-do- qemu-emulation-for-bare-metal-raspberry-pi-images/85135#85135