งานในการเชื่อมต่ออุปกรณ์ USB กับพีซีระยะไกลผ่านเครือข่ายท้องถิ่นเกิดขึ้นเป็นประจำ ภายใต้การตัด ประวัติการค้นหาของฉันในทิศทางนี้ถูกกำหนดไว้ และเส้นทางไปยังโซลูชันสำเร็จรูปตามโครงการโอเพ่นซอร์ส
ส่วนที่หนึ่ง ประวัติศาสตร์
หากเครื่องเป็นเสมือน - ทั้งหมดนี้เป็นเรื่องง่าย การทำงานของการส่งต่อ USB จากโฮสต์ไปยังเครื่องเสมือนปรากฏใน VMWare 4.1 แต่ในกรณีของฉัน คีย์ความปลอดภัยซึ่งรู้จักในชื่อ WIBU-KEY จะต้องเชื่อมต่อกับเครื่องต่างๆ ในเวลาต่างๆ กัน ไม่ใช่เฉพาะเครื่องเสมือนเท่านั้น
การค้นหารอบแรกในปี 2009 ที่ห่างไกลทำให้ฉันพบชิ้นส่วนเหล็กที่เรียกว่า
จุดเด่น:
- บางครั้งมันก็ใช้งานได้
จุดด้อย:
- ไม่ได้ผลเสมอไป สมมติว่าคีย์ป้องกัน Guardant Stealth II ไม่เริ่มทำงานโดยระบุข้อผิดพลาดว่า "ไม่สามารถเริ่มอุปกรณ์ได้"
- ซอฟต์แวร์การจัดการ (อ่าน - ติดตั้งและยกเลิกการต่อเชื่อมอุปกรณ์ USB) เป็นสิ่งที่น่าสมเพชอย่างยิ่ง สวิตช์บรรทัดคำสั่ง ระบบอัตโนมัติ - ไม่ ไม่เคยได้ยิน ทุกอย่างเป็นเพียงด้วยมือ ฝันร้าย
- ซอฟต์แวร์ควบคุมจะค้นหาชิ้นส่วนของเหล็กในเครือข่ายโดยการแพร่สัญญาณ ดังนั้นจึงใช้งานได้เฉพาะภายในส่วนเครือข่ายการแพร่ภาพเดียวเท่านั้น คุณไม่สามารถระบุที่อยู่ IP ของชิ้นส่วนเหล็กด้วยมือได้ ชิ้นส่วนของเหล็กในเครือข่ายย่อยอื่น ๆ ? แล้วคุณมีปัญหา
- นักพัฒนาให้คะแนนบนอุปกรณ์ มันไม่มีประโยชน์ที่จะส่งรายงานข้อบกพร่อง
รอบที่สองเกิดขึ้นในช่วงเวลาไม่ไกลนัก และนำฉันไปสู่หัวข้อของบทความ -
ส่วนที่สอง เซิร์ฟเวอร์ลินุกซ์
เซิร์ฟเวอร์ 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