1. 搭建QEMU设备测试环境

搭建QEMU设备测试环境 学习卡片

任务说明

本案例目标是在Ubuntu 22.04主机上完成两件事:一是从源码编译QEMU(启用GTK显示与KVM加速),二是创建一个最小可启动的虚拟机镜像(含内核与initramfs),最终通过QEMU启动该镜像并验证基本设备模拟功能(串口输出与virtio-net网络设备识别)。

1. 环境准备与QEMU源码编译

安装编译依赖,获取QEMU 8.2.0源码并配置编译选项:


# 安装依赖
sudo apt update
sudo apt install -y build-essential git python3-venv \
    libglib2.0-dev libpixman-1-dev flex bison \
    libgtk-3-dev libssl-dev ninja-build

# 获取源码
wget https://download.qemu.org/qemu-8.2.0.tar.xz
tar xf qemu-8.2.0.tar.xz
cd qemu-8.2.0

# 配置(启用GTK显示、KVM、virtio-net后端)
./configure --prefix=/opt/qemu \
    --target-list=x86_64-softmmu \
    --enable-gtk --enable-kvm \
    --enable-virtfs --enable-vhost-net

# 编译安装
make -j$(nproc)
sudo make install
export PATH=/opt/qemu/bin:$PATH

验证编译结果:qemu-system-x86_64 --version应输出QEMU emulator version 8.2.0。

2. 创建最小可启动镜像

使用BusyBox构建最小根文件系统,并准备Linux内核:


# 下载内核(使用Ubuntu官方内核二进制)
apt download linux-image-5.15.0-91-generic
dpkg-deb -x linux-image-*.deb kernel/
# 提取vmlinuz
cp kernel/boot/vmlinuz-5.15.0-91-generic ./vmlinuz

# 制作initramfs(含busybox)
mkdir -p rootfs/{bin,sbin,etc,proc,sys,dev}
wget https://busybox.net/downloads/binaries/1.35.0-x86_64-linux-musl/busybox
chmod +x busybox
cp busybox rootfs/bin/
cd rootfs
ln -s bin/busybox init
# 创建init脚本
cat > init <<'EOF'
#!/bin/busybox sh
mount -t proc none /proc
mount -t sysfs none /sys
echo "=== QEMU minimal boot OK ==="
echo "virtio-net test:"
ip link set eth0 up 2>/dev/null && echo "eth0 detected" || echo "eth0 missing"
exec /bin/sh
EOF
chmod +x init
# 打包initramfs
find . | cpio -o -H newc | gzip > ../initramfs.gz
cd ..

3. 启动虚拟机并验证设备模拟

使用virtio-net设备启动虚拟机,观察串口输出:


qemu-system-x86_64 \
    -kernel vmlinuz \
    -initrd initramfs.gz \
    -append "console=ttyS0 rdinit=/init" \
    -m 256M \
    -smp 1 \
    -netdev user,id=net0 \
    -device virtio-net-pci,netdev=net0 \
    -nographic

4. 验证方法与判定标准

启动后应观察到以下输出,即可判定环境搭建成功:

  • 内核启动日志正常输出至串口;
  • 出现=== QEMU minimal boot OK ===标志;
  • 出现eth0 detected,证明virtio-net设备已被内核识别并驱动。

若出现eth0 missing,说明virtio-net驱动未加载或设备未正确挂载,需检查内核配置或QEMU设备参数。

QEMU设备测试环境搭建与验证拓扑 宿主机 (Ubuntu 22.04) QEMU 8.2.0 源码编译 --enable-kvm --enable-gtk vmlinuz + initramfs.gz Linux 5.15 + BusyBox 最小根文件系统 qemu-system-x86_64 -kernel -initrd -nographic -netdev user -device virtio-net QEMU虚拟机 (x86_64) virtio-net-pci 模拟网卡设备 串口 (ttyS0) 控制台输出 i440FX/ICH9 主板芯片组 验证点 串口输出 eth0 detected boot OK -netdev user (SLIRP用户态网络栈) KVM硬件加速 (可选) 判定标准

5. 常见问题排查

  • KVM权限错误:将当前用户加入kvm组 sudo usermod -aG kvm $USER,重新登录后生效;
  • virtio-net未识别:确认内核包含CONFIG_VIRTIO_PCI=y和CONFIG_VIRTIO_NET=y,可用grep VIRTIO /boot/config-$(uname -r)检查;
  • initramfs无法启动:确认init脚本具有可执行权限,且cpio打包时路径正确(应在rootfs目录内执行find命令)。

本案例完成后,即获得一个可重复使用的QEMU设备测试基础环境,后续案例可在此环境上添加自定义设备并验证其功能。