如何配置Virtual Machine通过网络USB Hub实现对接物理USB口的仿真U盘
虚拟机仿真U盘对接物理USB端口配置方案
前置准备
- 虚拟机平台优先选择 KVM 或 VMware Workstation/Pro,兼容性优于 VirtualBox,需提前开启宿主机 CPU 硬件虚拟化扩展(Intel VT-x / AMD-V)
- 虚拟机操作系统推荐使用 Debian 11+ / Ubuntu 20.04+ 服务器版,占用资源低、内核对USB Gadget支持完善
- 虚拟机存储预留空间至少为单批次导出文件总容量的3倍,避免磁盘写满导致导出失败
步骤1:对接IP USB Hub物理端口
我们需要先把IP USB Hub上连接现场设备的物理USB端口映射到虚拟机中:
- 安装USB/IP客户端工具:
Debian/Ubuntu 执行apt update && apt install usbip -y
CentOS/RHEL 执行yum install usbip -y - 加载虚拟主机控制器内核模块:
执行modprobe vhci-hcd,并将vhci-hcd写入/etc/modules-load.d/usbip.conf实现开机自动加载 - 绑定物理USB端口到虚拟机:
先执行usbip list -r [IP USB Hub的局域网IP]查看Hub上所有可用端口的总线ID,再执行usbip attach -r [IP USB Hub的局域网IP] -b [对应端口总线ID]完成绑定 - 验证绑定结果:执行
lsusb能看到对应USB端口设备即代表对接成功
步骤2:配置仿真U盘(USB大容量存储仿真)
- 首先创建仿真U盘的存储镜像文件,以创建32G容量为例,执行:
qemu-img create -f raw /opt/usbdisk.img 32G
如需更高读写性能可添加preallocation参数:qemu-img create -f raw -o preallocation=full /opt/usbdisk.img 32G - 格式化镜像为现场设备支持的文件系统,32G及以下用FAT32:
mkfs.vfat /opt/usbdisk.img,大于32G用exFAT:mkfs.exfat /opt/usbdisk.img - 加载USB大容量存储Gadget内核模块,暴露镜像为可移动U盘:
modprobe g_mass_storage file=/opt/usbdisk.img stall=0 removable=1
参数说明:stall=0避免传输超时,removable=1让设备识别为可移动磁盘,和普通U盘表现完全一致 - 配置开机自动加载:将
g_mass_storage file=/opt/usbdisk.img stall=0 removable=1写入/etc/modules-load.d/usbgadget.conf即可,若系统开启了安全启动需先关闭才能加载该模块
步骤3:功能验证与自动化扩展
- 现在在现场设备端触发导出功能,即可识别到该仿真U盘,写入的数据会直接同步到虚拟机的镜像文件中
- 如需直接读取导出的文件,可将镜像挂载到本地目录:
mount -o loop /opt/usbdisk.img /mnt/usbdisk,即可直接访问内部文件 - 可自行编写脚本监控目录文件变更,新文件生成后自动拷贝到指定安全存储位置,实现全流程自动化
常见兼容性优化
- 若现场设备对U盘的厂商ID/产品ID有校验,可在加载
g_mass_storage模块时添加idVendor=0xXXXX idProduct=0xXXXX参数,替换为原有普通U盘的PID/VID,完全模拟旧U盘避免识别失败 - IP USB Hub与虚拟机需部署在同一个二层VLAN内,避免跨网传输延迟过高导致现场设备识别U盘超时
- 每3个月执行一次
fsck检查镜像文件系统,避免文件系统损坏导致导出失败
内容的提问来源于stack exchange,提问作者meehog527
相关产品推荐
相关产品推荐

