Skip to content

USB 直通第一阶段:代理方案 #123

@Justsenger

Description

@Justsenger

根据目前的研究成果,我们将采用 vmbus 中的 af-hyperv 协议包装 usbip 协议来实现本项目中的 USB 直通功能,无需网络参与。注意,目前只维护了win to win 的链路,win to linux 理论成立,向 ExHyperV-USBProxy 提交PR即可实现。

接下来是完整的操作步骤和注意事项,由于处于测试阶段,任何报错和意外都是有可能的,继续使用视作愿意承担风险。

1.宿主需要安装 usbipd-win 并重启,来获得截获 USB 设备的能力。

2.虚拟机需要安装 usbip-win2 并重启,来获得接收 USB 设备的能力。

3.虚拟机还需要下载来自 ExHyperV-USBProxy 的虚拟机代理程序 USBProxy.exe,以便接收来自宿主的设备分配请求。

ExHyperV-USBProxy 是开源的用户态转发,承担与宿主端的 ExHyperV 交换 usbip 的分配命令和数据通道功能,可以自行构建。

4.虚拟机最好使用原版镜像,部分精简版可能无法开启 hvsocket 导致分配失败。

5.目前,通过测试的设备有:Displaylink 显卡、USB 键鼠、安卓手机、固态U盘、普通U盘、摄像头、麦克风。usbip 协议不兼容的设备,本方案也同样不兼容。

6.目前,必须将 ExhyperV 保持运行才能维持 USB 链接,并没有单独将转发服务分离的原因是因为,不想在一阶方案投入过多精力,而是直接开发二阶方案。

二阶方案预告:

目前的思路是,宿主端将 usbipd-win 用户态改造为 af 协议原生实现,虚拟机端将 usbip-win2 内核态改造为 af 协议原生实现,跳过 tcpip 代理层,从而获得时序、带宽更优的体验。

宿主端的内核态驱动仍然使用来自 Oracle VirtualBox 的VBoxUSB.sys,因此无需考虑签名问题。但由于虚拟机端的内核态驱动改造后需要重新签名,因此二阶方案初期届时必须开启测试模式使用,根据性能表现以及市场期望考虑是否提交开源社区签名,还是走商业化的自签名方案。

一阶方案由于只在用户态做了工作,因此不需要考虑签名问题。

下面的图片是 af 协议的带宽能力,其他指标还在测试中。

Image Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions