Menjinakkan USB/IP

Tugas menghubungkan perangkat USB ke PC jarak jauh melalui jaringan lokal muncul secara teratur. Di bawah potongan, riwayat pencarian saya ke arah ini ditetapkan, dan jalur menuju solusi siap pakai berdasarkan proyek sumber terbuka USB/IP dengan deskripsi tentang rintangan yang diatur dengan hati-hati oleh berbagai orang di jalan ini, serta cara untuk melewatinya.

Bagian satu, sejarah

Jika mesinnya virtual - semua ini mudah. Fungsionalitas penerusan USB dari host ke mesin virtual muncul di VMWare 4.1. Namun dalam kasus saya, kunci keamanan, yang dapat dikenali sebagai WIBU-KEY, harus dihubungkan pada waktu yang berbeda ke mesin yang berbeda, dan tidak hanya mesin virtual.
Putaran pertama pencarian di tahun 2009 yang jauh membawa saya ke sepotong besi yang disebut TrendNet TU2-NU4
Pro:

  • kadang-kadang bahkan berhasil

Cons:

  • tidak selalu berhasil. Misalkan kunci perlindungan Guardant Stealth II tidak memulai melalui itu, bersumpah dengan kesalahan "perangkat tidak dapat dimulai".
  • Perangkat lunak manajemen (baca - pemasangan dan pelepasan perangkat USB) sangat menyedihkan. Sakelar baris perintah, otomatisasi - tidak, belum pernah mendengar. Semuanya hanya dengan tangan. Mimpi buruk.
  • perangkat lunak kontrol mencari potongan besi itu sendiri di jaringan dengan menyiarkan, jadi ini hanya berfungsi dalam satu segmen jaringan siaran. Anda tidak dapat menentukan alamat IP dari sepotong besi dengan tangan. Sepotong besi di subnet lain? Maka Anda memiliki masalah.
  • pengembang mencetak gol pada perangkat, tidak ada gunanya mengirim laporan bug.

Babak kedua terjadi dalam waktu yang tidak terlalu lama, dan membawa saya ke topik artikel - Proyek USB/IP. Menarik dengan keterbukaan, terutama karena pria dari ReactOS mereka menandatangani driver untuk Windows, jadi sekarang semuanya berfungsi bahkan di x64 tanpa kruk seperti mode uji. Terima kasih banyak kepada tim ReactOS! Semuanya terdengar indah, coba kita rasakan, benarkah begitu? Sayangnya, proyek itu sendiri juga ditinggalkan, dan Anda tidak dapat mengandalkan dukungan - tetapi jika proyek kami tidak hilang, sumbernya ada di sana, kami akan mencari tahu!

Bagian kedua, server-linux

Server USB/IP yang berbagi perangkat USB melalui jaringan hanya dapat diatur pada OS berbasis Linux. Yah, Linux adalah Linux, jadi instal di mesin virtual Debian 8 dengan konfigurasi minimum, gerakan tangan standar:

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

Mapan. Selanjutnya, Internet menyarankan Anda perlu mengunduh modul usbip, tetapi - halo, penggaruk pertama. Tidak ada modul seperti itu. Dan semua karena sebagian besar manual di jaringan mengacu pada cabang lama 0.1.x, dan di 0.2.0 terbaru modul usbip memiliki nama yang berbeda.

Oleh karena itu:

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

Baiklah, mari tambahkan baris berikut ke /etc/modules untuk memuatnya secara otomatis saat startup sistem:

usbip-core
usbip-host
vhci-hcd

Mari kita mulai server usbip:

sudo usbipd -D

Selanjutnya, pikiran universal memberi tahu kita bahwa usbip dilengkapi dengan skrip yang memungkinkan kita mengelola server - tunjukkan perangkat mana yang akan dibagikan melalui jaringan, lihat statusnya, dan seterusnya. Di sini alat berkebun lain menunggu kita - skrip ini di cabang 0.2.x, sekali lagi, telah diganti namanya. Anda bisa mendapatkan daftar perintah dengan

sudo usbip

Setelah membaca deskripsi perintah, menjadi jelas bahwa untuk berbagi perangkat USB yang diperlukan, usbip ingin mengetahui ID Bus-nya. Pemirsa yang terhormat, penggaruk nomor tiga ada di arena: ID Bus yang akan diberikan kepada kita lsusb (sepertinya cara yang paling jelas) - itu tidak cocok untuknya! Faktanya adalah usbip mengabaikan perangkat keras seperti hub USB. Oleh karena itu, kami akan menggunakan perintah bawaan:

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

Catatan: selanjutnya dalam daftar saya akan menjelaskan semuanya menggunakan contoh kunci USB khusus saya. Nama perangkat keras dan pasangan VID:PID Anda dapat dan akan berbeda. Milik saya disebut Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Sekarang kami dapat membagikan perangkat kami:

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

Hore, rekan-rekan!

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)

Tiga sorakan, kawan! Server membagikan sepotong besi melalui jaringan, dan kami dapat menghubungkannya! Tinggal menambahkan autostart daemon usbip ke /etc/rc.local

usbipd -D

Bagian ketiga, sisi klien dan membingungkan

Saya mencoba menghubungkan perangkat bersama melalui jaringan ke mesin Debian langsung di server yang sama, dan semuanya terhubung dengan baik:

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

Mari beralih ke Windows. Dalam kasus saya itu adalah Windows Server 2008R2 Standard Edition. Panduan resmi meminta Anda untuk menginstal driver terlebih dahulu. Prosedurnya dijelaskan dengan sempurna dalam readme yang dilampirkan ke klien windows, kami melakukan semuanya seperti yang tertulis, semuanya berhasil. Di XP juga berfungsi tanpa masalah.

Setelah membongkar klien, kami mencoba memasang kunci kami:

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

Oh oh. Ada yang salah. Kami menggunakan keahlian Google. Ada fragmen yang menyebutkan bahwa ada yang salah dengan konstanta, di bagian server, pengembang mengubah versi protokol saat beralih ke versi 0.2.0, tetapi mereka lupa melakukannya di klien Win. Solusi yang diusulkan adalah mengubah konstanta dalam kode sumber dan membangun kembali klien.

Tapi saya benar-benar tidak ingin mengunduh Visual Studio demi prosedur ini. Tapi aku punya Hiew tua yang baik. Dalam kode sumber, konstanta dinyatakan sebagai kata ganda. Mari kita lihat file untuk 0x00000106, ganti dengan 0x00000111. Ingat, urutan byte dibalik. Hasilnya adalah dua pertandingan, tambalan:

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

Eeeee... ya!

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

Ini bisa saja mengakhiri presentasi, tetapi musik tidak diputar lama. Setelah mem-boot ulang server, saya menemukan bahwa perangkat di klien tidak terpasang!

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

Dan itu saja. Bahkan Google yang maha tahu tidak dapat menjawab ini untuk saya. Dan pada saat yang sama, perintah untuk menampilkan perangkat yang tersedia di server ditampilkan dengan cukup benar - ini dia, kuncinya, Anda dapat memasangnya. Saya mencoba me-mount dari bawah Linux - berhasil! Dan jika sekarang coba dari bawah Windows? Oh sial - itu berhasil!

Penggaruk terakhir: ada sesuatu yang tidak ditambahkan dalam kode server. Saat berbagi perangkat, itu tidak membaca jumlah deskriptor USB darinya. Dan saat memasang perangkat dari bawah Linux, bidang ini diisi. Sayangnya, saya terbiasa dengan pengembangan di bawah Linux pada level "make && make install". Oleh karena itu, masalah diselesaikan dengan peretasan yang agak kotor - ditambahkan ke /etc/rc.local

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

Bagian terakhir

Setelah beberapa mengutak-atik, itu berhasil. Hasil yang diinginkan telah diperoleh, sekarang kuncinya dapat dipasang ke PC mana pun (dan dilepas, tentu saja juga), termasuk di luar segmen jaringan siaran. Jika mau, Anda bisa melakukannya menggunakan skrip shell. Apa yang menyenangkan - kesenangannya benar-benar gratis.
Saya berharap pengalaman saya akan membantu habrazhiteli mengatasi penggaruk yang tercetak di dahi saya. Terima kasih atas perhatian Anda!

Sumber: www.habr.com

Tambah komentar