使用额外 ext4 磁盘镜像在 QEMU 中传递与加载内核模块
概述
我们可以通过给QEMU增加一个独立的磁盘镜像(ext4格式)来传递驱动模块文件。该方法兼容性好,不依赖特殊网络或内核配置,适用于绝大多数Linux客户机。
操作步骤
1. 在宿主机上创建 ext4 镜像
bash
# 创建 64MB 的空文件(大小可按需调整)
dd if=/dev/zero of=driver.img bs=1M count=64
# 格式化为 ext4
mkfs.ext4 driver.img
2. 将驱动模块放入镜像
bash
# 创建临时挂载点
mkdir -p /tmp/mnt_driver
# 挂载镜像
sudo mount -o loop driver.img /tmp/mnt_driver
# 复制内核模块 (.ko 文件)
sudo cp simple_demo.ko /tmp/mnt_driver/
# 卸载镜像
sudo umount /tmp/mnt_driver
3. 启动 QEMU 并挂载该镜像作为第二块磁盘
在 QEMU 启动命令行中添加一个 -drive 参数:
bash
qemu-system-x86_64 \
... 你的原有参数 (内核、initrd 等) ... \
-drive file=driver.img,format=raw,if=virtio,index=1
- 若客户机没有 virtio 驱动,可改用
if=ide。 index=1表示第二个磁盘(第一个通常是系统盘)。设备名称在客户机中通常为/dev/vdb(virtio) 或/dev/sdb(IDE)。
4. 在 QEMU 客户机内挂载镜像
启动 QEMU 后,进入客户机 shell,执行:
bash
# 查看新磁盘设备 (例如 /dev/vdb)
# lsblk
# 创建挂载点
# mkdir -p /mnt/driver
# 挂载 (ext4)
# mount /dev/vdb /mnt/driver
# cd /mnt/driver
# ls -alh
total 376K
drwxr-xr-x 3 0 0 4.0K Jun 9 12:17 .
drwxrwxr-x 3 1000 1000 60 Jun 9 06:37 ..
drwx------ 2 0 0 16.0K May 25 06:41 lost+found
-rw-r--r-- 1 0 0 352.5K Jun 9 07:17 simple_demo.ko
5. 加载驱动模块
bash
# insmod simple_demo.ko
[20788.352915] simple_demo: loaded (/dev/simple_demo)
# ls -lha /dev/simple_demo
crw-rw-rw- 1 0 0 10, 261 Jun 9 12:22 /dev/simple_demo
# dmesg | tail
[20788.352915] simple_demo: loaded (/dev/simple_demo)
6. 卸载与清理
测试完成后,在客户机内:
bash
# rmmod simple_demo
# cd /
# umount /mnt/driver
此时可以在宿主机上重新挂载 driver.img,更新文件后再次用于 QEMU。
如何更新镜像中的文件(宿主机操作)
当需要替换驱动或添加新文件时:
- 确保 QEMU 客户机已经卸载该镜像(执行了
umount /mnt/driver)。 - 在宿主机上挂载镜像并更新文件:
bash
# sudo mount -o loop driver.img /tmp/mnt_driver
# 替换或添加文件
# sudo cp new_driver.ko /tmp/mnt_driver/
# sudo umount /tmp/mnt_driver
- QEMU客户机上再次
mount /dev/vdb /mnt/driver即可看到新文件。
注意 :宿主机与 QEMU 客户机不要同时挂载该镜像,否则有可能会损坏文件系统。建议遵循"串行访问"原则。
常见问题与解决
| 问题 | 原因 | 解决方法 |
|---|---|---|
设备 /dev/vdb 不存在 |
客户机没有 virtio-pci 驱动 | 启动 QEMU 时改用 if=ide,设备名变为 /dev/sdb |
挂载失败 mount: /dev/vdb already mounted or mount point busy |
镜像曾被异常挂载 | 客户机内 umount /dev/vdb,宿主机内 sudo umount /tmp/mnt_driver |
加载模块提示 Key was rejected |
客户机启用了 UEFI Secure Boot | 在客户机内关闭 Secure Boot 或为模块签名 |
优点
- 无需重新编译客户机内核 -- 只要支持 ext2/ext4 和 virtio-blk/IDE 即可。
- 不依赖网络 -- 适合最小化系统。
- 文件更新可控 -- 宿主机可以随时修改镜像内容。
缺点
- 不能同时访问 -- 宿主机和客户机无法同时挂载同一镜像。
- 需要额外磁盘槽位 -- QEMU 虚拟机需要支持多磁盘。
总结
通过创建一个 ext4 格式的磁盘镜像,可以在宿主机和 QEMU 客户机之间轻松传递内核模块文件。