参考
目标
选择一个usb重定向方案,作为我们云应用场景的usb重定向主要,或者备用方案
主流重定向方法
云桌面/应用方案
厂商 | 云桌面方案 | 云应用方案 |
---|---|---|
kylin | qemu-kvm + spice | rdp |
sangfor | qemu-kvm + spice | rdp |
citrix | ? | ? |
详细分析
sangfor
sangfor 就云应用这个场景,其实是分两个方案的。信创场景和非信创场景
信创场景
该方案下,采用windows desktop版本 1:1 通过rdp协议提供给用户使用
优点:单用户,支持更好(有些软件自身无法支持多用户),usb重定向直接复用vdi场景的方案(qemu-kvm+spice+usbredir)
缺点:资源消耗较大,对于每个需要提供云应用的用户,需要提供一台单独的虚拟机为其服务(不过深信服有个人盘功能,不知道会不会有相关优化),
非信创场景
该方案下,采用windows server版本 1:n 通过rdp协议提供用户使用
优点:资源消耗小,多用户只需要一台虚拟服务器
缺点:兼容差(有些软件自身无法支持多用户)没有发现有相关的usb重定向功能,但是有一些指定类型设备的重定向方案,如磁盘重定向(本质并不涉及到usb)
优化模式
磁盘重定向
- 基于virtual Box的磁盘重定向二次开发打造
USA
- 通过手段,修改了SCSI的单次请求大小,从128个LUN 提升到1024个,单次数据大了8倍,单次读写,从65536提升到524288,减少了SCSI的冗余数据
- 然后针对性开启流式传输,单次传输大小16384
- 总体来看,手段类似于我们之前的fat优化
其他
问:vm中 usb设备有个驱动,是否不是全虚拟化方案?
答:经过排查确认,哪个不是usb设备的驱动,因为一些意外,导致usb设备重定向受到影响。sangfor usb重定向,依然还是使用的qemu-kvm + spice +usbredir
问:sangfor支持 高速u盘传输,是怎么实现的
citrix
citrix 云应用类似sangfor的xr场景,单独一个windows desktop版本,1:1 提供用户使用
基础的usb重定向
linux
linux下,并没有发现对应的usb重定向功能,官网宣称支持。但是本地实测并没有生效。从ubuntu客户端连接虚拟机后,并没有相应的设备面板。
windows
windows下,具备usb重定向功能,功能架构应该属于半虚拟化,端口重定向方案。在windows中虚拟了一个usb主控(Citrix remote USB host controller)。并在客户端给设备加载一个驱动(ctxusbrdr.sys)。
其中Citrix remote USB host controller 类似于usbip的 VHCI主控驱动
ctxusbrdr.sys 则类似于 usbip-host驱动
优化模式
citrix 还具备很多usb优化,比如磁盘重定向,Twain重定向 HDX多媒体重定向。基本上都属于设备重定向范围
HDX
HDX 被citrix 归类为多媒体优化,但是其中实现原理,各不相同,区别很大。
- Audio
- 可以在虚拟机中查看到 Citrix HDX Audio,有音频设备接入时(只要包含音频,比如摄像头自带的音频也算),就能看到一个音频设备,出现在它下面。典型的半虚拟化,设备重定向实现
- Camera
- 该功能,原理上猜测是Web Camera的实现。但是无论在设备管理器,还是控制面板-设备中,都查看不到对应虚拟设备。
- 用camera类软件时,不管是否接入camera设备,接入几个设备,都可以看到一个且仅有一个Citrix HDX Web Camera 驱动。
- 平时,客户端不受任何影响,只有在点击预览是,客户端才产生一个独立进程访问设备
- /opt/Citrix/ICAClient/util/gst_read –input_device=/dev/video0 –casInfo=, InApp, , , , , , , user1, CITRIXLAB, VWIN1064S02, ,
- gst_read 没有和外界建立连接,应该还是通过主进程通信的。
- 该方案下,无法修改摄像头的分辨率。无法查看到虚拟设备,软件兼容性会比较差。
- 虚拟机截图,可以看到画面,排除本地直接显示的方案
- 通过opencv,directshow的初步学习和实验,已经确认了citrix HDX方案的虚拟摄像头,是通过directshow虚拟的
其他
- 磁盘重定向
- 磁盘重定向方案的读写速度,也时30/20(MB/s)的读写速度
kylin
优化模式
- 磁盘重定向
- kylin的磁盘重定向是基于Dokan技术实现的(可以理解为一个windows的fuse文件系统)
- 实测速度,在千兆网,可以达到30/20(MB/s)的读写速度
- 直连模式,在千兆网,可以达到55/25(MB/s)的读写速度
- kylin的磁盘重定向是基于Dokan技术实现的(可以理解为一个windows的fuse文件系统)
方案选型对比
- 总结下常见云应用场景模型
- 1:n 共享模式,一个虚拟服务器,提供多个用户使用云应用
- 优点:节省资源
- 1:1 专用模式,一个用户对应一个虚拟主机
- 优点:兼容性差
- 1:n 共享模式,一个虚拟服务器,提供多个用户使用云应用
我们当前使用的是共享模式
下面是我们可选的方案列表
基础重定向方案
方案 客户端开源 服务端开源 全/半虚拟化 端口/设备重定向 用户隔离 rdp(urbdrc) Y N 半 端口 Y usbredir + qemu-kvm Y Y 全 端口 N usbip Y Y 半 端口 N
方案 | 优点 | 缺点 |
---|---|---|
rdp(urbdrc) | rdp原生功能,不要考虑用户隔离 | 服务端代码不开源,有些问题,难以排查解决 |
usbredir + qemu-kvm | 代码成熟,且我们已经具备大量经验,包括现成的权限控制系统和优化方案 | 不支持用户隔离,需要额外想办法支持,性能比usbip稍差 |
usbip | 有现成的开源代码,理论上,可以使用usbredir中的部分优化方案,性那能好 | 不支持用户隔离,需要额外想办法支持,兼容性比usbredir稍差 |
我们目前采用的方案是rdp方案。优点显而易见,我们云应用采用的场景是共享模式,rdp场景原生就支持用户隔离,缺点是服务端代码不开源,一旦出现问题,难以修改
我个人的建议是,支持双模式:
1、共享模式+rdp方案,可以应对大多数,对外设需求不高的场景(简单的u盘支持)
2、专用模式+(usbredir + qemu-kvm)方案,应对部分对外设需求较高的场景
这么选的理由
- 从产品角度
- 可以使用共享模式,节省资源
- 在共享模式下,不好支持的外设,可以使用专用模式针对性解决
- 从开发角度
- rdp我们已经有成熟的产品模型
- usbredir + qemu-kvm 我们也有了成熟的解决方案,需要做的就是支持两种模式的配置,甚至于页面一键转化
优化方案性能对比
磁盘重定向
视频重定向
优化方案
- 键盘鼠标优化,基本的虚拟化技术已经支持,不做讨论
- 磁盘重定向
方案 客户端开源 服务端开源 全/半虚拟化 端口/设备重定向 用户隔离 rdp + ? Y N 半 设备 Y virtulbox Y Y 半 设备 Y? - 音频重定向,基本的虚拟化技术已经支持,不做讨论
- 视频重定向
方案 客户端开源 服务端开源 全/半虚拟化 端口/设备重定向 用户隔离 citrix HDX N N 半 设备 Y? kylin-uvc Y Y 全 端口 N Twain Y Y 半 设备 Y? web camera Y Y 半 设备 Y?
Ps:web camera这里是一个概称,包括但是不限于基于ONVIF,V4L2等协议的大量开源项目
- 打印机重定向,待调研
- 扫描仪重定向,待调研
- 本文作者: crazyboy
- 本文链接: http://crazyboy.www.crazyboy.info/blog/blog/2022/04/11/kylin/vapp/usb/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!