usbipd-winをインストールしてWSL(Debian)とUSBデバイスを接続できるようにした

2023年12月時点でのやりかたをメモしとく。

  • Windows 10 Pro 22H2
    • Windowsバージョン 10.0.19045.3803
  • WSLバージョン 2.0.9.0
    • カーネルバージョン 5.15.133.1-1
  • Debian GNU/Linux 12 (bookworm)
    • debian_version 12.4
  • usbipd-win
    • 4.0.0+182.Branch.master.Sha.2ffe37ec799b9e73eb9d23d051d980fefb616ce1

USB デバイスを接続する | Microsoft Learn
Microsoftのドキュメントがあるのでそのとおりにする。LinuxディストリビューションがDebianなことと、この時点ではusbipd-winのコマンドのwslサブコマンドが廃止になったりして最新バージョンと違っていた。さらにudevの有効化もした。

WSLのDebianに必要なパッケージ

apt install usbip usbutils
  • パッケージ usbip: USB/IPのクライアントが含まれている
  • パッケージ usbutils: lsusbコマンドが含まれている

usbipd-winの使い方

詳細は WSL support · dorssel/usbipd-win Wiki · GitHub に書いてある。

  1. 接続したいUSBデバイスをusbipdに登録する
    • 管理者権限が必要
    • デバイスの登録はWindowsの再起動後も保持される
    • usbipd bind --busid <N-N>
  2. 登録したUSBデバイスをWSLにアタッチする
    • 接続する都度にアタッチする必要がある
    • usbipd attach --wsl --hardware-id <VID:PID>
    • --auto-attachオプションを付ければ、USBコネクタの抜き差しで再アタッチしてくれる

使ってないけれど、GUIツールがあるらしい
Announcement: Windows Gui Tool · dorssel/usbipd-win · Discussion #389 · GitHub

とりあえずは、WSL側からauto-attachなバックグラウンドジョブで実行させる

/mnt/c/Program\ Files/usbipd-win/usbipd.exe attach -w -a -i <VID:PID> < /dev/null > /dev/null 2>&1 &

udevを動作させる

WSLのDebianではudevがインストールされているが、自動では起動していない1。udevがあれば、USBデバイスが接続されたときに構成されたルールに従ってパーミッションが設定される。既定の構成だと、USBシリアルデバイスを接続した場合パーミッションが
crw-rw---- 1 root dialout ... /dev/TTYUSB0
になる。udevが動いていないと
`crw------- 1 root root ... /dev/TTYUSB0
になってしまう。詳しくは分からんが、支障があって動作させていないわけではなさそう。なので、wsl.confファイルでWSLディストリビューション起動時にudevを起動させる。

[boot]
command = "service udev start"

  1. udevを起動しようとしたときのエラーメッセージからこんな文章docker - Why udev init script default disable container support while in fact it works? - Stack Overflowを発見した。