qemu既支持仿真虚拟的usb存储设备,也支持连接实际的设备(如U盘)。相关的命令参数为:
-usb
-device usb-storage,drive=drive_id
-device usb-uas
-device usb-bot
-device usb-host,hostbus=bus,hostaddr=addr
-device usb-host,vendorid=vendor,productid=product
- “-usb” 使能usb总线,如果系统已添加usb总线,则不需要这个参数
- “usb-storage” 仿真使用bulk-only传输协议的虚拟设备(绝大部分u盘采用的传输方式),只支持单一逻辑单元
- “usb-uas” 仿真使用UAS(USB attached SCSI)传输协议的虚拟设备,支持多逻辑单元(MLUN)
- “usb-bot” 也是仿真使用bulk-only传输协议的虚拟设备,支持多逻辑单元
- “usb-host” 连接实际的usb存储设备
下面介绍常用的 usb-storage 和 usb-host 方式。
使用虚拟设备
首先创建设备文件,可以选择固定大小的raw格式或者大小动态增长的qcow2等格式。
使用raw格式的好处是可以直接在PC上对设备文件进行分区及格式化等操作,只是占用较多的存储空间。
而使用qcow2格式则只需占用很小的存储空间,适合仿真大容量设备,只是得挂载后才能分区或格式化。
raw格式
创建设备:
$ qemu-img create -f raw disk_01.img 32M
Formatting 'disk_01.img', fmt=raw size=33554432
$
$ ls -l disk_01.img
-rw-r--r-- 1 cjz cjz 33554432 Oct 6 21:18 disk_01.img
格式化设备:
$ mkfs.vfat disk_01.img
mkfs.fat 3.0.26 (2014-03-07)
qemu挂载设备:
qemu <other options ...> \
-usb \
-drive if=none,format=raw,id=disk1,file=disk_01.img \
-device usb-storage,drive=disk1
还可以添加usb主控制器设备(root hub)来增加usb总线,并挂载设备到新总线上,比如:
qemu <other options ...> \
-drive if=none,format=raw,id=disk1,file=disk_01.img \
-device ich9-usb-ehci1,id=usb \
-device usb-storage,bus=usb.0,drive=disk1
使用命令 “qemu -device ?” 可以查看支持的虚拟设备信息
qcow2格式
创建设备:
$ qemu-img create -f qcow2 disk_02.img 4G
Formatting 'disk_02.img', fmt=qcow2 size=4294967296 encryption=off cluster_size=65536 lazy_refcounts=off
$
$ ls -l disk_02.img
-rw-r--r-- 1 cjz cjz 197120 Oct 6 21:26 disk_02.img
可以看到4GB大小的设备实际只占用很小存储空间(将随着设备的使用情况而动态增加)。
qemu挂载方法与上面相同,只是把格式改成 “format=qcow2” :
qemu <other options ...> \
-usb \
-drive if=none,format=qcow2,id=disk2,file=disk_02.img \
-device usb-storage,drive=disk2
使用实际设备
首先使用 lsusb 命令查看连接到PC的usb设备信息,比如:
$ lsusb
...
Bus 002 Device 005: ID 05e3:0736 Genesys Logic, Inc. microSD Reader/Writer
...
qemu挂载方式1: 使用厂家和产品的唯一标识码
qemu <other options ...> \
-usb \
-device usb-host,vendorid=0x05e3,productid=0x0736
即对应lsusb显示的 “ID 05e3:0736”。
qemu挂载方式2: 使用总线地址信息
qemu <other options ...> \
-usb \
-device usb-host,hostbus=2,hostaddr=5
即对应lsusb显示的 “Bus 002 Device 005”。
使用实际设备需要root权限,否则会出现下面的错误:
libusbx: error [_get_usbfs_fd] libusbx couldn't open USB device /dev/bus/usb/002/005: Permission denied
libusbx: error [_get_usbfs_fd] libusbx requires write access to USB device nodes.
可以 “sudo” 运行qemu命令,或者创建udev规则来改变设备的访问权限,比如:
创建udev规则文件 /etc/udev/rules.d/qemu-usb.rules,并添加以下内容:
SUBSYSTEM=="usb", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="0736", MODE="0666"
QEMU测试
以实际设备为例,运行命令:
qemu <other options ...> \
-device ich9-usb-ehci1,id=usb \
-device usb-host,vendorid=0x05e3,productid=0x0736,bus=usb.0
这是qemu内核运行后的打印信息:
usb 1-1: new high-speed USB device number 2 using ehci-pci
usb 1-1: New USB device found, idVendor=05e3, idProduct=0736
usb 1-1: New USB device strings: Mfr=3, Product=4, SerialNumber=2
usb 1-1: Product: USB Storage
usb 1-1: Manufacturer: Generic
usb 1-1: SerialNumber: 000000000272
...
/ #
/ # lsusb
Bus 001 Device 002: ID 05e3:0736
Bus 001 Device 001: ID 1d6b:0002
/ #
/ # cat /sys/bus/usb/devices/1-1/1-1:1.0/bInterfaceClass
08
/ # cat /sys/bus/usb/devices/1-1/1-1:1.0/bInterfaceSubClass
06
/ # cat /sys/bus/usb/devices/1-1/1-1:1.0/bInterfaceProtocol
50
/ #
如果内核已包含 CONFIG_USB_STORAGE,则会自动检测usb存储设备,否则加载该模块:
该模块还依赖于SCSI模块: CONFIG_SCSI 及 CONFIG_BLK_DEV_SD
另外要正确识别FAT格式化的设备,还需支持FAT文件系统 CONFIG_FAT_FS 及 CONFIG_VFAT_FScat /proc/filesystems 可以查看当前内核支持的文件系统列表
/ # insmod /lib/modules/3.12.74/usb-storage.ko
usb_storage: module verification failed: signature and/or required key missing - tainting kernel
usb-storage 1-1:1.0: USB Mass Storage device detected
scsi2 : usb-storage 1-1:1.0
usbcore: registered new interface driver usb-storage
/ # scsi 2:0:0:0: Direct-Access Generic STORAGE DEVICE 0272 PQ: 0 ANSI: 0
sd 2:0:0:0: Attached scsi generic sg2 type 0
sd 2:0:0:0: [sdb] 7744512 512-byte logical blocks: (3.96 GB/3.69 GiB)
sd 2:0:0:0: [sdb] Write Protect is off
sd 2:0:0:0: [sdb] No Caching mode page found
sd 2:0:0:0: [sdb] Assuming drive cache: write through
sd 2:0:0:0: [sdb] No Caching mode page found
sd 2:0:0:0: [sdb] Assuming drive cache: write through
sdb: sdb1
sd 2:0:0:0: [sdb] No Caching mode page found
sd 2:0:0:0: [sdb] Assuming drive cache: write through
sd 2:0:0:0: [sdb] Attached SCSI removable disk
sdb 为整个usb存储设备,sdb1 为设备上的的第一个分区。
/ # ls -l /dev/sdb*
brw------- 1 0 0 8, 16 Oct 7 07:59 /dev/sdb
brw------- 1 0 0 8, 17 Oct 7 07:59 /dev/sdb1
/ #
/ # cat /sys/block/sdb/size
7744512
/ # cat /sys/block/sdb/sdb1/size
7742431
/ #
/ # mount -t vfat /dev/sdb1 /tmp
/ #
/ # mount | grep sdb
/dev/sdb1 on /tmp type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
/ #
/ # df -h | grep sdb
/dev/sdb1 3.7G 100.0K 3.7G 0% /tmp
/ #
本文介绍了如何在QEMU中仿真USB存储设备,包括raw和qcow2格式的虚拟设备,以及如何连接和挂载实际的USB设备。通过qemu命令参数,如`-usb`, `usb-storage`和`usb-host`,实现设备的仿真和使用。同时,文章还提到了实际设备挂载的两种方法,并强调了权限和udev规则设置的重要性。"
83722494,7418926,Kaggle房价预测实战指南,"['机器学习', '数据竞赛', '预测模型', '数据预处理', '特征工程']
354

被折叠的 条评论
为什么被折叠?



