1. 搭建QEMU最小系统环境

搭建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

判定标准:

  1. 系统能够引导至shell提示符/ #;
  2. uname -a能显示Linux内核版本信息;
  3. /dev目录下能看到设备节点(devtmpfs已挂载);
  4. /proc/meminfo能显示内存信息。

满足以上条件,即表示QEMU最小系统环境搭建成功,可用于后续驱动调试实验。退出QEMU时,输入poweroff -f或按Ctrl+A然后按X。

QEMU最小系统架构示意

QEMU最小系统架构 宿主机 (Host) QEMU 系统模拟 qemu-system-arm -M vexpress-a9 虚拟硬件 (vexpress-a9) Cortex-A9 256MB RAM UART (ttyAMA0) GIC 客户机 (Guest) Linux 内核 (zImage) 设备树: vexpress-v2p-ca9.dtb initramfs (initramfs.cpio.gz) /init → busybox shell 加载 执行 串口控制台: -nographic → 终端交互

常见问题排查

  • 内核编译失败:确认交叉编译工具链已安装,且CROSS_COMPILE环境变量正确。
  • 启动后无输出:检查-append参数中的console=ttyAMA0是否与vexpress平台匹配;确认dtb文件路径正确。
  • initramfs无法挂载:确认init脚本具有可执行权限(chmod +x init),且cpio归档命令在_install目录内执行。
  • 退出QEMU:使用Ctrl+A X组合键强制退出,或在客户机内执行poweroff -f。

至此,QEMU最小系统环境搭建完成,该环境可作为后续驱动调试实验的基础平台。