1. QEMU最小系统启动

QEMU最小系统启动 学习卡片

任务说明

本案例要求使用QEMU模拟x86_64架构,启动一个最小Linux系统,并验证其基本运行。所谓“最小系统”,指不依赖完整发行版镜像,而是通过内核与极简根文件系统(initramfs)直接引导至用户态shell,从而验证QEMU模拟环境与Linux内核的基本功能。

实现方案

采用内核 + initramfs方案:使用BusyBox构建静态链接的根文件系统,打包为initramfs,与Linux内核一同交给QEMU启动。系统启动后直接进入BusyBox shell,可执行基础命令验证运行状态。该方案无需磁盘镜像,启动速度快,是QEMU最小系统验证的标准做法。

SVG:QEMU最小系统启动架构

宿主机(构建与执行环境) bzImage Linux内核 initramfs.img BusyBox根文件系统 qemu-system-x86_64 -kernel -initrd QEMU 模拟的 x86_64 虚拟机 CPU x86_64 内存 -m 256M 串口 -nographic Linux内核 启动至shell 验证观测点:串口输出登录提示符,可执行 # uname -a 等命令 判定标准:出现 “/ #” 提示符且命令返回正常结果

环境准备

需要一台Linux宿主机(或装有QEMU的macOS/Windows),安装以下软件包:

  • qemu-system-x86:QEMU x86_64系统模拟器
  • wget:下载内核与BusyBox源码
  • build-essential(或等效工具链):用于编译内核与BusyBox
  • cpio:打包initramfs

Ubuntu/Debian下执行:sudo apt install qemu-system-x86 wget build-essential cpio flex bison libncurses-dev libssl-dev

步骤1:获取Linux内核并编译

下载稳定版内核(以6.6.x为例)并编译x86_64最小配置:

wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.8.tar.xz
tar -xf linux-6.6.8.tar.xz
cd linux-6.6.8
make x86_64_defconfig
# 启用initramfs支持(默认已启用,确认以下项)
scripts/config -e CONFIG_BLK_DEV_INITRD
scripts/config -e CONFIG_DEVTMPFS
scripts/config -e CONFIG_DEVTMPFS_MOUNT
make -j$(nproc) bzImage

编译完成后内核位于 arch/x86/boot/bzImage。若编译环境资源有限,也可直接下载预编译内核(如发行版kernel),但需确保包含initramfs支持和virtio驱动。

步骤2:构建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 defconfig
# 启用静态编译
sed -i 's/# CONFIG_STATIC is not set/CONFIG_STATIC=y/' .config
make -j$(nproc)
make install

此时生成 _install 目录,包含bin/sbin等基础命令。接着制作initramfs:

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 Linux Boot OK ==="
exec /bin/sh
EOF
chmod +x init
find . | cpio -H newc -o | gzip > ../initramfs.img
cd ..

最终得到 initramfs.img。该init脚本挂载必要文件系统后直接进入shell,无额外初始化逻辑,符合“最小”定位。

步骤3:QEMU启动与验证

qemu-system-x86_64 \
  -kernel bzImage \
  -initrd initramfs.img \
  -append "console=ttyS0 rdinit=/init" \
  -nographic \
  -m 256M

启动后终端应显示内核日志,最终出现 / # 提示符。在提示符后执行以下命令验证系统运行:

uname -a
cat /proc/meminfo | head -3
ls /bin

验证方法与判定标准

检查项预期结果判定标准
QEMU进程启动无报错退出,串口有输出终端持续显示内核启动日志
Shell提示符出现 / #init脚本执行成功,进入交互shell
uname -a输出包含 x86_64 与内核版本6.6.8确认架构与内核版本正确
cat /proc/meminfoMemTotal约250000 kB左右确认内存配置256M生效
ls /bin列出busybox提供的命令确认根文件系统完整挂载

退出QEMU:在shell中执行 poweroff -f 或按 Ctrl+A X。

预期输出示例

以下为根据代码逻辑可确定的输出形态(非实测数据):

...
/ # uname -a
Linux (none) 6.6.8 #1 SMP ... x86_64 GNU/Linux
/ # cat /proc/meminfo | head -3
MemTotal:         253972 kB
MemFree:          241456 kB
MemAvailable:     241456 kB
/ #

若启动过程中出现 Kernel panic - not syncing,优先检查init脚本权限(需可执行)与initramfs打包路径是否正确。