delete from hateblo.jp where 1=1;

タイトルに意味はありません。

USB over IP (Ethernet)

対象

個人的には、Wifiで何もかも接続できればきっと幸せになれると考えただけです。

参照

TODO:他に検討したものなどを載せる

結論

  • 正常に動きませんでした
    • Windows -- Linux -- プリンタ を実行
    • Linux -- Linux -- プリンタ は未確認
    • そもそも、32bitと64bitの橋渡しをするのが良くないのではないかと
      • 環境がないので、実装テストできていません
    • Windows XPがメインで考えられているみたいなので、内部APIの挙動が違うことが影響しているようにも思いました。
Target Version OS
Server 0.1.7 Debian GNU/Linux squeeze 64bit
Client 0.2.0.0_signed Windows Server 2008 Web Server Edition 32bit

Windowsドライバの動きがいまいち良くない。
データの受け渡しは正常なのだが、イベントループに戻るとき、0バイトのデータが転送されて、異常終了してしまう。
コメントにも、Windiows DDKのサンプルを基にして作ったけど、GNUにして公開できるほど完璧ではないという記述があったので、まだまだ、テスト中らしい。

概要

Linux 側の準備

インストール

debianの場合、installコマンドで最新のパッケージをインストールできる。

$ sudo aptitude install usbip

早速実行してみるが....

$ sudo usbipd -D
usbip err: stub_driver.c:  33 (open_sysfs_stub_driver) usbip_common_mod.ko and usbip.ko must be loaded

** ERROR **: driver open failed
aborting...
$ sudo usbip_bind_driver --list
List USB devices

バイスがないといわれるので、デバイスドライバをロードする

$ sudo modprobe usbip
$ sudo lsmod | grep usbip
usbip                  11561  0 
usbip_common_mod        8489  1 usbip
usbcore               122562  7 usbip,usb_storage,usblp,usbhid,uhci_hcd,ehci_hcd

バイスをロードできたみたいなので、デーモンを起動する

$ sudo usbipd -D
Bind usbip.ko to a usb device to be exportable!
$ ps -Af | grep usbip
root      2223     1  0 00:53 ?        00:00:00 usbipd -D
user      2227 32244  0 00:54 pts/0    00:00:00 grep usbip
$ netstat -ano | grep 3240
tcp        0      0 0.0.0.0:3240            0.0.0.0:*               LISTEN      オフ (0.00/0/0)

Windows 側の準備

ドライバをインストールする

スクリーンショットを張る!→無駄になったけど。

管理者権限で「コンピュータの管理」を開き、レガシデバイスの追加を行う。

そのまま「次へ」。

詳細設定にして「次へ」。

そのまま「次へ」。

そのまま「ディスクの使用」を選択。

展開したフォルダを選択して、「OK」を押す。

正しいドライバが選択されているか確認し、「次へ」。

「次へ」を押して、ドライバのインストールを行う。



完了すると次のような画面になる。




USBを関連付ける

情報を取得する。

C:\app\tool\usbip_0.2.0.0_signed>usbip -l 192.168.0.4
- 192.168.0.4

C:\app\tool\usbip_0.2.0.0_signed>usbip -l 192.168.0.4
- 192.168.0.4
     3-1: Canon, Inc. : MP*** ser (****:****)
        : /sys/devices/pci0000:00/0000:00:**.*/usb3/3-1
        : (Defined at Interface level) (00/00/00)
        :  0 - Vendor Specific Class / unknown subclass / unknown protocol (ff/00/ff)
        :  1 - Printer / Printer / Bidirectional (**/01/ff)
        :  2 - Mass Storage / SCSI / Bulk (Zip) (**/06/ff)

接続する。

C:\app\tool\usbip_0.2.0.0_signed>usbip.exe -a 192.168.0.4 3-1

関連するドライバのインストールが始まる。

これで接続できるはず...なのだが、なぜかデバイスの認識中にエラーとなる。
デバッグ中...

C:\tag\usbip_windows-0.2.0.0\Debug>usbip.exe -D -a 192.168.0.4 3-1
usbip for windows ($Id: usbip.c 176 2011-04-02 21:25:46Z arjanmels $)

usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip_network.c: 268 (tcp_connect ) trying 192.168.0.4 port 3240

usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip_network.c: 288 (tcp_connect ) connected to 192.168.0.4:3240
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 139 (query_interface0) exportable 1 devices
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 156 (query_interface0)      3-1: unknown vendor : unknown product (****:****)
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 157 (query_interface0)         : /sys/devices/pci0000:00/0000:00:**.*/usb3/3-1
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 158 (query_interface0)         : (Defined at Interface level) (00/00/00)
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 178 (query_interface0)         :  0 - unknown class / unknown subclass / unknown protocol (ff/00/ff)
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 178 (query_interface0)         :  1 - unknown class / unknown subclass / unknown protocol (**/01/ff)
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 178 (query_interface0)         :  2 - unknown class / unknown subclass / unknown protocol (**/06/ff)
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 181 (query_interface0)
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip_network.c: 268 (tcp_connect ) trying 192.168.0.4 port 3240
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip_network.c: 288 (tcp_connect ) connected to 192.168.0.4:3240
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 208 (import_device) call from attch here
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 210 (import_device) return from attch here
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 217 (import_device) devfd:004*****
new usb device attached to usbvbus port 1

usbip err: C:\tag\usbip_windows-0.2.0.0\usbip_vbus_ui.c: 466 (sock_read_completed) incomplete header 1 997
usbip err: C:\tag\usbip_windows-0.2.0.0\usbip_vbus_ui.c: 356 (write_to_dev) read from sock ret 0 not equal a usbip_header
usbip err: C:\tag\usbip_windows-0.2.0.0\usbip_vbus_ui.c: 357 (write_to_dev) usbip_header: 48
usbip err: C:\tag\usbip_windows-0.2.0.0\usbip_vbus_ui.c: 358 (write_to_dev) usbip_header: 48


usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 307 (attach_device) closing connection to device
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 310 (attach_device) detaching device
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 313 (attach_device) closing connection to peer
usbip dbg: C:\tag\usbip_windows-0.2.0.0\usbip.c: 316 (attach_device) done

実際、正常に接続される場合は、このまま放置すれば、USBデバイスの使用が可能。
USBの使用を終了する場合は、Ctrl+Cで閉じることが出来る。
ただ、サスペンドや、休止モードにしたときの挙動も怪しそうなので、テストする必要あり。

終了/アンインストール

Windows 側の終了

アンインストールはデバイスマネージャ→システムバス→USB/IP Emuratorを削除してください。(ドライバごと削除を推奨)




Linux 側の終了

終了する場合はkillコマンドで。

$ ps -Af | grep usbip
root      2223     1  0 00:53 ?        00:00:00 usbipd -D
user      2227 32244  0 00:54 pts/0    00:00:00 grep usbip
$ sudo kill 2223
$ ps -Af | grep usbip
user      2251 32244  0 00:54 pts/0    00:00:00 grep usbip

ドライバのアンロード

$ sudo rmmod usbip usbip_common_mod
$ lsmod | grep usbip

付録

Windowsクライアント

usbip のコマンドライン引数

短いコマンド 長いコマンド オプション 説明
-a --attach [host] [bus_id] リモートのhostのbus_idに接続します
-d --detach [ports] portの接続を解除します
-l --list [hosts] hostsで公開中のUSBデバイスリストを表示します
-p --port なし 仮想USBポートの状態の一覧を表示します
-D --debug なし デバッグ情報を表示します(開発者向け)
-v --version なし バージョン情報を表示します
-h --help なし ヘルプを表示します