Virtualbox虚拟机使用USB的科学方式

Virtualbox 的USB Passthrough支持早就有了,但是一直以来的对其的印象都停留在’barely works’的阶段,因为虽然实验让U盘之类的简单玩意在虚拟机加载都是正常的,而实际操作比如挂载网银U盾、3G网卡、手机刷ROM的时候,虚拟机里面总是“不知道怎么”没法搞定,USB总是莫名断开,然后虚拟机里面的程序不认设备。

昨天尝试给一台国产Android平板做定制的Recovery,操作不当变了大砖,必须使用厂商的Windows下的线刷工具救砖。打开虚拟机来测试,果然还是和以往一样,让平板进入底层升级模式、通过vbox右下角的图标挂载到虚拟机,Win里面的升级程序愣了一下后就说找不到设备,升级失败。

观察了下,每次让虚拟机挂载了USB,一运行了升级程序,USB设备就从虚拟机里面断开了。以前都是认为是vbox的机制不完善,太BUG了。睡觉的时候才仔细想,这不大可能,肯定是打开的方式不对。

当年毕业设计做的东西是用USB通信的,所以对USB的协议有点了解,USB协议有点类似网卡收发的帧,理论上只要vbox实现了帧转发就能做到USB设备的穿透,而且是由USB Host以信令形式通信,不像PCI之类有复杂的CPU中断请求,这个机制应该不是非常复杂的。虽然需要处理在宿主机器操作系统的挂载优先问题,不过貌似已经解决很好了啊,U盘能够从宿主断开后才挂载到虚拟机的。所以猜测USB设备的断开是因为设备收到信号、切换了工作模式,让vbox认为是另外一个设备,没有继续挂载到虚拟机,于是就有断链的现象。

今天继续研究的时候,就开着终端watch lsusb看着USB设备的变化,果然升级程序运行后,设备消失了一下,然后新设备的bcdDevice属性出现了变化,之后vbox就没继续挂载这个设备了。

期间还去搜索了一下kvm 的 USB Passthrough,发现kvm的USB支持比vbox弱爆了,只能在关机状态下对虚拟机的配置手动添加对应设备的vendor id/product id。不过这里让我想起vbox的guest setting里面的USB Device Filters配置界面:

vbox-usb-setting.png

这里可以通过右边的按钮添加一个filter,也是需要输入设备的vendor id/product id,马上想到这里应该是可以预定义让vbox挂载那些设备的,于是赶紧重新操作一次,把平板升级过程变化的两个状态都添加到filter,重新操作,果然升级程序就认到了,救砖行动成功! 用不着找别人借用Windows了,呵呵呵。

总结科学的操作方式是:所有需要模式切换的USB设备,都需要在filters里面添加相应状态;不过一般情况下,同一个设备的状态的vendor id都会相同,所以仅需填写vendor id 即可识别其各个状态了,填写的条件越多,识别的情况越精确。详见VBox官方文档

文章分类 虚拟化 标签: , ,
7 comments on “Virtualbox虚拟机使用USB的科学方式
  1. reverland说道:

    vbox中usb老是报错,一直懒得管,今天看到博主的文章
    ……感觉不是一是半会能懂的,还是有空再说……

    • PT说道:

      不是很简单嘛,简单到我都懒得写步骤了,自己打开这个窗口点几下旁边的按钮就知道怎么用了

  2. 翘课玩魔兽说道:

    Hi PT桑:

    • 翘课玩魔兽说道:

      Hi PT桑:
      敲了一个tab,再敲键盘的时候发现已经reply了….
      呵呵,有个问题想请教下:您所指的kvm是kernel virtual machine呢?还是keyboard video mouse呢?

      thx
      翘课玩魔兽

  3. timesking说道:

    我发现如果Windows里面不安装VBox的那个扩展驱动,USB就各种好使。

  4. 天成说道:

    反过来的情况下,即win7里用virtualbox跑虚拟机,无论虚拟机是win还是linux,像摄像头,网卡之类好像依然没法正常工作,即使用了过滤,如摄像头就报缓存区不足,网卡直接无法启动~ 你这种情况下摄像头,网卡能用吗? 刷机线之类的,如usb连android,usb转串口之类的这些是没问题的~

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*