我们目前测试的设备数量非常多,每 10 台设备大约有一台 PC(每台 PC 使用两个 USB 集线器连接设备)。我们拥有大量 PC,这正在变成一场管理噩梦。我一直在思考如何虚拟化我们的基础设施,但我遇到了一个问题,即如何将大量 USB 连接从 VM 连接到设备所连接的另一个房间的 USB 集线器。
我在想,我们可以建立一个服务器机房来托管虚拟机集群,这样就可以取代 PC,但我需要一种方法,让所有设备所在的其他房间中的每个虚拟机都拥有 2 个 USB 连接。我希望大家能就如何做到这一点提出一些建议(技术/通信协议/等),因为我只找到了网络附加 USB,这似乎可行,但对于我找到的一家供应商(digi.com),它只支持 USB2。此外,digi 是唯一一家提供该技术的供应商,因此当我们按照我们考虑的规模进行构建时,这让我非常紧张。我希望找到替代的连接方式(以太网上的 PCIe?),这样我就可以更有效地做到这一点,或者至少获得更广泛的支持。另外,我还希望能够支持 USB3。
我最希望的是虚拟机上的虚拟 USB 端口在另一个房间中显示为物理 USB 端口 - 这才是我真正想要的。我还考虑过使用一个装有一堆 USB 卡的大型机箱,从卡到 USB-over-fiber 适配器,但这会引入很多连接。其他想法是如何将外部 PCI 机箱移到装有大量 USB 卡的设备(以太网上的 PCIe?)的房间并从那里将其拆开?我欢迎提出建议!
如果这确实是将 I/O 从服务器机架传输到设备的唯一方法,我也愿意将 VM 集群放置在设备所在的房间中,但我真的更希望集群位于服务器机房中,然后 I/O 从那里分支出来。
澄清一下,我希望在一个房间里有物理 USB 端口,而在虚拟机上显示虚拟 USB 端口。如何从一个地方到达另一个地方,完全欢迎大家提出建议。
答案1
您可以选择使用小型基于 Linux 的计算机、USB 集线器和软件解决方案来访问 USB 设备。
让我描述一个可能的解决方案,您可以根据自己的需要进行调整:
安装小型计算机(如树莓派) 在互联网上以多种形式进行了讨论。您可以选择您喜欢的安装方式,例如:将它们安装到现成的 19 英寸机架安装架上并钻一些孔以放置垫片,或者将它们与垫片堆叠在一起。这将是设置和扩展到大量主机的合理方法。
小型计算机的电源更易于管理。它只需要一个主机共享电源,并可能为 USB 集线器提供额外电源。工业电源和一些定制布线将创建稳定的电源,并有可能添加故障转移电源。许多这里有可能找到解决方案。
小型 Linux 计算机可以运行非常简化(单一用途)的发行版,只需安装 USB 共享软件即可。可以安装管理代理来监控主机的工作情况。为了最大限度地减少损坏的可能性,您应该购买合适的存储卡,确保主机的文件系统只读并且不配置任何交换空间。
可以使用软件解决方案来共享 USB 设备。有些供应商提供带有支持的专有软件,或者你可以选择开源解决方案,例如USB/IP 项目。
与您当前的解决方案相比的优势:
- 小型计算机出现故障时会更容易更换(更换硬件,留下存储卡)。
- 所有设备上的所有软件都将相同,并且可以通过简单的读卡器/写卡器轻松复制。
- 权力将更加易于管理。
可能的缺点是:
- 为 19 英寸主机架及其集线器/设备创建自定义设置和布线树。
- 网络速度可能成为瓶颈。
虽然这是由支持良好的部件(工业电源、现成产品、非供应商锁定、可更换产品)制成的自制产品,但它仍然是自定义设置,不符合您的“企业”解决方案搜索。我非常怀疑是否存在可扩展性好、独立于供应商且具有成本效益的企业解决方案。
答案2
Linux 上的事实虚拟化堆栈 (kvm/qemu + libvirt) 支持通过网络进行 USB1、2、3 重定向。因此,
- 在房间里,将所有 USB 设备插入 Linux 盒子,然后在每个盒子上运行重定向服务器
- 在运行虚拟机的 Linux 机器的房间里,您可以通过网络将这些远程设备映射到您的本地虚拟机。
这一切都可以通过编程(libvirt)或 GUI(virt-manager)完成。
- KVM 是内核端的东西,使虚拟化成为可能并且快速
- qemu 是模拟各种硬件的用户空间程序
- SPICE 是为在虚拟机内外传输键盘、鼠标、显示器和其他互连设备而定义的代码和协议,可能通过网络进行
- libvirt 是建立在上述基础上的一组工具,用于将所有内容粘合在一起并抽象化,这样您就不必处理它们之间的细节和交互。它提供了一个不错的界面(命令行或实际的编程 API)来创建 VMS、定义网络、启动/停止机器等。
- Virtual-manager 是使用 libvirt 的 GUI 工具。
这里有一个很好的指南,指导如何使用两台机器进行设置。