我希望将连在笔记本上的鼠标键盘U盘摄像头游戏手柄等USB外设通过网络共享给实验室的电脑使用, 从而实现完全的远程办公、远程游戏. 可以使用USB/IP协议实现这个操作, 实现这个协议的软件也叫USBIP(客户端)/USBIPD(服务器端). 对于GNU/Linux系统, USBIP已经被包含在Linux内核工具中了, 但是其依赖模块默认没有加载; 对于Windows系统, 则需要分别安装服务端usbipd-win、服务端图形化界面wsl-usb-manager和客户端usbip-win2.

服务端(连接外设的笔记本)

服务端的安装

GNU/Linux系统

以Ubuntu为例.

Ubuntu系统的USBIPD和USBIP都在内核工具中, 直接安装内核工具即可:

sudo apt install linux-tools-`uname -r`

如果需要服务端程序开机自启, 可以在/etc/rc.localexit 0前加入:

/usr/bin/usbipd -D

最后记得给USBIPD使用的3240端口开放防火墙:

sudo ufw allow from 客户端电脑IP to any port 3240

Windows系统

https://github.com/dorssel/usbipd-win/releases下载对应CPU的安装包直接用默认参数安装即可. 安装过程中会自动设置防火墙和系统服务, 默认开机自启.

如果需要图形化界面, 可以下载https://github.com/nickbeth/wsl-usb-manager/releases, 这个图形界面程序是免安装的, 如果想要将它加入开始菜单, 可以在C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs中给它创建快捷方式.

服务端的使用

GNU/Linux系统

如果没有设置开机自启, 则需要先运行服务端守护程序: sudo usbipd -D.

使用sudo usbip list -l命令查找连接在服务端(笔记本)的USB设备, 记录设备的busid, 如果缺少对应设备描述, 可以通过lsusb命令查看更详细的信息.

使用sudo usbip bind -b 待分享设备的busid分享设备. 注意此步操作后无法再在笔记本(服务端)使用被分享的设备.

使用sudo usbip unbind -b 待停止分享设备的busid停止分享设备, 停止分享后就可以在笔记本(服务端)使用被分享的设备了.

Windows系统

以Windows 11为例

右键”开始”菜单打开终端管理员, 在其中键入后续命令.

使用usbipd list命令查找连接在服务端(笔记本)的USB设备, 记录设备的busid.

使用usbipd bind -b 待分享设备的busid分享设备.

使用usbipd unbind -b 待停止分享设备的busid停止分享设备.

也可以使用”wsl-usb-manager”的图形界面操作.

游戏手柄网络共享

当游戏手柄连上电脑时, Windows的Xbox组件会自动接管手柄使得游戏手柄无法再被USBIPD占用. 解决方案是使用-f参数(图形界面中的(force))强制标记手柄, 随后断开手柄与电脑的连接并重连, 使得USBIPD在手柄被Xbox组件管控前占用手柄.

即使用usbipd bind -b 待分享设备的busid -f分享设备.

客户端(实验室电脑)

客户端的安装

GNU/Linux系统

以Ubuntu为例.

安装服务端的时候客户端已经跟着安装了. 使用前需要将USBIP程序虚拟设备的驱动模块加载入内核:

sudo modprobe usbip-core
sudo modprobe vhci-hcd
sudo modprobe usbip-vudc
sudo modprobe usbip-host

可以将加载模块部分写入/etc/rc.local以达到开机自动加载的目的.

/sbin/modprobe usbip-core
/sbin/modprobe vhci-hcd
/sbin/modprobe usbip-vudc
/sbin/modprobe usbip-host

Windows系统

https://github.com/vadimgrn/usbip-win2/releases下载对应CPU的安装包直接用默认参数安装即可. 这个安装包中包含了图形界面程序.

客户端USBIP的使用

GNU/Linux系统

使用sudo usbip attach -r 服务端IP -b 服务端分享设备的busid来连接远程USB设备. 如果不知道分享设备的busid, 可以使用sudo usbip list -r 服务端IP来查看.

使用sudo usbip port查看已经连接的远程USB设备的port号.

使用sudo usbip detach -p 待断开连接的设备的port号来断开远程USB设备的连接.

Windows系统

使用usbip attach -r 服务端IP -b 服务端分享设备的busid来连接远程USB设备. 如果不知道分享设备的busid, 可以使用usbip list -r 服务端IP来查看.

使用usbip port查看已经连接的远程USB设备的port号.

使用sudo usbip detach -p 待断开连接的设备的port号来断开远程USB设备的连接.

也可以使用自带的”USBip”图形界面程序操作.



software GNU/Linux

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!