usbip--ubuntu 16.04(USB局域网共享)

usbip的目的是为了开发一个在局域网内共享的USB设备,也就是说你可以直接访问局域网内其他计算机的USB设备。

下面我们看一下如何在ubuntu 16.04跟树莓派(raspberry pi)以及树莓派之间实现USB设备在局域网的共享。

树莓派端配置为服务端,我们把USB设备接入到树莓派上,服务端的树莓派上执行如下操作:

# 升级内核以及附属驱动模块
$ sudo rpi-update

$ sudo apt-get install usbip

# 加载驱动模块
$ sudo modprobe usbip-core

$ sudo modprobe vhci-hcd

$ sudo modprobe usbip_host

# 打开监听服务接收来自其他机器的请求
$ sudo usbipd -D

# 列出本机的USB设备列表
$ sudo usbip list -l

# 通知底层驱动,绑定设备,远端可看到我们绑定过的设备,我们的设备ID为1-1.3
$ sudo usbip --debug bind -b 1-1.3

客户端的树莓派或者ubuntu 16.04,执行如下操作查看以及操作服务端的设备。

树莓派

$ sudo apt-get install usbip

# 'sudo usbip version' usbip (usbip-utils 2.0) raspberry pi
# 服务器IP地址 192.168.1.201 ,列出服务端的设备列表
$ sudo usbip list -r 192.168.1.201 --debug

# 服务器IP地址 192.168.1.201 ,设备ID 1-1.3
$ sudo usbip attach -r 192.168.1.201 -b 1-1.3

ubuntu 16.04

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

# 'sudo /usr/lib/linux-tools/`uname -r`/usbip version' usbip (usbip-utils 2.0) raspberry pi
# 服务器IP地址 192.168.1.201 ,列出服务端的设备列表
$ sudo /usr/lib/linux-tools/`uname -r`/usbip list -r 192.168.1.201 --debug

# 服务器IP地址 192.168.1.201 ,设备ID 1-1.3
$ sudo /usr/lib/linux-tools/`uname -r`/usbip attach -r 192.168.1.201 -b 1-1.3

出错信息

如果出错信息如下:

pi@raspberrypi:~ $ sudo usbip port
usbip: error: failed to open /usr/share/hwdata//usb.ids
libusbip: error: udev_device_new_from_subsystem_sysname failed
usbip: error: open vhci_driver
usbip: error: list imported devices

出错的原因为内核驱动没有正确加载,解决方法为:

# 加载驱动模块 
$ sudo modprobe usbip-core 

$ sudo modprobe vhci-hcd

如果出错信息如下(比如ubuntu 16.04):

$ sudo usbip --list 192.168.1.201 --debug
usbip dbg: usbip_network.c: 221 (tcp_connect ) trying 192.168.1.201 port 3240

usbip dbg: usbip_network.c: 241 (tcp_connect ) connected to 192.168.1.201:3240
- 192.168.1.201
usbip err: usbip_network.c: 119 (usbip_recv_op_common) recv op_common, -1
usbip err: vhci_attach.c: 202 (query_exported_devices) recv op_common
usbip err: vhci_attach.c: 417 (show_exported_devices) query

此时查看软件版本,可以看到如下:

$ sudo usbip -v
usbip 0.1.7 ($Id: vhci_attach.c 42 2007-09-07 12:07:51Z hirofuchi $)

这个原因是由于软件安装的是很早的一个版本,无法跟现在最新的版本进行通信。

这个驱动很早就以及整合进入了Linux内核,控制软件也是内核提供。使用如下命令安装跟当前内核匹配的版本:

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

$ sudo /usr/lib/linux-tools/`uname -r`/usbip list -r 192.168.1.201 --debug

如果出错信息如下:

$ sudo usbip --debug bind -b 1-1.3
usbip: debug: usbip.c:141:[run_command] running command: `bind'
usbip: debug: sysfs_utils.c:18:[write_sysfs_attribute] error opening attribute /sys/bus/usb/drivers/usbip-host/match_busid
usbip: debug: utils.c:50:[modify_match_busid] failed to write match_busid: No such file or directory
usbip: error: unable to bind device on 1-1.3

原因为usbip_host.ko这个内核驱动没有加载,使用如下命令加载驱动:

$ sudo modprobe usbip_host

参考链接


发布者

《usbip--ubuntu 16.04(USB局域网共享)》上有7条评论

  1. ubuntu1604做服务器端,另一台ubuntu1604做客户端,但是从客户端拉服务器端的usb列表等,都是tcp连接失败。而使用tcpping能ping通。
    请问大佬遇到过吗

回复 M 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注