使用qemu虚拟机运行树莓派(linux kernel 4.9)

  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虚拟树莓派的方法。

一、安装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文件:
使用qemu虚拟机运行树莓派(linux kernel 4.9)_第1张图片

  其中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"

就可以看到虚拟机启动,并开始加载树莓派。
使用qemu虚拟机运行树莓派(linux kernel 4.9)_第2张图片
使用qemu虚拟机运行树莓派(linux kernel 4.9)_第3张图片

你可能感兴趣的:(树莓派)