在桌面虚拟化的项目中,常常会遇到用户提出的各自外设需求,这时产品对外设的兼容性就成为了项目成败的拦路虎

本文试图用通俗易懂的语言讲讲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客户端可能会不能很好的将其识别到

谈USB重定向的方式的更多相关文章

  1. USB重定向

    第一期中,我们一起简要的看了下传统PC和桌面云下USB重定向和USB设备重定向方式的差异,了解了桌面云下外设兼容性问题来源的根源-USB设备本身驱动不规范/不支持, 或者虚拟机驱动实现上与USB设备对 ...

  2. 浅谈USB设备的VID和PID

    根据USB规范的规定,所有的USB设备都有供应商ID(VID)和产品识别码(PID),主机通过不同的VID和PID来区别不同的设备,VID和PID都是两个字节长,其中,供应商ID(VID)由供应商向U ...

  3. Spring MVC(三)控制器获取页面请求参数以及将控制器数据传递给页面和实现重定向的方式

    首先做好环境配置 在mvc.xml里进行配置 1.开启组件扫描 2.开启基于mvc的标注 3.配置试图处理器 <?xml version="1.0" encoding=&qu ...

  4. 浅谈URL重定向

    转载:https://blog.csdn.net/kiyoometal/article/details/90698761 重定向原理 HTTP 协议的重定向响应的状态码为 3xx .浏览器在接收到重定 ...

  5. nrf52——DFU升级USB/UART升级方式详解(基于SDK开发例程)

    摘要:在前面的nrf52--DFU升级OTA升级方式详解(基于SDK开发例程)一文中我测试了基于蓝牙的OTA,本文将开始基于UART和USB(USB_CDC_)进行升级测试. 整体升级流程: 整个过程 ...

  6. 浅谈输入输出”重定向“——基于Linux系统

    前言 进程在启动后会自动的打开3个文件:标准输入.标准输出和标准错误输出分别对应文件描述符0.1.2.对于每个进程他们都都维护了一张文件描述符表(file descriptor table),通常fd ...

  7. 小米pad MI PAD 开发者选项、USB调试开启方式

    设置->关于平板->在MIUI版本一行连续点击7次. 之后就出现了开发者选项.可以开启USB调试等. 你能想到吗……??

  8. 客户端通过spice-gtk实现USB重定向

    1.安装必要的工具: sudo apt-get install build-essential autoconf git-core intltool 2.安装必要的依赖包: -dev libxfixe ...

  9. KVM通过qemu实现USB重定向

    KVM是通过qemu来支持USB设备的,可以在启动的时候就指定需要连接的USB设备,也可以系统启动后动态的添加删除.通过qemu的help可知,使用qemu的usb_add host:xxx:xxx来 ...

随机推荐

  1. UnicodeString基本操作(Ring0)

    #include "Unicode_String_Ring0.h" //bp Unicode_String_Ring0!DriverEntry NTSTATUS DriverEnt ...

  2. [UE4]用.csv作为配置文件

    csv文件,以逗号分割的值的文件. csv文件的第一行一般为表头,第二行开始是字段值. .csv文件,纯文本,可以用记事本打开看到内容. excel支持csv文件,方便修改. 导入csv文件: 一.建 ...

  3. 配置ssh服务允许root管理员直接登录

    配置ssh服务允许root管理员直接登录 [root@linux-node2 ~]# grep PermitRootLogin /etc/ssh/sshd_config PermitRootLogin ...

  4. CRM4.0 上传附件大小限制

    问题背景: 上传附件大小默认为 5M 可以通过以下设置修改其大小 : "设置"--〉“管理”--〉“系统设置”--〉“电子邮件”--〉“设置附件文件的大小限制”

  5. flask基础知识

    关于flask框架的基础知识 相关基础知识:定义路由,定义参数,获取参数,重定向 简单易懂 ---hello.py # -*- coding: utf-8 -*- # Flask hello worl ...

  6. MySQL安装,库的操作

    一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件 ...

  7. day18包的使用与日志(logging)模块

    包的使用与日志(logging)模块1. 什么是包    包就是一个包含有__init__.py文件的文件夹    包本质就是一种模块,即包是用包导入使用的,包内部包含的文件也都是用来被导入使用2 为 ...

  8. virtualenv与virtualenvwrapper讲解

    #现在有个需求,我现在有两个项目,一个得运行于django1.1.11 ,还有一个版本得跑在django2.0上 python3 manage.py runserver  0.0.0.0:8000   ...

  9. 变量,if.elif .else判断

    一,计算机的了解 基本组成:主板+cpu+内存 cpu: 主频, 核数(16) 内存:大小(8G, 16G, 32G) 型号: DDR3, DDR4, DDR5,  主频(海盗船,玩家国度)      ...

  10. python-路径处理path

    #-*- coding:utf-8 -*- # file: class_01_path.py #本次学习:OS模块--处理路径 #F:\pythonzhm\study_181112 import os ...