1. 程式人生 > >使用qemu虛擬機器執行樹莓派(linux kernel 4.9)

使用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:

下載最新的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"

就可以看到虛擬機器啟動,並開始載入樹莓派。
這裡寫圖片描述
這裡寫圖片描述