我正在寻找一种通过网络共享 USB 设备的免费方法。我有一个连接了 USB 设备的 RaspberryPi(raspbian)。我希望能够从我的 Linux 服务器接收和发送命令到这个设备。
我试过了,remserial但我无法将客户端连接到服务器。我也试过,VirtualHere但它崩溃了
你知道一些免费的解决方案吗?
编辑 :
感谢本教程,我试过了,但遇到了一些麻烦:
pi@raspberrypi /boot $ zcat /proc/config.gz |grep USBIP
CONFIG_USBIP_CORE=m
CONFIG_USBIP_VHCI_HCD=m
CONFIG_USBIP_HOST=m
# CONFIG_USBIP_DEBUG is not set
pi@raspberrypi /boot $ sudo modprobe usbip-core
pi@raspberrypi /boot $ sudo modprobe usbip-host
pi@raspberrypi /boot $ sudo usbipd -D
pi@raspberrypi /boot $ usbip list -l
Local USB devices
=================
- busid 1-1 (0424:9514)
1-1:1.0 -> hub
- busid 1-1.1 (0424:ec00)
1-1.1:1.0 -> smsc95xx
- busid 1-1.3 (0403:6010)
1-1.3:1.0 -> unknown
1-1.3:1.1 -> unknown
- busid 1-1.4 (04f2:1126)
1-1.4:1.0 -> usbhid
- busid 1-1.5 (04f2:1125)
1-1.5:1.0 -> usbhid
1-1.5:1.1 -> usbhid
pi@raspberrypi /boot $ sudo usbip --debug bind -b 1-1.3
usbip: debug: /build/linux-tools-TqR1ks/linux-tools-3.2.17/drivers/staging/usbip/userspace/src/usbip.c:134:[run_command]
running command: `bind'
usbip: debug: /build/linux-tools-TqR1ks/linux-tools-3.2.17/drivers/staging/usbip/userspace/src/usbip_bind.c:162:[unbind_other]
1-1.3:1.0 -> unknown
usbip: debug: /build/linux-tools-TqR1ks/linux-tools-3.2.17/drivers/staging/usbip/userspace/src/usbip_bind.c:162:[unbind_other]
1-1.3:1.1 -> unknown
usbip: debug: /build/linux-tools-TqR1ks/linux-tools-3.2.17/drivers/staging/usbip/userspace/src/utils.c:65:[modify_match_busid]
write "add 1-1.3" to /sys/bus/usb/drivers/usbip-host/match_busid
usbip: debug: /build/linux-tools-TqR1ks/linux-tools-3.2.17/drivers/staging/usbip/userspace/src/usbip_bind.c:101:[bind_usbip]
bind driver at 1-1.3:1.0 failed
usbip: debug: /build/linux-tools-TqR1ks/linux-tools-3.2.17/drivers/staging/usbip/userspace/src/usbip_bind.c:101:[bind_usbip]
bind driver at 1-1.3:1.1 failed
usbip: error: could not bind device to usbip-host
usbip: debug: /build/linux-tools-TqR1ks/linux-tools-3.2.17/drivers/staging/usbip/userspace/src/utils.c:65:[modify_match_busid]
write "del 1-1.3" to /sys/bus/usb/drivers/usbip-host/match_busid
pi@raspberrypi /boot $ sudo usbip --debug bind -b 1-1.3:1.1
usbip: debug: /build/linux-tools-TqR1ks/linux-tools-3.2.17/drivers/staging/usbip/userspace/src/usbip.c:134:[run_command]
running command: `bind'
usbip: debug: /build/linux-tools-TqR1ks/linux-tools-3.2.17/drivers/staging/usbip/userspace/src/usbip_bind.c:143:[unbind_other]
problem getting device attributes: No such file or directory
usbip: error: could not unbind driver from device on busid 1-1.3:1.1
pi@raspberrypi /boot $
Run Code Online (Sandbox Code Playgroud)
会是什么呢 ?
您可以使用此软件usbip,这是如何设置该软件并在服务器和客户端上使用它
在本教程中,使用server server1.example.com with IP
192.168.0.100和client client1.example.com with IP 192.168.0.101,两者都运行 Ubuntu。这些设置可能对您来说有所不同,因此您必须在适当的情况下替换它们。
另外,本教程中使用的帐户是 the root,因此如果命令不起作用,请使用或在命令之前root使用sudo
我们可以按如下方式安装usbip:
apt-get install usbip
Run Code Online (Sandbox Code Playgroud)
然后我们加载 usbip 内核模块:
modprobe usbip
modprobe usbip_common_mod
Run Code Online (Sandbox Code Playgroud)
要检查它们是否确实已加载,请运行:
lsmod | grep usbip
Run Code Online (Sandbox Code Playgroud)
输出应该与此类似:
root@server1:~# lsmod | grep usbip
usbip 15124 0
usbip_common_mod 13605 1 usbip
root@server1:~#
Run Code Online (Sandbox Code Playgroud)
为了确保每次启动系统时都会自动加载这两个模块,您可以将它们添加到 /etc/modules 中:
vi /etc/modules
[...]
usbip
usbip_common_mod
Run Code Online (Sandbox Code Playgroud)
现在我们可以启动 usbip 守护进程:
root@server1:~# usbipd -D
Bind usbip.ko to a usb device to be exportable!
Run Code Online (Sandbox Code Playgroud)
现在连接您想要导出到服务器的 USB 设备 - 我在这里使用 SanDisk USB 闪存驱动器。
执行命令lsusb
查找相应的供应商/设备 ID,其格式为:
Bus XXX Device YYY: ID VendorID:DeviceID
Run Code Online (Sandbox Code Playgroud)
我的服务器上的输出如下:
root@server1:~# lsusb
Bus 001 Device 002: ID 0781:5151 SanDisk Corp. Cruzer Micro Flash Drive
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Run Code Online (Sandbox Code Playgroud)
我的 SanDisk USB 闪存驱动器的供应商/设备 ID 是 0781:5151。
现在运行
usbip_bind_driver --list
root@server1:~# usbip_bind_driver --list
List USB devices
- busid 1-1 (0781:5151)
1-1:1.0 -> usb-storage
Run Code Online (Sandbox Code Playgroud)
如您所见,我的 SanDisk USB 闪存驱动器的供应商/设备 ID (0781:5151) 对应于 BUSID 1-1。我们需要它BUSID来将 USB 设备连接到服务器:
root@server1:~# usbip_bind_driver --usbip 1-1
** (process:765): DEBUG: 1-1:1.0 -> usb-storage
** (process:765): DEBUG: unbinding interface
** (process:765): DEBUG: write "add 1-1" to /sys/bus/usb/drivers/usbip/match_busid
** Message: bind 1-1 to usbip, complete!
Run Code Online (Sandbox Code Playgroud)
就这样,我们现在可以在远程 usbip 客户端上使用 SanDisk USB 闪存驱动器了。
顺便说一句,如果你跑...
netstat -tap
Run Code Online (Sandbox Code Playgroud)
...您应该看到 usbip 守护进程正在侦听port 3240
因此,请确保此端口未被防火墙阻止:
root@server1:~# netstat -tap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:ssh *:* LISTEN 537/sshd
tcp 0 0 *:3240 *:* LISTEN 762/usbipd
tcp 0 52 server1.example.com:ssh 192.168.0.199:4024 ESTABLISHED 667/0
tcp6 0 0 [::]:ssh [::]:* LISTEN 537/sshd
Run Code Online (Sandbox Code Playgroud)
我们还需要在客户端安装 usbip:
sudo apt-get install usbip
Run Code Online (Sandbox Code Playgroud)
然后我们加载vhci-hcd内核模块:
modprobe vhci-hcd
Run Code Online (Sandbox Code Playgroud)
要检查它是否确实已加载,请运行:
root@client1:~# lsmod | grep vhci_hcd
vhci_hcd 19800 0
usbip_common_mod 13605 1 vhci_hcd
Run Code Online (Sandbox Code Playgroud)
为了确保每次启动系统时都会自动加载该模块,您可以将其添加到/etc/modules:
vi /etc/modules
[...]
vhci-hcd
Run Code Online (Sandbox Code Playgroud)
现在连接到 usbip 服务器并获取可用 USB 设备的列表:
usbip -l 192.168.0.100
(192.168.0.100 is the IP address of the usbip server.)
Run Code Online (Sandbox Code Playgroud)
您应该在输出中找到 SanDisk USB 闪存驱动器(BUSID 1-1):
root@client1:~# usbip -l 192.168.0.100
- 192.168.0.100
1-1: SanDisk Corp. : Cruzer Micro Flash Drive (0781:5151)
: /sys/devices/pci0000:00/0000:00:07.2/usb1/1-1
: (Defined at Interface level) (00/00/00)
: 0 - Mass Storage / SCSI / Bulk (Zip) (08/06/50)
Run Code Online (Sandbox Code Playgroud)
要将设备附加到客户端,请运行:
root@client1:~# usbip -a 192.168.0.100 1-1
8 ports available
port 0 attached
Run Code Online (Sandbox Code Playgroud)
现在运行lsusb,您应该在客户端的输出中找到远程 USB 设备:
root@client1:~# lsusb
Bus 001 Device 002: ID 0781:5151 SanDisk Corp. Cruzer Micro 256/512MB Flash Drive
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Run Code Online (Sandbox Code Playgroud)
您现在可以像使用本地 USB 设备一样使用远程 USB 设备(例如安装、格式化、写入、读取等)。
远程 USB 设备可以按如下方式分离:
客户1:
跑步...
usbip --port
Run Code Online (Sandbox Code Playgroud)
...找出远程 USB 设备在客户端上使用的端口 - 在本例中为端口 00:
root@client1:~# usbip --port
8 ports available
Port 00: <Port in Use> at High Speed(480Mbps)
SanDisk Corp. : Cruzer Micro 256/512MB Flash Drive (0781:5151)
1-1 -> usbip://192.168.0.100:3240/1-1 (remote devid 00010002 (bus/dev 001/002))
1-1:1.0 used by usb-storage
/sys/class/bsg/1:0:0:0/device
/sys/class/scsi_device/1:0:0:0/device
/sys/class/scsi_disk/1:0:0:0/device
/sys/class/scsi_host/host1/device
/sys/class/usb_endpoint/usbdev1.4_ep02/device
/sys/class/usb_endpoint/usbdev1.4_ep81/device
/sys/block/sdb/device
Port 01: <Port Available>
Port 02: <Port Available>
Port 03: <Port Available>
Port 04: <Port Available>
Port 05: <Port Available>
Port 06: <Port Available>
Port 07: <Port Available>
Run Code Online (Sandbox Code Playgroud)
我们需要端口号来分离设备:
usbip -d 00
root@client1:~# usbip -d 00
8 ports available
port 0 detached
Run Code Online (Sandbox Code Playgroud)
在服务器上,我们使用 将BUSID (1-1)USB 设备绑定到本地系统(--other 开关将设备绑定到本地系统,以便它不再通过网络可用):
服务器1:
usbip_bind_driver --other 1-1
root@server1:~# usbip_bind_driver --other 1-1
** (process:7333): DEBUG: write "del 1-1" to /sys/bus/usb/drivers/usbip/match_busid
** Message: bind 1-1 to other drivers than usbip, complete!
Run Code Online (Sandbox Code Playgroud)
现在返回客户端检查远程USB设备是否仍然可用:
客户1:
如果一切顺利,就不应该再列出了:
root@client1:~# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21056 次 |
| 最近记录: |