我成功地将 Raspberry Pi(运行 Raspbian)的 USB 端口上的设备共享到本地服务器上的 Ubuntu 虚拟机,使用通用协议。
以下是我正在运行的命令列表:
在服务器端(树莓派):
modprobe usb-core
modprobe usb-host
sudo usbipd -D
sudo usbip --debug bind -b 1-1.2
在客户端(Ubuntu 服务器):
modprobe vici-hcd
sudo usbip attach 192.168.100.100 1-1.2
它运行良好,但每次本地网络出现问题时,我都需要在两端重新执行所有流程。这使得它在生产模式下使用起来非常困难,因为我希望这个系统可靠且有弹性。
我将模块添加到/etc/模块让它们在启动时启动(不确定是否有效),但在这种情况下,问题发生在没有任何重启的情况下。
我正在编写两个脚本来在双方定期运行这些命令,但考虑到服务器必须在客户端连接之前进行绑定,这仍然不是一个理想的解决方案。
我做错了吗?有没有人找到一种可靠的方法让 usbip 正常工作,而不需要一直重新配置所有内容?
答案1
usbip 服务器上有两个步骤,usbip 客户端上也有两个步骤。两者的过程相同,只是名称略有不同。
步骤1在服务器和客户端上:在启动时加载加载模块。
这将替换这些sudo modprobe
线条。
看在启动时运行 modprobe以获得详细的解释和替代方案。
编辑/etc/modules
(当然使用 sudo),并添加该机器的模块名称。
例子:
$ sudo nano /etc/modules
usb-core
usb-host
现在这些模块将在启动时添加(modprobe)。
第2步在服务器和客户端上:创建一个 systemd 服务文件,以便在 usbip 客户端和服务器上轻松控制、重置和启动。
这个比较复杂。它需要理解 systemd 和基本的 shell 命令。
etc/systemd/system/usbipd.service
这是您必须创建的 usbip 服务器的示例 systemd文件:
[Unit]
Description=usbip host daemon
After=network.target
[Service]
Type=forking
ExecStart=/usr/sbin/usbipd -D
ExecStartPost=/bin/sh -c "/usr/sbin/usbip bind --$(/usr/sbin/usbip list -p -l | grep '#usbid=10c4:8a2a#' | cut '-d#' -f1)" // Edit this line to match your USB device
ExecStop=/bin/sh -c "/usr/lib/linux-tools/$(uname -r)/usbip detach --port=$(/usr/lib/linux-tools/$(uname -r)/usbip port | grep '<Port in Use>' | sed -E 's/^Port ([0-9][0-9]).*/\1/')"
[Install]
WantedBy=multi-user.target
您可以看到 .service 文件在启动时以服务器(守护进程)模式运行 usbip,并在停止时终止服务器。这意味着您可以使用常规的 systemctl 命令来运行和查询服务器:
systemctl status usbipd.service // status and troubleshooting
sudo systemctl start usbipd.service // start
sudo systemctl stop usbipd.service // stop
sudo systemctl restart usbipd.service // stop, then start again
sudo systemctl enable usbipd.service // start at boot forever from now on
sudo systemctl enable usbipd.service // leave dormant at boot forever from now on
现在我可以让 usbipd 在服务器启动时自动启动,并且可以使用普通的 ssh 查询它的状态。
客户端的相当相似的 systemd 文件留给学生作为练习。