[英]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的新尝试:
从https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/master/tools复制build-kernel-qemu并添加以下行以签出内核4.4.16的版本:
git checkout b05965f284db3e086022f4e318e46cb5bffb1376
运行build-kernel-qemu
来构建内核
sh build-kernel-qemu
运行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。 但这并不难。 脚步:
从源代码编译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`
下载图像并从中提取内核和dts:
下载图像并解压缩:
wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2016-05-31/2016-05-27-raspbian-jessie.zip unzip 2016-05-27-raspbian-jessie.zip
挂载分区的第二个图像。 最简单的方法是:
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
跑:
./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.