USB / IPを使いこなす

ローカルネットワークを介してUSBデバイスをリモートPCに定期的に接続するタスクは、定期的に発生します。 猫の下には、この方向での私の検索のストーリーと、このパス上のさまざまな人々によって慎重に設定された障害の説明とそれらを回避する方法を備えたオープンソースUSB / IPプロジェクトに基づくターンキーソリューションへのパスがあります。



パート1、歴史



マシンが仮想の場合-これはすべて簡単です。 ホストから仮想マシンへのUSB転送機能は、VMWare 4.1で登場しました。 しかし、私の場合、WIBU-KEYとして認識されるセキュリティキーは、仮想マシンだけでなく、異なるマシンに異なる時間に接続する必要がありました。

2009年の最初の検索では、 TrendNet TU2-NU4と呼ばれる鉄片に行きました。

長所:





短所:





2回目のラウンドはそれほど遠くない時期に行われ、この記事のトピックであるUSB / IPプロジェクトに導かれました。 特にReactOSのメンバーがWindows用のドライバーに署名したため、オープンで魅力的です。したがって、x64でもテストモードのような松葉杖なしですべてが機能します。 ReactOSチームに感謝します! すべてが美しいように聞こえます、それを感じてみましょう、本当にそうですか? 残念ながら、プロジェクト自体も破棄され、サポートに頼ることはできません-しかし、私たちのプロジェクトが消えなかった場合、ソースはそれを把握します!



パート2、サーバーとLinux



ネットワーク上でUSBデバイスを共有するUSB​​ / IPサーバーは、LinuxベースのOSでのみ作成できます。 さて、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はそのバスIDを知りたいことが明らかになります。 視聴者の皆様、アリーナの3番目のレーキ: lsusbを提供するバスID(最も明白な方法と思われます)は、彼女には適していません! 実際には、USBハブのようなガジェットはusbipによって無視されます。 したがって、組み込みコマンドを使用します。



 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
      
      





パート3、クライアントと混乱



共有デバイスをネットワーク経由で同じサーバー上ですぐにDebianを実行しているマシンに接続しようとしましたが、すべてが完全に接続されました。



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





Windowsに渡します。 私の場合、それはWindows Server 2008R2 Standard Editionでした。 公式マニュアルでは、最初にドライバーをインストールするように求められます。 手順は、Windowsクライアントに添付されているreadmeに美しく記載されています。書かれているとおりにすべてを行い、すべてが判明します。 XPでは、問題なく動作します。



クライアントを展開した後、キーをマウントしようとします。



 C:\Program Files\USB-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に置き換えてみましょう。 忘れないでください、バイト順が逆になっています。 結果は2つの一致、パッチです:



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





III ...はい!



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





これでプレゼンテーションを終了できましたが、音楽は長時間再生されませんでした。 サーバーを再起動すると、デバイスがクライアントにマウントされていないことがわかりました!



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





それだけです。 すべてを知っているGoogleでさえも答えられませんでした。 同時に、サーバーで使用可能なデバイスを表示するコマンドは非常に正確に表示されます-ここでキーをマウントできます。 Linuxからマウントしようとしました-動作します! そして今、Windowsの下から試してみたら? 恐ろしい-それは動作します!



最後のレーキ:サーバーコードに何かが追加されていません。 デバイスを共有するとき、デバイスからUSB記述子の数を読み取りません。 また、Linuxからデバイスをマウントすると、このフィールドが埋められます。 残念ながら、「make && make install」のレベルでのLinux開発には精通しています。 したがって、この問題はかなり汚いハックで解決されました-/etc/rc.localに追加することにより



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





最後の部分



いくつかの試練の後、それは動作します。 必要なものが受信され、キーを任意のPCにマウントできるようになりました(もちろん、アンマウントも可能です)-ブロードキャストネットワークセグメントの外部。 必要に応じて、シェルスクリプトを使用してこれを行うことができます。 素晴らしいこと-喜びは絶対に無料です。

私の経験が、額に刻まれたすくいを回避する助けになることを願っています。 ご清聴ありがとうございました!



All Articles