ฝึกฝน USB/IP

งานในการเชื่อมต่ออุปกรณ์ USB กับพีซีระยะไกลผ่านเครือข่ายท้องถิ่นเกิดขึ้นเป็นประจำ ภายใต้การตัด ประวัติการค้นหาของฉันในทิศทางนี้ถูกกำหนดไว้ และเส้นทางไปยังโซลูชันสำเร็จรูปตามโครงการโอเพ่นซอร์ส ยูเอสบี/ไอพี พร้อมบรรยายถึงอุปสรรคต่างๆ ที่ผู้คนกำหนดไว้บนเส้นทางนี้อย่างรอบคอบ ตลอดจนวิธีหลีกเลี่ยงอุปสรรคเหล่านั้น

ส่วนที่หนึ่ง ประวัติศาสตร์

หากเครื่องเป็นเสมือน - ทั้งหมดนี้เป็นเรื่องง่าย การทำงานของการส่งต่อ USB จากโฮสต์ไปยังเครื่องเสมือนปรากฏใน VMWare 4.1 แต่ในกรณีของฉัน คีย์ความปลอดภัยซึ่งรู้จักในชื่อ WIBU-KEY จะต้องเชื่อมต่อกับเครื่องต่างๆ ในเวลาต่างๆ กัน ไม่ใช่เฉพาะเครื่องเสมือนเท่านั้น
การค้นหารอบแรกในปี 2009 ที่ห่างไกลทำให้ฉันพบชิ้นส่วนเหล็กที่เรียกว่า เทรนด์เน็ต TU2-NU4
จุดเด่น:

  • บางครั้งมันก็ใช้งานได้

จุดด้อย:

  • ไม่ได้ผลเสมอไป สมมติว่าคีย์ป้องกัน Guardant Stealth II ไม่เริ่มทำงานโดยระบุข้อผิดพลาดว่า "ไม่สามารถเริ่มอุปกรณ์ได้"
  • ซอฟต์แวร์การจัดการ (อ่าน - ติดตั้งและยกเลิกการต่อเชื่อมอุปกรณ์ USB) เป็นสิ่งที่น่าสมเพชอย่างยิ่ง สวิตช์บรรทัดคำสั่ง ระบบอัตโนมัติ - ไม่ ไม่เคยได้ยิน ทุกอย่างเป็นเพียงด้วยมือ ฝันร้าย
  • ซอฟต์แวร์ควบคุมจะค้นหาชิ้นส่วนของเหล็กในเครือข่ายโดยการแพร่สัญญาณ ดังนั้นจึงใช้งานได้เฉพาะภายในส่วนเครือข่ายการแพร่ภาพเดียวเท่านั้น คุณไม่สามารถระบุที่อยู่ IP ของชิ้นส่วนเหล็กด้วยมือได้ ชิ้นส่วนของเหล็กในเครือข่ายย่อยอื่น ๆ ? แล้วคุณมีปัญหา
  • นักพัฒนาให้คะแนนบนอุปกรณ์ มันไม่มีประโยชน์ที่จะส่งรายงานข้อบกพร่อง

รอบที่สองเกิดขึ้นในช่วงเวลาไม่ไกลนัก และนำฉันไปสู่หัวข้อของบทความ - โครงการ USB/IP. ดึงดูดด้วยความเปิดกว้างโดยเฉพาะอย่างยิ่งตั้งแต่พวกที่มาจาก ReactOS พวกเขาลงไดรเวอร์สำหรับ Windows ดังนั้นตอนนี้ทุกอย่างจึงทำงานได้แม้บน x64 โดยไม่มีไม้ค้ำเช่นโหมดทดสอบ ขอบคุณมากสำหรับทีม ReactOS! ฟังดูสวยงามไปหมด ลองมาสัมผัส จริงไหม? น่าเสียดายที่ตัวโปรเจกต์เองก็ถูกทิ้งร้างเช่นกัน และคุณไม่สามารถพึ่งพาการสนับสนุนได้ - แต่ที่ของเราไม่ได้หายไป แหล่งที่มาอยู่ที่นั่น เราจะหามันให้เจอ!

ส่วนที่สอง เซิร์ฟเวอร์ลินุกซ์

เซิร์ฟเวอร์ USB/IP ที่แชร์อุปกรณ์ USB ผ่านเครือข่ายสามารถตั้งค่าได้บนระบบปฏิบัติการที่ใช้ Linux เท่านั้น Linux ก็คือ Linux เราติดตั้ง Debian 8 บนเครื่องเสมือนในการกำหนดค่าขั้นต่ำ การเคลื่อนไหวของมือมาตรฐาน:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip

ตัดสิน นอกจากนี้อินเทอร์เน็ตแนะนำว่าคุณจะต้องดาวน์โหลดโมดูล usbip แต่ - สวัสดี คราดแรก ไม่มีโมดูลดังกล่าว และทั้งหมดเป็นเพราะคู่มือส่วนใหญ่ในเครือข่ายอ้างถึงสาขาที่เก่ากว่า 0.1.x และใน 0.2.0 ล่าสุดโมดูล usbip มีชื่อต่างกัน

ดังนั้น:

sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip

เรามาเพิ่มบรรทัดต่อไปนี้ใน /etc/modules เพื่อโหลดบรรทัดเหล่านี้โดยอัตโนมัติเมื่อเริ่มต้นระบบ:

usbip-core
usbip-host
vhci-hcd

เริ่มเซิร์ฟเวอร์ usbip กัน:

sudo usbipd -D

นอกจากนี้ แนวคิดสากลยังบอกเราว่า usbip มาพร้อมกับสคริปต์ที่ช่วยให้เราสามารถจัดการเซิร์ฟเวอร์ - แสดงอุปกรณ์ที่จะแชร์ผ่านเครือข่าย ดูสถานะ และอื่นๆ เครื่องมือทำสวนอีกอันรอเราอยู่ - สคริปต์เหล่านี้ในสาขา 0.2.x ได้รับการเปลี่ยนชื่ออีกครั้ง คุณสามารถรับรายการคำสั่งด้วย

sudo usbip

หลังจากอ่านคำอธิบายของคำสั่งแล้ว จะเห็นได้ชัดว่าเพื่อแบ่งปันอุปกรณ์ USB ที่จำเป็น usbip ต้องการทราบ Bus ID ผู้ชมที่รัก เรคหมายเลขสามอยู่ในอารีน่า: Bus ID ที่จะให้เรา lsusb (ดูเหมือนจะเป็นวิธีที่ชัดเจนที่สุด) - มันไม่เหมาะกับเธอ! ความจริงก็คือ usbip ไม่สนใจฮาร์ดแวร์เช่นฮับ USB ดังนั้นเราจะใช้คำสั่งในตัว:

user@usb-server:~$ sudo usbip list -l
 - busid 1-1 (064f:0bd7)
   WIBU-Systems AG : BOX/U (064f:0bd7)

หมายเหตุ: ต่อไปนี้ในรายการ ฉันจะอธิบายทุกอย่างโดยใช้ตัวอย่างคีย์ USB เฉพาะของฉัน ชื่อฮาร์ดแวร์และคู่ VID:PID ของคุณอาจแตกต่างกัน เหมืองชื่อ Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7

ตอนนี้เราสามารถแบ่งปันอุปกรณ์ของเรา:

user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete

ไชโยสหาย!

user@usb-server:~$ sudo usbip list -r localhost
Exportable USB devices
======================
 - localhost
        1-1: WIBU-Systems AG : BOX/U (064f:0bd7)
           : /sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
           : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/ff)

ไชโยสามสหาย! เซิร์ฟเวอร์แบ่งปันชิ้นส่วนเหล็กผ่านเครือข่าย และเราสามารถเชื่อมต่อได้! ยังคงเป็นเพียงการเพิ่ม autostart ของ usbip daemon ใน /etc/rc.local

usbipd -D

ส่วนที่สาม ฝั่งไคลเอ็นต์และความสับสน

ฉันลองเชื่อมต่ออุปกรณ์ที่ใช้ร่วมกันผ่านเครือข่ายกับเครื่อง Debian บนเซิร์ฟเวอร์เดียวกันทันที และทุกอย่างก็เชื่อมต่อได้ดี:

sudo usbip attach --remote=localhost --busid=1-1

ไปที่ Windows กันเถอะ ในกรณีของฉันคือ Windows Server 2008R2 Standard Edition คู่มืออย่างเป็นทางการขอให้คุณติดตั้งไดรเวอร์ก่อน ขั้นตอนนี้อธิบายไว้อย่างสมบูรณ์ใน readme ที่แนบมากับไคลเอนต์ windows เราทำทุกอย่างตามที่เขียนไว้ ทุกอย่างได้ผล บน XP ยังใช้งานได้โดยไม่มีปัญหาใดๆ

หลังจากแกะไคลเอ็นต์ออกแล้ว เราพยายามเมานต์คีย์ของเรา:

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err: usbip_windows.c: 756 (query_interface0) recv op_common
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

โอ้โอ้. บางอย่างผิดพลาด. เราใช้ความสามารถของ Google มีการกล่าวถึงไม่เป็นชิ้นเป็นอันว่ามีบางอย่างผิดปกติกับค่าคงที่ ในส่วนของเซิร์ฟเวอร์ ผู้พัฒนาเปลี่ยนเวอร์ชันโปรโตคอลเมื่อเปลี่ยนเป็นเวอร์ชัน 0.2.0 แต่พวกเขาลืมทำสิ่งนี้ในไคลเอนต์ Win วิธีแก้ปัญหาที่เสนอคือเปลี่ยนค่าคงที่ในซอร์สโค้ดและสร้างไคลเอนต์ใหม่

แต่ฉันไม่ต้องการดาวน์โหลด Visual Studio เพราะขั้นตอนนี้จริงๆ แต่พี่ฮิวแก่แล้ว ในซอร์สโค้ด ค่าคงที่จะถูกประกาศเป็นคำคู่ ลองดูในไฟล์สำหรับ 0x00000106 แทนที่ด้วย 0x00000111 โปรดจำไว้ว่า ลำดับไบต์จะถูกกลับรายการ ผลลัพธ์คือสองแมตช์ แพตช์:

[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11

อีนี่...ใช่!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1

สิ่งนี้อาจยุติการนำเสนอ แต่เพลงไม่ได้เล่นนาน หลังจากรีบูทเซิร์ฟเวอร์ ฉันพบว่าอุปกรณ์บนไคลเอนต์ไม่ได้ติดตั้ง!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

และนั่นแหล่ะ แม้แต่ Google ที่รู้ทุกอย่างก็ไม่สามารถตอบคำถามนี้ให้ฉันได้ และในเวลาเดียวกันคำสั่งในการแสดงอุปกรณ์ที่มีอยู่บนเซิร์ฟเวอร์นั้นค่อนข้างแสดงอย่างถูกต้อง - นี่คือกุญแจสำคัญที่คุณสามารถเมานต์ได้ ฉันพยายามเมานต์จากภายใต้ Linux - ใช้งานได้! และถ้าตอนนี้ลองจากภายใต้ Windows? โอ้อึ - มันใช้งานได้!

เรคสุดท้าย: ไม่มีการเพิ่มบางอย่างในรหัสเซิร์ฟเวอร์ เมื่อแชร์อุปกรณ์ อุปกรณ์จะไม่อ่านจำนวนคำอธิบาย USB จากอุปกรณ์ และเมื่อติดตั้งอุปกรณ์จากภายใต้ Linux ช่องนี้จะถูกกรอก น่าเสียดาย ฉันคุ้นเคยกับการพัฒนาภายใต้ Linux ในระดับ "ทำ && ทำการติดตั้ง" ดังนั้นปัญหาจึงได้รับการแก้ไขด้วยการแฮ็กที่ค่อนข้างสกปรก - เพิ่มใน /etc/rc.local

usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00

ส่วนสุดท้าย

หลังจากเล่นซอก็ใช้งานได้ ได้รับผลลัพธ์ที่ต้องการแล้ว ตอนนี้สามารถติดตั้งคีย์กับพีซีเครื่องใดก็ได้ (และแน่นอนว่าไม่ได้ต่อเชื่อมด้วย) รวมถึงที่อยู่นอกส่วนเครือข่ายการออกอากาศ หากต้องการ คุณสามารถทำได้โดยใช้เชลล์สคริปต์ อะไรที่ดี - ความสุขนั้นฟรีอย่างแน่นอน
ฉันหวังว่าประสบการณ์ของฉันจะช่วยให้ habrazhiteli หลีกเลี่ยงคราดที่ประทับบนหน้าผากของฉัน ขอขอบคุณสำหรับความสนใจของคุณ!

ที่มา: will.com

เพิ่มความคิดเห็น