USB/IP'yi evcilleştirme

Bir USB cihazını yerel bir ağ üzerinden uzak bir PC'ye bağlama görevi düzenli olarak ortaya çıkar. Kesim altında, bu yöndeki aramalarımın geçmişi ve açık kaynaklı bir projeye dayalı hazır bir çözüme giden yol belirtilmiştir. USB/IP Bu yolda çeşitli kişiler tarafından dikkatlice belirlenen engellerin yanı sıra bunları aşmanın yollarının bir açıklaması ile.

Birinci bölüm, tarihi

Makine sanalsa - tüm bunlar kolaydır. Bir ana bilgisayardan bir sanal makineye USB iletme işlevi VMWare 4.1'de ortaya çıktı. Ancak benim durumumda, WIBU-KEY olarak tanınan güvenlik anahtarının, yalnızca sanal makinelere değil, farklı zamanlarda farklı makinelere bağlanması gerekiyordu.
Uzak 2009'daki ilk arama turu beni bir demir parçasına götürdü. TrendNet TU2-NU4
Artıları:

  • bazen işe yarıyor bile

Eksileri:

  • her zaman işe yaramaz. Diyelim ki Guardant Stealth II koruma anahtarı, "cihaz başlatılamıyor" hatasıyla küfrederek başlamadı.
  • Yönetim yazılımı (USB aygıtlarını okuma - takma ve çıkarma) aşırı derecede acınası. Komut satırı anahtarları, otomasyon - hayır, duymadım. Her şey sadece elle. Kabus.
  • kontrol yazılımı yayın yaparak ağda demir parçasının kendisini arar, bu nedenle bu yalnızca bir yayın ağı segmentinde çalışır. Demir parçasının IP adresini elle belirleyemezsiniz. Diğer alt ağda bir demir parçası mı? O zaman bir problemin var.
  • geliştiriciler cihazda puan aldı, hata raporları göndermek işe yaramaz.

İkinci tur çok uzak olmayan zamanlarda oldu ve beni makalenin konusuna götürdü - USB/IP projesi. Özellikle erkeklerden beri açıklıkla çekiyor ReactOS Windows için bir sürücü imzaladılar, yani artık her şey x64'te bile test modu gibi herhangi bir koltuk değneği olmadan çalışıyor. Bunun için ReactOS ekibine çok teşekkürler! Kulağa her şey güzel geliyor, hissetmeye çalışalım, gerçekten öyle mi? Ne yazık ki, projenin kendisi de terk edildi ve desteğe güvenemezsiniz - ancak bizimkinin kaybolmadığı yerde, kaynak orada, biz çözeceğiz!

İkinci bölüm, server-linux

Bir ağ üzerinden USB aygıtlarını paylaşan bir USB/IP sunucusu yalnızca Linux tabanlı bir işletim sisteminde kurulabilir. Eh, Linux Linux'tur, bu nedenle Debian 8 sanal makinesine minimum yapılandırmada, standart el hareketiyle kurun:

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

Yerleşik Ayrıca, İnternet, usbip modülünü indirmeniz gerektiğini öne sürüyor, ancak - merhaba, ilk tırmık. Böyle bir modül yok. Ve hepsi, ağdaki kılavuzların çoğunun eski 0.1.x şubesine atıfta bulunması ve en son 0.2.0'da usbip modüllerinin farklı adlara sahip olması nedeniyle.

Bu yüzden:

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

Peki, sistem başlangıcında otomatik olarak yüklemek için aşağıdaki satırları /etc/modules dosyasına ekleyelim:

usbip-core
usbip-host
vhci-hcd

Usbip sunucusunu başlatalım:

sudo usbipd -D

Dahası, evrensel zihin bize usbip'in sunucuyu yönetmemize - ağ üzerinden hangi cihazı paylaşacağını göstermemize, durumu görmemize vb. izin veren komut dosyalarıyla geldiğini söyler. Burada başka bir bahçe aracı bizi bekliyor - 0.2.x dalındaki bu komut dosyaları yeniden adlandırıldı. İle komutların bir listesini alabilirsiniz.

sudo usbip

Komutların açıklamasını okuduktan sonra, gerekli USB cihazını paylaşmak için usbip'in Bus ID'sini bilmek istediği anlaşılıyor. Değerli izleyicilerimiz üç numaralı rake arenada: Bize verecek olan Otobüs ID'si lsusb (en bariz yol gibi görünüyor) - ona uymuyor! Gerçek şu ki, usbip, USB hub'ları gibi donanımları yok sayar. Bu nedenle, yerleşik komutu kullanacağız:

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

Not: bundan sonra listelerde her şeyi kendi özel USB anahtarım örneğini kullanarak açıklayacağım. Donanım adınız ve VID:PID çiftiniz farklı olabilir ve olacaktır. Madenin adı Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Artık cihazımızı paylaşabiliriz:

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

Şerefe, yoldaşlar!

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)

Üç şerefe, yoldaşlar! Sunucu demir parçasını ağ üzerinden paylaştı ve biz de onu bağlayabiliriz! Geriye sadece /etc/rc.local dizinine usbip arka plan programının otomatik başlatmasını eklemek kalır.

usbipd -D

Üçüncü bölüm, müşteri tarafı ve kafa karıştırıcı

Paylaşılan cihazı ağ üzerinden hemen aynı sunucudaki bir Debian makinesine bağlamayı denedim ve her şey yolunda gitti:

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

Windows'a geçelim. Benim durumumda, Windows Server 2008R2 Standard Edition idi. Resmi kılavuz, önce sürücüyü yüklemenizi ister. Prosedür, windows istemcisine eklenmiş benioku dosyasında mükemmel bir şekilde açıklanmıştır, her şeyi yazıldığı gibi yaparız, her şey yolunda gider. XP'de de sorunsuz çalışır.

İstemci paketini açtıktan sonra, anahtarımızı bağlamaya çalışıyoruz:

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

Ah ah Bir şeyler yanlış gitti. Google'ın becerisini kullanıyoruz. Sabitlerde bir sorun olduğuna dair parça parça sözler var; sunucu kısmında geliştiriciler, sürüm 0.2.0'a geçerken protokol sürümünü değiştirdiler, ancak bunu Win istemcisinde yapmayı unuttular. Önerilen çözüm, kaynak koddaki sabiti değiştirmek ve istemciyi yeniden oluşturmaktır.

Ancak bu prosedür uğruna gerçekten Visual Studio'yu indirmek istemiyorum. Ama benim eski güzel bir Hiew'im var. Kaynak kodunda, sabit bir çift sözcük olarak bildirilir. 0x00000106 için dosyaya bakalım ve onu 0x00000111 ile değiştirelim. Unutma, bayt sırası tersine çevrilir. Sonuç iki eşleşmedir, yama:

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

Eeee... evet!

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

Bu sunumu bitirebilirdi ama müzik uzun süre çalmadı. Sunucuyu yeniden başlattıktan sonra, istemcideki aygıtın takılı olmadığını gördüm!

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

Ve bu kadar. Her şeyi bilen Google bile benim için buna cevap veremedi. Ve aynı zamanda, sunucuda bulunan cihazları görüntüleme komutu oldukça doğru bir şekilde gösteriliyor - işte burada, anahtar, monte edebilirsiniz. Linux altından bağlamaya çalışıyorum - işe yarıyor! Ve eğer şimdi Windows altından denerseniz? Ah kahretsin - işe yarıyor!

Son komisyon: sunucu koduna bir şey eklenmedi. Bir cihazı paylaşırken, ondan USB tanımlayıcılarının sayısını okumaz. Ve cihazı Linux altından monte ederken bu alan doldurulur. Ne yazık ki, Linux altında “make && make install” düzeyindeki geliştirmeye aşinayım. Bu nedenle, sorun oldukça kirli bir hack ile çözülür - /etc/rc.local dosyasına eklenir

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

Bölüm finali

Biraz uğraştıktan sonra işe yarıyor. İstenen sonuç elde edildi, artık anahtar, yayın ağı segmentinin dışındakiler de dahil olmak üzere herhangi bir PC'ye takılabilir (ve tabii ki de kaldırılabilir). İsterseniz, bir kabuk betiği kullanarak yapabilirsiniz. Güzel olan - zevk tamamen ücretsizdir.
Umarım deneyimlerim habrazhiteli'nin alnıma basılan tırmığın etrafından dolaşmasına yardımcı olur. İlginiz için teşekkür ederiz!

Kaynak: habr.com

Yorum ekle