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