1. 搭建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设备参数。
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设备测试基础环境,后续案例可在此环境上添加自定义设备并验证其功能。