Docker 中的 Usbip

Usbip in Docker

  1. 我桌上有一个硬件开发工具包,通过 USB 连接到我的 Windows 笔记本电脑。开发工具包允许您通过 USB 闪存芯片。我想使用 usbip 将此设备公开到我的服务器环境。

  2. 在我的 Windows PC 上我 运行 一个带有 USBIP 服务器的虚拟机。我已经绑定了硬件开发工具包。服务器正在侦听由 Virtual Box 转发到主机(笔记本电脑)端口 7023

  3. 的端口 3240
  4. 我使用 SSH 登录我的服务器。我设置了 SSH 远程隧道,以便服务器上的端口 3240 将请求发送到笔记本电脑上的端口 7023。

总结

USBIP server port 3240 --Virtual Box--> laptop port 7023 <--SSH -R :3240:localhost:7023

在服务器上这是有效的:

sudo /usr/lib/linux-tools-4.4.0-66/usbip --tcp-port 3240 attach -r 127.0.0.1 -b 1-2
dinne@vidar:~$ lsusb
Bus 005 Device 002: ID 04f2:b39a Chicony Electronics Co., Ltd

现在在服务器上我有一些 Docker 容器 运行ning。这些容器有一个开发环境,我可以用它为硬件开发工具包编译程序。我想将编译后的应用程序闪存到开发工具包。

每个用户将在服务器上拥有 his/her 自己的开发容器和本地安装的开发工具包。所以我想避免使用 usbip 直接在服务器上连接虚拟 USB 设备。相反,如果用户可以 运行 在 Docker 容器内使用 usbip,那将是理想的。

在 Docker 容器中我尝试了这个:

sudo usbip --tcp-port 3240 list -r 192.168.96.101

Exportable USB devices
======================
 - 192.168.96.101
        1-2: Chicony Electronics Co., Ltd : unknown product (04f2:b39a)
           : /sys/devices/pci0000:00/0000:00:06.0/usb1/1-2
           : Miscellaneous Device / ? / Interface Association (ef/02/01)

sudo usbip --debug --tcp-port 3240 attach -r 192.168.96.101 -b 1-2

usbip: info: using port 3250 ("3250")
usbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/src/usbip_network.c:40:[usbip_setup_port_number] parsing port arg '3250'
usbip: info: using port 3250 ("3250")
usbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/src/usbip.c:141:[run_command] running command: `attach'
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:242:[usbip_vhci_driver_open] available ports: 7
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:71:[parse_status] port 0 status 4 speed 0 devid 0
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:72:[parse_status] socket 0 lbusid 0000000000000000
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:71:[parse_status] port 1 status 4 speed 0 devid 0
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:72:[parse_status] socket 0 lbusid 0000000000000000
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:71:[parse_status] port 2 status 4 speed 0 devid 0
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:72:[parse_status] socket 0 lbusid 0000000000000000
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:71:[parse_status] port 3 status 4 speed 0 devid 0
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:72:[parse_status] socket 0 lbusid 0000000000000000
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:71:[parse_status] port 4 status 4 speed 0 devid 0
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:72:[parse_status] socket 0 lbusid 0000000000000000
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:71:[parse_status] port 5 status 4 speed 0 devid 0
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:72:[parse_status] socket 0 lbusid 0000000000000000
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:71:[parse_status] port 6 status 4 speed 0 devid 0
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:72:[parse_status] socket 0 lbusid 0000000000000000
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:71:[parse_status] port 7 status 4 speed 0 devid 0
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:72:[parse_status] socket 0 lbusid 0000000000000000
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:105:[parse_status] exit
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:311:[usbip_vhci_attach_device2] writing: 0 3 65539 2
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:316:[usbip_vhci_attach_device2] attach attribute path: /sys/devices/platform/vhci_hcd/attach
usbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/sysfs_utils.c:17:[write_sysfs_attribute] error opening attribute /sys/devices/platform/vhci_hcd/attach
libusbip: debug: /build/linux-tools-SJqEHJ/linux-tools-3.16.7-ckt20/drivers/staging/usbip/userspace/libsrc/vhci_driver.c:320:[usbip_vhci_attach_device2] write_sysfs_attribute failed
usbip: error: import device
usbip: error: query

open("/sys/devices/platform/vhci_hcd/attach", O_WRONLY) 似乎失败了。

sudo -- sh -c "ls -al /sys/devices/platform/vhci_hcd/"
drwxr-xr-x  4 root root    0 Mar 21 22:00 .
drwxr-xr-x 19 root root    0 Mar 21 21:21 ..
--w-------  1 root root 4096 Mar 21 22:00 attach
--w-------  1 root root 4096 Mar 21 22:00 detach
lrwxrwxrwx  1 root root    0 Mar 21 22:00 driver -> ../../../bus/platform/drivers/vhci_hcd
-rw-r--r--  1 root root 4096 Mar 21 22:00 driver_override
-r--r--r--  1 root root 4096 Mar 21 22:00 modalias
drwxr-xr-x  2 root root    0 Mar 21 22:00 power
-r--r--r--  1 root root 4096 Mar 21 21:21 status
lrwxrwxrwx  1 root root    0 Mar 21 22:00 subsystem -> ../../../bus/platform
-rw-r--r--  1 root root 4096 Mar 21 21:21 uevent
drwxr-xr-x  5 root root    0 Mar 21 22:00 usb5
-rw-r--r--  1 root root 4096 Mar 21 22:00 usbip_debug

如何让 USBIP 客户端在 Docker 容器中工作?

如果我 运行 docker 与 --privileged 它似乎工作。

在 kubernetes 上遇到同样的问题。事实证明 /sys 是只读的(即使使用了 --privileged)。我通过将 /sys 添加为带有主机路径的卷来解决它(在 docker 上,它是“-v /sys:/sys”)。