1. QEMU最小系统启动
任务说明
本案例要求使用QEMU模拟x86_64架构,启动一个最小Linux系统,并验证其基本运行。所谓“最小系统”,指不依赖完整发行版镜像,而是通过内核与极简根文件系统(initramfs)直接引导至用户态shell,从而验证QEMU模拟环境与Linux内核的基本功能。
实现方案
采用内核 + initramfs方案:使用BusyBox构建静态链接的根文件系统,打包为initramfs,与Linux内核一同交给QEMU启动。系统启动后直接进入BusyBox shell,可执行基础命令验证运行状态。该方案无需磁盘镜像,启动速度快,是QEMU最小系统验证的标准做法。
SVG:QEMU最小系统启动架构
环境准备
需要一台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/meminfo | MemTotal约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打包路径是否正确。