使用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專案就是
一、安裝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:
下載最新的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"
就可以看到虛擬機器啟動,並開始載入樹莓派。