2018年5月8日更新,https://github.com/dhruvvyas90/qemu-rpi-kernel的项目已经更新,现已支持4.9内核的编译,大家可以参考编译。
同时按照本文操作也可以将树莓派虚拟起来,不过会遇到模块加载错误,导致网卡等驱动安装失败。如果用dhruvvyas90的方法重新编译内核就不会有这个问题,但是经过dhruvvyas90编译后的内核能否从新打包备份还原至树莓派上还存疑。
这篇博客起自于年前的一个想法,当时刚得到一个树莓派zero老版,因为没有Wi-Fi模块导致一些依赖安装特别困难,就想到能否用虚拟机来运行树莓派系统,然后通过镜像导出再写入到zero中,这样也能省去一些调试的麻烦,但是关于qemu虚拟树莓派的文章大都指向一个github项目就是dhruvvyas90的一个工程。之前适用于qemu的树莓派内核共享网站关闭,dhruvvyas90辛苦整理出了qemu启动树莓派的内核文件以及编译内核的脚本,但该工程停止更新到了kernel-qemu-4.4.34-jessie,同时在实际的使用中发现,编译脚本只适用于linux 4.4及以下的内核编译,若编译linux 4.5及以上的内核时该脚本均会出现编译错误,这个错误困扰了我好几个月终于整理出了一套简单的qemu虚拟树莓派的方法。
1、依赖安装:
打开qemu下载页面https://www.qemu.org/download/有最新的依赖安装提示,该博客仅以QEMU emulator version 2.11.0为范本进行说明。
Linux:
输入uname -a
查看当前系统,根据系统运行依赖安装脚本即可从Linux上安装qemu。
系统 | 依赖安装脚本 |
---|---|
Arch | pacman -S qemu |
Debian/Ubuntu | apt-get install qemu |
Fedora | dnf install @virtualization |
Gentoo | emerge –ask app-emulation/qemu |
RHEL/CentOS | yum install qemu-kvm |
SUSE | zypper install qemu |
mac:
在mac上安装qemu需要注意的是官方要求mac os x最低要求为10.5系统,但建议使用mac os x 10.7及以上系统依赖安装qemu。
1、安装软件包管理器HomeBrew:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2、使用HomeBrew安装qemu:
brew install qemu
windows:
32位qemu下载地址:
https://qemu.weilnetz.de/w32/
64位qemu下载地址:
https://qemu.weilnetz.de/w64/
下载最新的exe安装包运行安装即可。
2、编译安装:
1、直接下载软件包编译安装:
wget https://download.qemu.org/qemu-2.11.1.tar.xz
tar xvJf qemu-2.11.1.tar.xz
cd qemu-2.11.1
./configure
make
make install
2、通过git克隆软件包编译安装:
git clone git://git.qemu.org/qemu.git --branch v2.11.1 --single-branch --depth 1
cd qemu
./configure
make
1、从树莓派镜像中提取内核:
在https://www.raspberrypi.org/downloads/下载镜像后,挂载该镜像,可以发现在boot中有如下一些文件,需要注意的是*.img
和*.dtb
文件:
其中kernel.img与kernel7.img就是启动qemu所需的内核,*.dtd
文件是设备树引导文件,对应树莓派的cpu及版本,其中kernel.img内核文件对应设备为:
kernel.img 对应 RPi 1B, 1A, A+, B+, 2B(第一版) Z, Z (摄像头版本), ZW, CM1
kernel7.img 对应 RPi2B2, RPi3B, CM3 and CM3L.
这时候我们通过命令liuxin$ qemu-system-arm -M ?
可以获得qemu所支持的arm设备:
参数 | 设备说明 |
---|---|
akita | Sharp SL-C1000 (Akita) PDA (PXA270) |
ast2500-evb | Aspeed AST2500 EVB (ARM1176) |
borzoi | Sharp SL-C3100 (Borzoi) PDA (PXA270) |
canon-a1100 | Canon PowerShot A1100 IS |
cheetah | Palm Tungsten |
collie | Sharp SL-5500 (Collie) PDA (SA-1110) |
connex | Gumstix Connex (PXA255) |
cubieboard | cubietech cubieboard |
emcraft-sf2 | SmartFusion2 SOM kit from Emcraft (M2S010) |
highbank | Calxeda Highbank (ECX-1000) |
imx25-pdk | ARM i.MX25 PDK board (ARM926) |
integratorcp | ARM Integrator/CP (ARM926EJ-S) |
kzm | ARM KZM Emulation Baseboard (ARM1136) |
lm3s6965evb | Stellaris LM3S6965EVB |
lm3s811evb | Stellaris LM3S811EVB |
mainstone | Mainstone II (PXA27x) |
midway | Calxeda Midway (ECX-2000) |
mps2-an385 | ARM MPS2 with AN385 FPGA image for Cortex-M3 |
mps2-an511 | ARM MPS2 with AN511 DesignStart FPGA image for Cortex-M3 |
musicpal | Marvell 88w8618 / MusicPal (ARM926EJ-S) |
n800 | Nokia N800 tablet aka. RX-34 (OMAP2420) |
n810 | Nokia N810 tablet aka. RX-44 (OMAP2420) |
netduino2 | Netduino 2 Machine |
none | empty machine |
nuri | Samsung NURI board (Exynos4210) |
palmetto-bmc | OpenPOWER Palmetto BMC (ARM926EJ-S) |
raspi2 | Raspberry Pi 2 |
realview-eb | ARM RealView Emulation Baseboard (ARM926EJ-S) |
realview-eb-mpcore | ARM RealView Emulation Baseboard (ARM11MPCore) |
realview-pb-a8 | ARM RealView Platform Baseboard for Cortex-A8 |
realview-pbx-a9 | ARM RealView Platform Baseboard Explore for Cortex-A9 |
romulus-bmc | OpenPOWER Romulus BMC (ARM1176) |
sabrelite | Freescale i.MX6 Quad SABRE Lite Board (Cortex A9) |
smdkc210 | Samsung SMDKC210 board (Exynos4210) |
spitz | Sharp SL-C3000 (Spitz) PDA (PXA270) |
sx1 | Siemens SX1 (OMAP310) V2 |
sx1-v1 | Siemens SX1 (OMAP310) V1 |
terrier | Sharp SL-C3200 (Terrier) PDA (PXA270) |
tosa | Sharp SL-6000 (Tosa) PDA (PXA255) |
verdex | Gumstix Verdex (PXA270) |
versatileab | ARM Versatile/AB (ARM926EJ-S) |
versatilepb | ARM Versatile/PB (ARM926EJ-S) |
vexpress-a15 | ARM Versatile Express for Cortex-A15 |
vexpress-a9 | ARM Versatile Express for Cortex-A9 |
virt-2.10 | QEMU 2.10 ARM Virtual Machine |
virt | QEMU 2.11 ARM Virtual Machine (alias of virt-2.11) |
virt-2.11 | QEMU 2.11 ARM Virtual Machine |
virt-2.6 | QEMU 2.6 ARM Virtual Machine |
virt-2.7 | QEMU 2.7 ARM Virtual Machine |
virt-2.8 | QEMU 2.8 ARM Virtual Machine |
virt-2.9 | QEMU 2.9 ARM Virtual Machine |
xilinx-zynq-a9 | Xilinx Zynq Platform Baseboard for Cortex-A9 |
z2 | Zipit Z2 (PXA27x) |
可以得知现在qemu已经支持Raspberry Pi 2(2B)设备了,所以对应该设备我们需要将kernel7.img以及对应2B的bcm2709-rpi-2-b.dtb文件考出。
2、制作内核:
1)首先需要在https://github.com/raspberrypi/linux.git
下载合适的内核版本。
因为内核版本较多,而且相对来说都比较大,我们可以选择合适的版本后通过克隆唯一分支来下载该版本。
git clone git://github.com/raspberrypi/linux.git –branch rpi-4.9.y –single-branch –depth 1
2)配置相应的开发环境:
编译内核时需要配置arm交叉编译环境,该环境可以通过依赖安装或直接使用树莓派官方提供的工具。
#依赖安装arm交叉编译环境:
sudo apt-get install gcc-arm-linux-gnueabihf
#下载官方提供的交叉编译工具
git clone git clone https://github.com/raspberrypi/tools.git
3)初始化配置文件,准备编译:
#编译kernel7.img
KERNEL=kernel7
#初始化配置文件
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
#配置内核模块
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
#编译内核及dtb文件
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs
#将内核及dtb文件拷贝到自定义目录
cp arch/arm/boot/zImage ~/kernel7.img
cp qemu-rpi-kernel/linux/arch/arm/boot/dts/bcm2709-rpi-2-b.dtb ~/bcm2709-rpi-2-b.dtb
打开命令行输入:
qemu-system-arm -M raspi2 -kernel kernel7.img -sd 2017-11-29-raspbian-stretch.img -append "root=/dev/mmcblk0p2 rootwait" -dtb bcm2709-rpi-2-b.dtb -m 512M
//如果希望字符界面启动树莓派则将append后的参数改为
"rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootwait"