Εξημέρωση USB/IP

Η εργασία σύνδεσης μιας συσκευής USB σε έναν απομακρυσμένο υπολογιστή μέσω τοπικού δικτύου προκύπτει τακτικά. Κάτω από την περικοπή, παρουσιάζεται το ιστορικό των αναζητήσεών μου προς αυτή την κατεύθυνση και η πορεία προς μια έτοιμη λύση που βασίζεται σε ένα έργο ανοιχτού κώδικα USB/IP με περιγραφή των εμποδίων που βάζουν προσεκτικά διάφορα άτομα σε αυτό το μονοπάτι, καθώς και τρόπους παράκαμψης τους.

Μέρος πρώτο, ιστορικό

Εάν το μηχάνημα είναι εικονικό - όλα αυτά είναι εύκολα. Η λειτουργικότητα της προώθησης USB από έναν κεντρικό υπολογιστή σε μια εικονική μηχανή εμφανίστηκε στο VMWare 4.1. Αλλά στην περίπτωσή μου, το κλειδί ασφαλείας, αναγνωρίσιμο ως WIBU-KEY, έπρεπε να συνδεθεί σε διαφορετικές χρονικές στιγμές με διαφορετικά μηχανήματα, και όχι μόνο με εικονικά.
Ο πρώτος γύρος αναζήτησης το μακρινό 2009 με οδήγησε σε ένα κομμάτι σίδερο που λέγεται TrendNet TU2-NU4
Πλεονεκτήματα:

  • μερικές φορές μάλιστα λειτουργεί

Μειονεκτήματα:

  • δεν λειτουργεί πάντα. Ας υποθέσουμε ότι το κλειδί προστασίας Guardant Stealth II δεν ξεκινά μέσα από αυτό, ορκιζόμενος με το σφάλμα "δεν μπορεί να ξεκινήσει η συσκευή".
  • Το λογισμικό διαχείρισης (ανάγνωση - τοποθέτηση και αποσυναρμολόγηση συσκευών USB) είναι αξιολύπητο στα άκρα. Διακόπτες γραμμής εντολών, αυτοματισμός - όχι, δεν έχω ακούσει. Όλα είναι μόνο στο χέρι. Εφιάλτης.
  • το λογισμικό ελέγχου αναζητά το ίδιο το κομμάτι σιδήρου στο δίκτυο μέσω εκπομπής, επομένως αυτό λειτουργεί μόνο σε ένα τμήμα του δικτύου εκπομπής. Δεν μπορείτε να καθορίσετε τη διεύθυνση IP του κομματιού σιδήρου με το χέρι. Ένα κομμάτι σιδήρου σε άλλο υποδίκτυο; Τότε έχεις πρόβλημα.
  • Οι προγραμματιστές σημείωσαν βαθμολογία στη συσκευή, είναι άχρηστο να στέλνετε αναφορές σφαλμάτων.

Ο δεύτερος γύρος συνέβη σε εποχές όχι τόσο μακρινές και με οδήγησε στο θέμα του άρθρου - Έργο USB/IP. Προσελκύει με ανοιχτότητα, ειδικά αφού τα παιδιά από ReactOS υπέγραψαν ένα πρόγραμμα οδήγησης για Windows, οπότε τώρα όλα λειτουργούν ακόμα και σε x64 χωρίς πατερίτσες σαν δοκιμαστική λειτουργία. Για το οποίο ευχαριστώ πολύ την ομάδα του ReactOS! Όλα ακούγονται όμορφα, ας προσπαθήσουμε να τα νιώσουμε, είναι πραγματικά έτσι; Δυστυχώς, το ίδιο το έργο έχει επίσης εγκαταλειφθεί και δεν μπορείτε να βασιστείτε στην υποστήριξη - αλλά όπου το δικό μας δεν εξαφανίστηκε, η πηγή είναι εκεί, θα το καταλάβουμε!

Μέρος δεύτερο, διακομιστής-linux

Ένας διακομιστής 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 θέλει να μάθει το αναγνωριστικό διαύλου του. Αγαπητοί τηλεθεατές, η γκανιότα νούμερο τρία είναι στην αρένα: η ταυτότητα του λεωφορείου που θα μας δώσει 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)

Τρία μπράβο σύντροφοι! Ο διακομιστής μοιράστηκε το κομμάτι σιδήρου μέσω του δικτύου και μπορούμε να το συνδέσουμε! Απομένει μόνο να προσθέσουμε την αυτόματη εκκίνηση του δαίμονα usbip στο /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 για χάρη αυτής της διαδικασίας. Αλλά έχω ένα παλιό καλό Hiew. Στον πηγαίο κώδικα, η σταθερά δηλώνεται ως διπλή λέξη. Ας δούμε στο αρχείο για 0x00000106, αντικαθιστώντας το με 0x00000111. Θυμηθείτε, η σειρά των byte αντιστρέφεται. Το αποτέλεσμα είναι δύο αγώνες, patch:

[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 στο επίπεδο "κάνω && πραγματοποίηση εγκατάστασης". Επομένως, το πρόβλημα λύνεται με ένα μάλλον βρώμικο hack - προσθέτοντας στο /etc/rc.local

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

Τελικό μέρος

Μετά από λίγη ταλαιπωρία, λειτουργεί. Το επιθυμητό αποτέλεσμα έχει επιτευχθεί, τώρα το κλειδί μπορεί να τοποθετηθεί σε οποιονδήποτε υπολογιστή (και να αποσυναρμολογηθεί, φυσικά, επίσης), συμπεριλαμβανομένων εκείνων που βρίσκονται εκτός του τμήματος του δικτύου εκπομπής. Εάν θέλετε, μπορείτε να το κάνετε χρησιμοποιώντας ένα σενάριο κελύφους. Τι είναι ωραίο - η απόλαυση είναι εντελώς δωρεάν.
Ελπίζω ότι η εμπειρία μου θα βοηθήσει το habrazhiteli να ξεπεράσει την τσουγκράνα που αποτυπώθηκε στο μέτωπό μου. Σας ευχαριστώ για την προσοχή σας!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο