TL;DR

usbipdの使い方のメモ
メジャーバージョン4での破壊的変更後の仕様

導入

インストーラ

https://github.com/dorssel/usbipd-win/releases

winget

winget install usbipd

基本

list

Windowsホストに接続されている,USBIPで使用可能なデバイスを列挙する.

usbipd list

Connectedはホストに接続されているデバイス,Persistedは接続されていないがbindが永続化されているデバイス.

  • BUSID
    • 接続されているUSBバスのID
    • 操作するデバイスを指定する際に使用
  • VID:PID
    • Vendor ID & Product ID
    • デバイスの特定に使える
  • STATE
    • デバイスの状態
      • Not Shared: 共有されていない
      • Shared: 共有対象
      • Shared (forced): 共有対象(force bind)
      • Attached: アタッチ済み

bind

USBデバイスをUSBIPによる共有の対象とする.
あくまで共有対象となるだけで,attachしなければWindows側で使用できる.
この設定は,一度行えばunbindするまで永続する.

usbipd bind -b <BUSID>

force bind

デバイスをWindows側で認識させず,USBIPでの共有Onlyにする.
attachしていなくてもホストから使用できない.
デバイスがbusyと認識されているとattachができないため,それを避けるために有効.

-fオプションの付加のみで設定可能.

usbipd bind -b <BUSID> -f

attach

複数のWSLディストリビューションがある場合,すべてにattachされる.

usbipd attach --wsl -b <BUSID>

detach

usbipd detach -b <BUSID>

応用

vSwitchをBridgeにしている場合

WSLでBridgeインタフェースを使用し,ローカルネットワークのIPを付与している場合,usbip attachではアタッチできない.
WSL側でattach操作を行う.

attach

sudo usbip attach --remote=<HOST IP> --busid=<BUSID>

WSL側でのデバイスの確認

usbip port

detach

上記で確認したPort番号を指定する

sudo usbip detach --port=<PORT>

Windows側からdetachすることも可能

usbipd detach -b <BUSID>

他のLinuxでの利用

Bridgeの場合のWSLと同様
ただし別のマシンからのアクセスの場合,ファイアウォールで3240ポート(TCP)が許可されている必要がある.
これはBridge使用のWSLでも同じかも.

Troubleshoot

Mounting ‘C:\Program Files\usbipd-win\WSL’ within WSL failed

以下のようなエラーでattachに失敗することがある.

Windows側のusbipdからWSLへattachさせる際,C:\Program Files\usbipd-win\WSL以下にあるバイナリ・スクリプトをWSLで実行させている.
そのため,このディレクトリをdrvfsでWSLへマウントさせなければいけないが,何らかの理由で自動マウントに失敗してしまう.

以下のコマンドをWSLで実行すれば問題無くattachできるようになる.

sudo mount -t drvfs -o "ro,umask=222" "C:\Program Files\usbipd-win\WSL" "/var/run/usbipd-win"

原因はよく分かっていないが,恐らく公式配布のディストリビューションではこの問題は起きない.