qemu: usb存储设备仿真

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-storageusb-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_SCSICONFIG_BLK_DEV_SD
另外要正确识别FAT格式化的设备,还需支持FAT文件系统 CONFIG_FAT_FSCONFIG_VFAT_FS

cat /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
/ # 
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页