驯服 USB/IP

通过本地网络将 USB 设备连接到远程 PC 的任务经常出现。 切下,列出了我在这个方向上的搜索历史,以及基于开源项目的现成解决方案的路径 优盘/网络 描述了不同的人在这条道路上精心设置的障碍,以及绕过这些障碍的方法。

第一部分,历史

如果机器是虚拟的——这一切都很容易。 从主机到虚拟机的 USB 转发功能出现在 VMWare 4.1 中。 但就我而言,安全密钥(可识别为 WIBU-KEY)必须在不同时间连接到不同的机器,而不仅仅是虚拟机器。
在遥远的 2009 年的第一轮搜索让我找到了一块铁,叫做 趋势网 TU2-NU4
优点:

  • 有时它甚至有效

缺点:

  • 并不总是有效。 假设Guardant Stealth II保护锁没有通过它启动,提示“device cannot be started”。
  • 管理软件(读取 - 安装和卸载 USB 设备)非常可悲。 命令行开关,自动化 - 没有,没听说过。 一切都是手工完成的。 恶梦。
  • 控制软件通过广播在网络中搜索铁片本身,因此只能在一个广播网段内工作。 您不能手动指定这块铁的 IP 地址。 其他子网中的一块铁? 那你就有问题了。
  • 开发人员在设备上得分,发送错误报告是没有用的。

第二轮发生在不远的时间,把我带到了这篇文章的主题—— USB/IP项目. 以开放的态度吸引人,尤其是自从 ReactOS的 他们为 Windows 签署了一个驱动程序,所以现在一切都可以在 x64 上运行,没有任何像测试模式这样的拐杖。 为此非常感谢 ReactOS 团队! 一切听起来都很美好,让我们试着感受一下,真的是这样吗? 不幸的是,该项目本身也被放弃了,你不能指望得到支持——但我们的项目没有消失,源就在那里,我们会解决的!

第二部分,server-linux

通过网络共享 USB 设备的 USB/IP 服务器只能在基于 Linux 的操作系统上设置。 好吧,Linux就是Linux,我们在虚拟机上以最低配置安装Debian 8,标准手部动作:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip

安顿下来。 此外,互联网建议您需要下载 usbip 模块,但是 - 你好,第一个耙子。 没有这样的模块。 这一切都是因为网络上的大多数手册都引用了较旧的分支 0.1.x,而在最新的 0.2.0 中,usbip 模块具有不同的名称。

因此:

sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip

好吧,让我们将以下行添加到 /etc/modules 以在系统启动时自动加载它们:

usbip-core
usbip-host
vhci-hcd

让我们启动usbip服务器:

sudo usbipd -D

此外,普遍的想法告诉我们,usbip 带有允许我们管理服务器的脚本 - 显示它将通过网络共享的设备、查看状态等。 这里还有另一个园林工具在等着我们——0.2.x 分支中的这些脚本再次被重命名。 您可以使用以下命令获取命令列表

sudo usbip

阅读命令描述后,很明显,为了共享所需的 USB 设备,usbip 想要知道它的总线 ID。 亲爱的观众,第三个佣金在竞技场上:给我们的巴士 ID 的lsusb (这似乎是最明显的方式)——它不适合她! 事实上,usbip 会忽略 USB 集线器等硬件。 因此,我们将使用内置命令:

user@usb-server:~$ sudo usbip list -l
 - busid 1-1 (064f:0bd7)
   WIBU-Systems AG : BOX/U (064f:0bd7)

注意:在后面的列表中,我将使用我的特定 USB 密钥的示例来描述所有内容。 您的硬件名称和 VID:PID 对可能会有所不同。 我的叫 Wibu-Systems AG:BOX/U,VID 064F,PID 0BD7。

现在我们可以共享我们的设备了:

user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete

干杯,同志们!

user@usb-server:~$ sudo usbip list -r localhost
Exportable USB devices
======================
 - localhost
        1-1: WIBU-Systems AG : BOX/U (064f:0bd7)
           : /sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
           : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/ff)

三声欢呼,同志们! 服务器通过网络共享了这块铁片,我们可以连上了! 它仍然只是将 usbip 守护进程的自动启动添加到 /etc/rc.local

usbipd -D

第三部分,客户端和混淆

我尝试立即通过网络将共享设备连接到同一台服务器上的 Debian 机器,一切都连接正常:

sudo usbip attach --remote=localhost --busid=1-1

让我们转到 Windows。 在我的例子中,它是 Windows Server 2008R2 标准版。 官方指南要求您先安装驱动程序。 Windows 客户端附带的自述文件中完美地描述了该过程,我们按照编写的内容进行操作,一切正常。 在 XP 上它也可以毫无问题地工作。

解压客户端后,我们尝试挂载我们的密钥:

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err: usbip_windows.c: 756 (query_interface0) recv op_common
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

哦哦。 出了些问题。 我们使用谷歌的技能。 零星提到常量有问题;在服务器部分,开发人员在切换到 0.2.0 版本时更改了协议版本,但他们忘记在 Win 客户端中执行此操作。 建议的解决方案是更改源代码中的常量并重建客户端。

但我真的不想为了这个过程而下载 Visual Studio。 但我有一个很好的老 Hiew。 在源代码中,常量被声明为双字。 让我们在文件中查找 0x00000106,将其替换为 0x00000111。 请记住,字节顺序是颠倒的。 结果是两次匹配,patch:

[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11

诶诶诶……对!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1

这本可以结束演示,但音乐并没有播放很长时间。 重启服务器后,发现客户端的设备没有挂载!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

就是这样。 即使是无所不知的谷歌也无法为我回答这个问题。 同时,用于显示服务器上可用设备的命令非常正确地显示 - 这就是密钥,您可以安装它。 我尝试从 Linux 下挂载 - 它有效! 如果现在在 Windows 下尝试? 哦操 - 它有效!

最后的抽成:服务器代码中没有添加一些东西。 共享设备时,它不会从中读取 USB 描述符的数量。 当从 Linux 下安装设备时,此字段将被填充。 不幸的是,我熟悉 Linux 下的“make && make install”级别的开发。 因此,这个问题是通过一个相当肮脏的 hack 解决的——添加到 /etc/rc.local

usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00

最终部分

经过一些摆弄后,它起作用了。 已经达到了预期的效果,现在密钥可以挂载到任何一台PC(当然也可以卸载),包括广播网段之外。 如果需要,可以使用 shell 脚本来完成。 什么是好的 - 乐趣是完全免费的。
我希望我的经历能帮助 habrazithiteli 绕过印在我额头上的耙子。 感谢您的关注!

来源: habr.com

添加评论