Table of Contents
Qemu –从源头建造
ARM工具链
Linux内核
构建文件系统
通过NFS使用根文件系统
配置QEMU Tap网络
创建运行脚本
推荐阅读:《在CentOS上进行虚拟化:QEMU、Xen、KVM、LibVirt、oVirt》
QEMU是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KQEMU这个闭源的加速器,QEMU能模拟至接近真实电脑的速度。
目前,0.9.1及之前版本的qemu可以使用kqemu加速器。在qemu1.0之后的版本,都无法使用kqemu,主要利用qemu-kvm加速模块,并且加速效果以及稳定性明显好于kqemu。
在我的嵌入式Linux课程中,我使用Qemu来模拟Linux系统。Qemu模拟许多电路板,包括硬件,中断,网络等。
在本教程中,我将介绍构建包括内核,文件系统和应用程序的完整系统的步骤。
您可以安装二进制版本,但最好从源代码下载并构建Qemu,因为我们可以使用源代码来模拟新硬件。
# wget https://download.qemu.org/qemu-2.11.0.tar.xz # tar xvJf qemu-2.11.0.tar.xz # cd qemu-2.11.0 # ./configure最后一步检查您的系统是否满足所有qemu要求。如果收到错误消息,则需要安装缺少的软件包。我正在使用Ubuntu,很容易安装缺少的部件,例如,我收到以下消息:
ERROR: glib-2.22 gthread-2.0 is required to compile QEMU搜索Google后,安装所需的软件包
# sudo apt-get install libglib2.0-dev zlib1g-dev需要更多软件包:
# sudo apt-get install libpixman-1-dev # sudo apt-get install libsdl2*现在再次运行configure并检查是否报告了SDL支持
运行make
# make # sudo make install要检查qemu是否正确安装,请运行
# qemu-system-arm -M ?
我们需要安装的第一件事是ARM的跨工具链。转到Arm.com并下载Linux版本,将其解压缩到〜/ armsystem / toolchain目录中
将位置添加到PATH环境变量中:
# export PATH=/home/developer/armsystem/toolchain/gcc-arm-none-eabi-7-2017-q4-major
转到https://www.kernel.org/并下载最新的内核。建议使用长期支持的版本。将文件解压缩到一个空目录〜/ armsystem / kernel中
编辑内核Makefile(第253行)
ARCH ?= arm CROSS_COMPILE ?= arm-none-eabi-设置配置文件
# make vexpress_defconfig运行make
# make -j4现在,我们可以使用以下命令检查QEMU中的内核:
# qemu-system-arm -M vexpress-a15 -m 512 -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vex系统将启动但由于我们尚未构建文件系统而崩溃
我们可以使用许多工具来构建嵌入式Linux文件系统。一些例子是buildroot,OpenWRT,yocto
在本教程中,我们将使用buildroot,因为它是最简单的工具
从这里下载最新的Buildroot软件包并将其解压缩到〜/ armsystem / fs中
打开配置菜单:
# make menuconfig在目标选项上,选择目标体系结构– ARM
您可以使用buildroot从Sourcery下载并安装外部工具链(推荐),也可以使用我们已经下载的现有工具链
我们将使用Sourcery工具链,因为它具有一些IDE插件。
要下载Sourcery工具链–从工具链菜单中选择:
工具链类型(外部工具链)工具链(Sourcery CodeBench ARM 2014.05)工具链的来源(要下载和安装的工具链)将gdb服务器复制到目标保存配置并构建它
# make构建成功完成后,您可以在以下位置找到新的工具链:
~/armsystem/fs/buildroot-2017.02.8/output/host/usr/bin将其添加到PATH变量,更改内核Makefile并再次构建
ARCH ?= arm CROSS_COMPILE ?= arm-none-linux-gnueabi-生成的文件系统位于buildroot / output / target中,但我们尚不能使用
使用嵌入式板的最好方法是通过NFS(在主机上)挂载目标文件系统来实现,我们需要做一些设置:
安装NFS服务器
# sudo apt install nfs-kernel-server编辑/ etc / exports以添加NFS文件夹
/home/developer/armsystem/outfs *(rw,sync,no_root_squash)重新启动NFS服务器
# sudo /etc/init.d/nfs-kernel-server restart [ ok ] Restarting nfs-kernel-server (via systemctl): nfs-kernel-server.service.
Qemu可以使用Tap / Tunnel模式将私有网络与ubuntu结合使用。要进行设置,请创建文件/ etc / qemu-ifup:
#!/bin/bash exec /sbin/ifconfig $1 192.168.0.1向文件添加执行权限(chmod a + x / etc / qemu-ifup)
创建根文件系统文件夹
复制生成的文件〜/ armsystem / outfs
# cp -r -d [buildroot]/output/target/* ~/armsystem/outfs现在,使用root用户添加以下设备文件
# sudo mknod ./dev/console c 5 1 # sudo mknod ./dev/zero c 1 5 # sudo mknod ./dev/null c 1 3 # sudo mknod ./dev/tty1 c 4 1如果要自动生成设备文件,请配置udev。使用buildroot非常容易:
从系统配置菜单中选择/ dev管理(使用devtmpfs + eudev动态)
然后从“目标软件包”>“硬件处理”菜单中,选择“ eudev”
编译buildroot,您将看到udev在init上运行:
在〜/ armsystem中创建脚本– run_qemu
qemu-system-arm -M vexpress-a15 -net tap -net nic -m 512 -kernel kernel/linux-4.14.10/arc添加执行权限并使用sudo对其进行测试(它将启动新的网络设备)
# cd ~/armsystem # sudo ./run_qemu而已!!!
现在我们可以编写一个测试应用程序,在qemu中编译并运行:
#include<stdio.h> void main(void) { puts("hello"); } # arm-none-linux-gnueabi-gcc -o app ./a.c # cp ./app ~/armsystem/outfs/现在我们还可以构建复杂的应用程序,内核模块等(下一篇文章……)
