QEMU模擬vexpress-a9 搭建Linux kernel運行環境

衆所周知,QEMU是一個可以模擬ARM架構的虛擬機,擁有高速、開源、跨平臺、支持多種架構等優點。接下來,我們將使用QEMU模擬vexpress-a9,並在上面跑一個Linux kernel,爲接下來的工作實驗做準備。

實驗環境及軟件版本

ubuntu 16.04.2
Linux kernel-4.14.7
QEMU-2.11.0
Busybox-1.27.2

下載Linux kernel

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.7.tar.xz

這裏利用wget下載linux-4.14.7版本,下載完成後解壓:

tar xvJf linux-4.14.7.tar.xz

編譯Linux內核

由於我們要讓Linux kernel在模擬的arm架構上運行,這裏需要進行交叉編譯

安裝arm交叉編譯工具鏈

sudo apt-get install gcc-arm-linux-gnueabi

進入kernel源文件目錄

cd linux-4.14.7
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm menuconfig

(如果運行menuconfig顯示缺失ncurses包,則運行以下命令安裝即可)

sudo apt-get install libncurses5-dev

進入菜單配置,進行以下設置:

System Type -->
    [ ] Enable the L2x0 outer cache controller
    取消該選項,否則QEMU運行不起來
Kernel Features -->
    [*] Use the ARM EABI to compile the kernel
    確保該選項被選擇

使用交叉工具鏈編譯

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

編譯成功後,arch/arm/boot目錄下生成內核鏡像文件zImage
可以將zImage和dtb複製到單獨的文件夾中方便使用

cp arch/arm/boot/zImage ../
cp arch/arm/boot/dts/vexpress-v2p-ca9.dtb ../

安裝QEMU

可以使用sudo apt-get install qemu安裝,較方便,但據說版本過舊,對vexpress-a9不友好,本人首次配置失敗不知是否與此有關,因此不推薦,建議下載源代碼自己編譯

wget https://download.qemu.org/qemu-2.11.0.tar.xz
tar xvJf qemu-2.11.0.tar.xz
cd qemu-2.11.0

配置qemu前,需要安裝幾個軟件包

sudo apt-get install zlib1g-dev
sudo apt-get install libglib2.0-0
sudo apt-get install libglib2.0-dev

配置QEMU,使其支持arm架構下所有單板

./configure --target-list=arm-softmmu --audio-drv-list=

(如果出現下列提示即缺少pixman,使用 sudo apt-get install libpixman-1-dev 安裝即可)

pixman >= 0.21.8 not present
please install the pixman devel package

編譯QEMU

make
make install

進行到這裏,我們可以運行以下命令進行測試,看編譯出的內核是否能成功運行,以及QEMU對vexpress-a9單板支持是否夠友好

qemu-system-arm -M vexpress-a9 -m 512M -kernel linux-4.14.7/arch/arm/boot/zImage -dtb linux-4.14.7/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

如果看到內核啓動過程的打印,說明目前的搭建是成功的
爲了方便測試和啓動qemu,也可以複製以下代碼創建啓動腳本start.sh,需要賦予腳本運行權限 chmod +x start.sh

#!/bin/bash

qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel linux-4.14.7/arch/arm/boot/zImage \
-dtb linux-4.14.7/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic \
-append "console=ttyAMA0"

這裏簡單介紹一下QEMU命令的參數:
-M vexpress-a9 模擬vexpress-a9單板
-m 512M 單板運行物理內存512M
-kernel 指定內核鏡像路徑
-dtb 指定dtb文件路徑
-nographic 不使用圖形界面,只使用串口
-append “console=ttyAMA0” 內核啓動參數,這裏是告訴內核運行的串口設備是什麼

也可以使用 qemu-system-arm --help 來查看其他參數的使用說明

製作根文件系統

在上面的測試中,我們發現內核會報panic,提示我們缺少根文件系統

所以接下來我們使用文件格式爲ext3的SD卡作爲根文件系統的存儲空間,首先下載busybox

下載Busybox

Busybox是一個集成了常用Linux命令和工具的軟件,通過wget下載,然後同樣需要交叉編譯

wget https://busybox.net/downloads/busybox-1.27.2.tar.bz2
tar xjvf busybox-1.27.2.tar.bz2
cd busybox-1.27.2
make defconfig
make CROSS_COMPILE=arm-linux-gnueabi-
make install CROSS_COMPILE=arm-linux-gnueabi-

編譯完成後,會在_install目錄下生成需要的文件

接下來就開始製作根文件系統
-創建根目錄rootfs

sudo mkdir rootfs

-複製busybox命令到根目錄下

sudo cp -r busybox-1.27.2/_install/* rootfs/

-從工具鏈中複製運行庫到lib目錄下

sudo mkdir rootfs/lib
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib

-創建4個tty終端設備(c代表字符設備,4是主設備號,1~4分別是次設備號)

sudo mkdir -p rootfs/dev
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4

-生成鏡像

dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32

-格式化生成ext3文件系統

mkfs.ext3 a9rootfs.ext3

成功後顯示如下

-將文件複製到鏡像中

sudo mkdir tmpfs
sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs

方便起見可以將過程寫成腳本mkrootfs.sh,同樣要賦予可執行權限 chmod +x mkrootfs.sh注意修改對應路徑!

#!/bin/bash

sudo rm -rf rootfs
sudo rm -rf tmpfs
sudo rm -f a9rootfs.ext3

#創建根目錄rootfs
sudo mkdir rootfs
#複製busybox命令到根目錄下,注意busybox路徑!劃重點!
sudo cp -r busybox-1.27.2/_install/* rootfs/
#從工具鏈中複製運行庫到lib目錄下
sudo mkdir rootfs/lib
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib
#創建4個tty終端設備(c代表字符設備,4是主設備號,1 2 3 4分別是次設備號
sudo mkdir -p rootfs/dev
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4
#生成鏡像
dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32
#格式化生成ext3文件系統
mkfs.ext3 a9rootfs.ext3

#將文件複製到鏡像中
sudo mkdir tmpfs
sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs

啓動QEMU

下面我們就可以啓動QEMU來模擬vexpress-a9單板並在上面跑一個Linux kernel了
爲了方便將命令寫成腳本 start.sh

#!/bin/bash

qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel linux-4.14.7/arch/arm/boot/zImage \
-dtb linux-4.14.7/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic \
-append "root=/dev/mmcblk0 console=ttyAMA0 rw init=/linuxrc" \
-sd a9rootfs.ext3

下面是有圖形界面的命令

qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel linux-4.14.7/arch/arm/boot/zImage \
-dtb linux-4.14.7/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-append "root=/dev/mmcblk0 rw init=/linuxrc" \
-sd a9rootfs.ext3

如果出現 VNC server running on ‘127.0.0.1:5900’
需要安裝sdl庫 sudo apt-get install libsdl1.2-dev
重新配置QEMU,顯示SDL support yes即爲成功,然後編譯安裝

QEMU退出方法

在沒有圖形界面的情況下,可以使用 Ctrl+A 再按X的方式退出
也可以使用如下命令徹底退出

ps -A | grep qemu-system-arm | awk '{print $1}' | xargs sudo kill -9
發佈了56 篇原創文章 · 獲贊 118 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章