USB/IPを飼いならす

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

パート XNUMX、歴史的

マシンが仮想の場合、これはすべて簡単です。 ホストから仮想マシンへの USB 転送機能は、VMWare 4.1 で登場しました。 しかし、私の場合、WIBU-KEY として認識されるセキュリティ キーは、仮想マシンだけでなく、さまざまな時点でさまざまなマシンに接続する必要がありました。
遠い2009年に行われた最初の探索で、私は次のような鉄片にたどり着きました。 トレンドネット TU2-NU4
長所:

  • 時々それはうまくいきます

短所:

  • 常に機能するとは限りません。 Guardant Stealth II 保護キーが起動せず、「デバイスを起動できません」というエラーが表示されたとします。
  • 管理ソフトウェア (USB デバイスの読み取り、マウントおよびアンマウント) は非常に残念です。 コマンド ライン スイッチ、自動化 - いいえ、聞いたことはありません。 すべては手作業だけです。 悪夢。
  • 制御ソフトウェアはブロードキャストによってネットワーク内の鉄片自体を検索するため、これは XNUMX つのブロードキャスト ネットワーク セグメント内でのみ機能します。 鉄片の IP アドレスを手動で指定することはできません。 他のサブネットにある鉄の塊? それでは問題が発生します。
  • 開発者がデバイスでスコアを付けた場合、バグレポートを送信しても無駄です。

第 XNUMX ラウンドは、それほど遠くない時代に起こり、記事の主題に私を導きました - USB/IPプロジェクト。 オープンさで人を惹きつける、特に ReactOS 彼らは Windows 用のドライバーに署名したため、x64 上でもテスト モードのような松葉杖を必要とせずにすべてが動作するようになりました。 ReactOS チームに感謝します。 すべてが美しく聞こえる、それを感じてみよう、本当にそうなの? 残念ながら、プロジェクト自体も放棄されており、サポートを当てにすることはできません。しかし、私たちのプロジェクトは消えていないので、ソースはそこにあります。私たちがそれを見つけ出します。

パート XNUMX、サーバー Linux

ネットワーク上で USB デバイスを共有する USB/IP サーバーは、Linux ベースの OS 上でのみセットアップできます。 Linux は Linux なので、最小構成、標準的な動作で Debian 8 仮想マシンにインストールします。

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

解決しました。 さらに、インターネットでは、usbip モジュールをダウンロードする必要があると示唆されていますが、こんにちは、最初の rake です。 そのようなモジュールはありません。 これはすべて、ネットワーク上のほとんどのマニュアルが古いブランチ 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 を知りたいことがわかります。 視聴者の皆さん、レーキ番号 XNUMX がアリーナにいます。バス 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)

同志諸君、三度乾杯! サーバーはネットワーク上で鉄片を共有していたので、接続できました。 残っているのは、usbip デーモンの自動起動を /etc/rc.local に追加することだけです。

usbipd -D

パート XNUMX、クライアント側と混乱を招く

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

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

Windows に移りましょう。 私の場合は Windows Server 2008R2 Standard Edition でした。 公式ガイドでは、最初にドライバーをインストールするように求められます。 手順は Windows クライアントに添付されている Readme に完全に記載されており、書かれているとおりにすべてを実行すると、すべてがうまくいきます。 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 に置き換えてみましょう。 バイト順序が逆になることに注意してください。 結果は XNUMX つの一致となり、パッチが適用されます。

[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 から試してみてはいかがでしょうか? ああ、それはうまくいきます!

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

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

パートファイナル

いくつかいじった後、機能します。 望ましい結果が得られ、ブロードキャスト ネットワーク セグメント外の PC を含む任意の PC にキーをマウントできるようになりました (もちろん、アンマウントすることもできます)。 必要に応じて、シェル スクリプトを使用して実行できます。 何が素晴らしいかというと、その喜びは完全に無料です。
私の経験が、ハブラジテリが私の額に刻印された熊手を回避するのに役立つことを願っています。 ご清聴ありがとうございました!

出所: habr.com

コメントを追加します