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 に書いてある。
- 接続したいUSBデバイスをusbipdに登録する
- 管理者権限が必要
- デバイスの登録はWindowsの再起動後も保持される
usbipd bind --busid <N-N>
- 登録した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"
- udevを起動しようとしたときのエラーメッセージからこんな文章docker - Why udev init script default disable container support while in fact it works? - Stack Overflowを発見した。↩