在桌面虚拟化的项目中,常常会遇到用户提出的各自外设需求,这时产品对外设的兼容性就成为了项目成败的拦路虎
本文试图用通俗易懂的语言讲讲USB外设重定向的工作流程,先看看普通PC上USB设备的工作流程
usb硬件只将数据交给usb总线驱动,而应用程序只会把请求提交给本usb设备驱动处理,在usb设备驱动提交usb总线驱动处理
从上图可以看出,能够被虚拟化的只有USB设备驱动和USB总线驱动两个对象
这也是目前业界对USB设备虚拟化的两大主流方式
一. 虚拟USB总线驱动的方案
又叫做USB端口重定向,工作流程如下图
TC上所插USB设备数据通过TC的USB总线提交给虚拟USB驱动,虚拟USB驱动负责在TC总线和USB客户端之间双向传输数据,如实传输USB硬件的一切细节,对虚拟机来说,相当于在虚拟USB总线上插了一个USB硬件,假如在TC上插了一个闪迪的U盘,那在虚拟机看来就是有一个闪迪U盘插上来了,这时候虚拟机的系统会自动打相应的设备驱动
实质上,端口映射只是相当于将PC上USB工作流程里的USB设备驱动到USB总线驱动之间的这段进行了拉长,通过中间加入几个代理,最终还是将TC上USB外设的细节原原本本向虚拟机上的USB应用呈现,只是隐瞒了设备实际上是在远端TC的事实,这样应用根本感知不到和使用本地外设的差异,和运行在PC上是一样的,因此,USB端口重定向具有良好的设备兼容性。
端口重定向也有一定局限性,由于没有经过设备驱动层的压缩和预处理,对于某些扫描仪和摄像头等图像类应用,可能会导致带宽过大,网络时延敏感等问题
二. 虚拟USB设备驱动的方案
又称为USB设备重定向,工作流程如下图
USB设备重定向是在应用层的实现,通过在虚拟机上创建一个虚拟的USB外设驱动(对操作系统来说,一个驱动意味着一个设备),来使应用程序获得数据,对于整个系统来说,虚拟USB外设驱动和TC上的USB设备驱动本质上是两个不同的USB设备,而USB服务端和USB客户端负责维护两个驱动之间的数据通道(类似于在两个U盘之间互相拷贝数据)
显而易见,设备重定向工作流程中的代理环节少了很多,因而数据传输速率更高,延时更低,更适合像USB摄像头等数据流量比较大,同时对延时也比较敏感的外设
事实上,目前主流的远程桌面协议如HDX,Spice等,都为每一类外设提供从客户端到虚拟机的映射,并在应用层提供专门的通道,将不同的流量隔离开来,如摄像头、打印机、扫描类设备、智能卡设备等,甚至针对不同外设应用场景的需求,提供不同的传输Qos
设备重定向的问题主要在TC上的USB设备驱动和外设通道协议的USB客户端之间,如果外设厂家提供的不是遵循外设协议标准的驱动,那么USB客户端可能会不能很好的将其识别到