繁体   English   中英

如何使用QEMU模拟Raspberry Pi Raspbian?

[英]How to emulate Raspberry Pi Raspbian with QEMU?

我正在尝试使用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

接下来,我从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

现在交叉编译内核:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
cd linux-4.4.16
make vexpress_defconfig
make all
cd ..

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

cp linux-4.4.16/arch/arm/boot/zImage zImage

并运行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"

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

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

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

提前致谢
亚历克斯


第二种方法

我从这里加载了一个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

这给我带来了以下输出: 在此输入图像描述 这对我来说很有意义,因为内核是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

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

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

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

     git checkout b05965f284db3e086022f4e318e46cb5bffb1376 
  2. 运行build-kernel-qemu来构建内核

     sh build-kernel-qemu 
  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 

    结果: 在此输入图像描述

您应该在开始之前展开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

修改/ 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

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

$ sudo nano etc/ld.so.preload

#/usr/lib/arm-linux-gnueabihf/libarmmem.so

从kpartx 卸载并销毁循环

$ sudo umount /mnt/img1
$ sudo kpartx -d your-image.img

在这里获取与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

您需要修改内核才能在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

我不得不使用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"

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

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

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

在此输入图像描述

好处:

  • 使用-M raspi2 ,我们可以使用vanilla内核,因此系统更具代表性

限制:

  • -M raspi2在QEMU 2.6.0中添加,而Ubuntu 16.04只有QEMU 2.5.0,因此我们必须从源代码编译QEMU。 但这并不难。
  • GUI显示但没有响应鼠标/键盘,在SDL和VNC上都进行了测试。 但是CLI工作得很好。 所以你不妨使用现在已经使用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` 
  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 
    2. 挂载分区的第二个图像。 最简单的方法是:

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

      这仅与最新作品losetup在Ubuntu 16.04,其他方法在: https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

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

       /dev/loop0 

      所以我们这样做:

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

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

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

[失败] Ubuntu 17.04,QEMU 2.8.0 -M raspi2,Raspbian 2016-05-27,香草内核

在这个较新的Ubuntu上,QEMU 2.8.0是默认的,因此我们不需要从源代码为-M raspi2编译QEMU。 但是,消息后,2.8.0在启动时挂起:

Console: switching to colour frame buffer device 100x30

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

[失败] Ubuntu 16.04,QEMU 2.9.0 -M raspi2,Raspbian 2017-08-16,香草内核

在这个较新的图像上,使用相同的方法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)

在QEMU上使用bztsrc/raspi3-tutorial RPI3裸机

https://github.com/bztsrc/raspi3-tutorial是一套很好的例子,可以在QEMU上工作,超级快速入门: https ://raspberrypi.stackexchange.com/questions/34733/how-to-do- QEMU仿真换裸机-覆盆子-PI-图像/ 85135#85135

我有一个自定义的ubuntu图像类似的问题。 我也应用了@Michael Connors的回答中描述的修改,然后我看到系统启动。

您可以在-append=""添加以下内容,以查看您的案例中发生的情况:

qemu-system-arm ... -serial stdio -append="... console=ttyAMA0,115200 loglevel=8"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM