1. 搭建QEMU最小系统环境
任务说明
本案例目标是在本机搭建一个可运行的QEMU最小系统:使用QEMU的系统模式(system mode)启动一个无需物理硬件、仅包含内核与最小根文件系统的虚拟机,并通过串口控制台确认系统成功引导、能够执行基础命令。完成本案例后,你将拥有一个可用于后续驱动调试实验的稳定QEMU运行环境。
环境准备
需要准备的内容包括:QEMU模拟器、Linux内核源码、交叉编译工具链(若宿主机为x86架构且目标为ARM,则需要;若目标架构与宿主机一致,可直接使用本机gcc)。本案例以ARM架构(virt机器)为例,但方法同样适用于x86_64。请确认宿主机已安装以下软件包(以Ubuntu/Debian为例):
sudo apt-get update
sudo apt-get install qemu-system-arm gcc-arm-linux-gnueabi build-essential flex bison libncurses-dev libssl-dev
最小系统构建
我们采用“内核 + initramfs”的方式构建最小系统,无需磁盘镜像。initramfs内包含一个静态编译的busybox,提供基本的shell命令。
1. 下载并配置Linux内核
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.38.tar.xz
tar -xf linux-6.1.38.tar.xz
cd linux-6.1.38
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig # 可选,如需调整配置
确保内核配置中启用了initramfs支持(默认已启用)。使用默认配置即可满足最小系统需求。
2. 编译内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j$(nproc) zImage dtbs
编译完成后,生成的文件位于:arch/arm/boot/zImage 和 arch/arm/boot/dts/vexpress-v2p-ca9.dtb。
3. 制作initramfs根文件系统
使用busybox构建最小用户空间:
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xf busybox-1.36.1.tar.bz2
cd busybox-1.36.1
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig # 确保勾选 "Settings -> Build static binary (no shared libs)"
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j$(nproc)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install
busybox默认安装到_install目录。现在创建initramfs所需的目录结构和init脚本:
cd _install
mkdir -p proc sys dev etc/init.d
cat > init << 'EOF'
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs devtmpfs /dev
echo "=== QEMU Minimal System Booted ==="
echo "Welcome to the minimal QEMU environment"
exec /bin/sh
EOF
chmod +x init
find . | cpio -H newc -o | gzip > ../initramfs.cpio.gz
cd ..
4. 启动QEMU虚拟机
回到内核源码目录,执行以下命令启动虚拟机:
cd linux-6.1.38
qemu-system-arm \
-M vexpress-a9 \
-m 256M \
-kernel arch/arm/boot/zImage \
-dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-initrd ../busybox-1.36.1/initramfs.cpio.gz \
-append "console=ttyAMA0 rdinit=/init" \
-nographic
验证方法与判定标准
启动后,QEMU窗口(或当前终端)应显示内核引导日志,最终出现类似以下内容:
...
Freeing unused kernel memory: 1024K
Run /init as init process
=== QEMU Minimal System Booted ===
Welcome to the minimal QEMU environment
/ #
当看到/ #提示符时,说明系统已成功引导。此时可输入以下命令验证基本功能:
/ # uname -a
/ # ls /dev
/ # cat /proc/meminfo
判定标准:
- 系统能够引导至shell提示符
/ #; uname -a能显示Linux内核版本信息;/dev目录下能看到设备节点(devtmpfs已挂载);/proc/meminfo能显示内存信息。
满足以上条件,即表示QEMU最小系统环境搭建成功,可用于后续驱动调试实验。退出QEMU时,输入poweroff -f或按Ctrl+A然后按X。
QEMU最小系统架构示意
常见问题排查
- 内核编译失败:确认交叉编译工具链已安装,且
CROSS_COMPILE环境变量正确。 - 启动后无输出:检查
-append参数中的console=ttyAMA0是否与vexpress平台匹配;确认dtb文件路径正确。 - initramfs无法挂载:确认init脚本具有可执行权限(
chmod +x init),且cpio归档命令在_install目录内执行。 - 退出QEMU:使用
Ctrl+A X组合键强制退出,或在客户机内执行poweroff -f。
至此,QEMU最小系统环境搭建完成,该环境可作为后续驱动调试实验的基础平台。