使用额外ext4磁盘镜像在QEMU中传递与加载内核模块

使用额外 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。

如何更新镜像中的文件(宿主机操作)

当需要替换驱动或添加新文件时:

  1. 确保 QEMU 客户机已经卸载该镜像(执行了 umount /mnt/driver)。
  2. 在宿主机上挂载镜像并更新文件:
bash 复制代码
   # sudo mount -o loop driver.img /tmp/mnt_driver

   # 替换或添加文件
   # sudo cp new_driver.ko /tmp/mnt_driver/

   # sudo umount /tmp/mnt_driver
  1. 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 客户机之间轻松传递内核模块文件。

相关推荐
hai3152475432 小时前
libcore_final.c —— 九章数流矩阵系统
linux·运维·网络
zh路西法2 小时前
【RDKX5交叉编译】基于 QEMU 的 RDK X5 ARM64 rootfs 镜像定制与 chroot 开发环境搭建
linux
iRayCheung2 小时前
virtualbox安装的ubuntu系统跑numpy报错
linux·ubuntu·numpy
Dlrb12113 小时前
Linux系统编程-信号量(线程同步机制)
linux·条件变量·互斥锁·信号量·线程同步
无限进步_3 小时前
Linux进程等待——wait、waitpid与僵尸进程
linux·运维·服务器·开发语言
2401_834636993 小时前
Linux集群技术-高可用与负载均衡实战解析
linux·运维·负载均衡
吠品3 小时前
处理 Python 类继承中那些变来变去的初始化参数
linux·前端·python
帅大大的架构之路3 小时前
linux上面的一些小知识点
linux·运维·服务器
光电笑映3 小时前
进程间通信:深入 System V IPC:共享内存、消息队列与信号量
linux·运维·服务器·c++