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,提示我们缺少根文件系统
QEMU模拟vexpress-a9 搭建Linux kernel运行环境_第1张图片
所以接下来我们使用文件格式为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

成功后显示如下
QEMU模拟vexpress-a9 搭建Linux kernel运行环境_第2张图片

-将文件复制到镜像中

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

你可能感兴趣的:(QEMU,Linux)