แบ่งปัน USB ไดรฟ์ผ่านเครือข่าย


8

ฉันกำลังมองหาวิธีฟรีในการแบ่งปันอุปกรณ์ USB ผ่านเครือข่าย ฉันได้ RaspberryPi (raspbian) ซึ่งมีอุปกรณ์ USB เชื่อมต่ออยู่ ฉันต้องการที่จะรับและส่งคำสั่งไปยังอุปกรณ์นี้จากเซิร์ฟเวอร์ 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 $

มันจะเป็นอะไร?

คำตอบ:


3

คุณสามารถใช้ซอฟต์แวร์usbipนี้และนี่คือวิธีการติดตั้งซอฟต์แวร์และใช้งานได้ทั้งบนเซิร์ฟเวอร์และฝั่งไคลเอ็นต์

หมายเหตุ:

  1. ในบทช่วยสอนนี้ใช้server server1.example.com with IP 192.168.0.100และclient client1.example.com with IP 192.168.0.101ทั้งสองที่ใช้งาน Ubuntu การตั้งค่าเหล่านี้อาจแตกต่างกันสำหรับคุณดังนั้นคุณต้องแทนที่พวกเขาตามความเหมาะสม

  2. นอกจากนี้บัญชีที่ใช้ในบทช่วยสอนนี้คือrootถ้าหากคำสั่งไม่ทำงานให้ใช้rootหรือใช้sudoก่อนคำสั่ง

การติดตั้งและใช้ USB / IP บนเซิร์ฟเวอร์

เราสามารถติดตั้ง usbip ได้ดังต่อไปนี้:

apt-get install usbip

หลังจากนั้นเราโหลดโมดูลเคอร์เนล usbip:

modprobe usbip

modprobe usbip_common_mod

หากต้องการตรวจสอบว่าโหลดจริงหรือไม่ให้เรียกใช้:

lsmod | grep usbip

ผลลัพธ์ควรคล้ายกับอันนี้:

root@server1:~# lsmod | grep usbip
usbip                  15124  0
usbip_common_mod       13605  1 usbip
root@server1:~#

เพื่อให้แน่ใจว่าโมดูลทั้งสองโหลดโดยอัตโนมัติเมื่อใดก็ตามที่คุณบูตระบบคุณสามารถเพิ่มโมดูลเหล่านั้นไปยัง / etc / modules:

vi /etc/modules

[...]
usbip
usbip_common_mod

ตอนนี้เราสามารถเริ่มต้น usbip daemon:

root@server1:~# usbipd -D
Bind usbip.ko to a usb device to be exportable!

ตอนนี้ต่ออุปกรณ์ USB ที่คุณต้องการส่งออกไปยังเซิร์ฟเวอร์ - ฉันใช้แฟลชไดรฟ์ SanDisk USB ที่นี่

ดำเนินการคำสั่ง lsusb

เพื่อค้นหา ID ผู้ขาย / อุปกรณ์ที่เกี่ยวข้องซึ่งอยู่ในรูปแบบของ:

Bus XXX Device YYY: ID VendorID:DeviceID

ผลลัพธ์บนเซิร์ฟเวอร์ของฉันเป็นดังนี้:

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

รหัสผู้ขาย / อุปกรณ์ของแฟลชไดรฟ์ SanDisk USB ของฉันคือ 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

อย่างที่คุณเห็นรหัสผู้ขาย / อุปกรณ์ของแฟลชไดรฟ์ SanDisk USB ของฉัน (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!

เพียงเท่านี้เราสามารถใช้แฟลชไดรฟ์ SanDisk USB บนไคลเอนต์ usbip ระยะไกลได้แล้ว

BTW ถ้าคุณวิ่ง ...

netstat -tap

... คุณควรเห็นว่า usbip daemon กำลังฟังอยู่ 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

การติดตั้งและใช้งาน USB / IP บนไคลเอนต์

เราจำเป็นต้องติดตั้ง usbip บนไคลเอนต์เช่นกัน:

sudo apt-get install usbip

หลังจากนั้นเราโหลดvhci-hcdโมดูลเคอร์เนล:

modprobe vhci-hcd

หากต้องการตรวจสอบว่าโหลดจริงหรือไม่ให้เรียกใช้:

root@client1:~# lsmod | grep vhci_hcd
vhci_hcd               19800  0
usbip_common_mod       13605  1 vhci_hcd

เพื่อให้แน่ใจว่าโมดูลจะถูกโหลดโดยอัตโนมัติทุกครั้งที่คุณบูตระบบคุณสามารถเพิ่มลงใน/etc/modules:

vi /etc/modules

[...]
vhci-hcd

ตอนนี้เชื่อมต่อกับเซิร์ฟเวอร์ usbip และรับรายการอุปกรณ์ USB ที่มีอยู่:

    usbip -l 192.168.0.100
(192.168.0.100 is the IP address of the usbip server.)

คุณควรค้นหาแฟลชไดรฟ์ 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)

ในการแนบอุปกรณ์นั้นไปยังไคลเอนต์ให้เรียกใช้:

root@client1:~# usbip -a 192.168.0.100 1-1
8 ports available
port 0 attached

ตอนนี้ทำงาน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

ตอนนี้คุณสามารถใช้อุปกรณ์ USB ระยะไกลได้ราวกับว่าเป็นอุปกรณ์ USB ในตัวเครื่อง (เช่นติดตั้งจัดรูปแบบเขียนเขียนอ่านแบบฟอร์ม ฯลฯ )

การถอดอุปกรณ์ USB ระยะไกล

อุปกรณ์ USB ระยะไกลสามารถถอดแยกได้ดังนี้:

client1:

วิ่ง...

usbip --port

... เพื่อค้นหาพอร์ตที่อุปกรณ์ 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>

เราต้องการหมายเลขพอร์ตเพื่อถอดอุปกรณ์:

usbip -d 00

root@client1:~# usbip -d 00
8 ports available

port 0 detached

บนเซิร์ฟเวอร์เราใช้BUSID (1-1)เพื่อผูกอุปกรณ์ USB กับระบบโลคัล (สวิตช์ - ผูกอุปกรณ์กับระบบภายในเพื่อไม่ให้ใช้งานผ่านเครือข่ายได้อีกต่อไป):

server1:

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!

ตอนนี้กลับไปที่ไคลเอนต์และตรวจสอบว่าอุปกรณ์ USB ระยะไกลยังคงมีอยู่:

client1:

หากทุกอย่างเป็นไปด้วยดีไม่ควรอยู่ในรายการอีกต่อไป:

root@client1:~# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 

การเชื่อมโยง

http://usbip.sourceforge.net

แหล่งที่มาของการสอน (ฝั่งเซิร์ฟเวอร์)

แหล่งที่มาของบทช่วยสอน (ฝั่งไคลเอ็นต์)


หมายเหตุสำหรับผู้ใช้ Ubuntu Trusty (14.04): คุณจะต้องใช้เคอร์เนล backported จาก Utopic หรือใหม่กว่าและซอกับไบนารี ดูข้อมูลเพิ่มเติมbugs.launchpad.net/ubuntu/+source/usbip/+bug/898003 เวอร์ชัน Ubuntu ที่เก่ากว่าที่รองรับมีข้อบกพร่องและข้อบกพร่องพร้อมกับ usbip ที่ไม่ทำงาน
gertvdijk

ตรวจสอบคำตอบนี้ก่อนใช้: askubuntu.com/a/647071/187689
iman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.