見出し画像

WSL2でホストマシン上のUSBデバイスを使用する方法

はじめに

WSL2を実現する仮想化技術Hyper-Vでは,Windowsホスト側のUSBデバイスが認識できないという問題があります.これはHyper-V自体にUSB仮想化という機能がないためで,今後もサポートされることは期待できないでしょう.
そこでUSB IPという仮想化ネットワーク経由でUSBデバイスを使用する方法が存在しており、今回はそれを利用しUSBデバイスをWSL2上で利用する方法を自分の備忘録も兼ねて記録しておこうと思います.

初期セットアップ

まずWindows 10または11を使用しており,すべてのWSLアップデートがインストールされていることを確認してください.WSLのディストロ上からuname -aを実行してカーネルバージョンが5.10.60.1以降であることを確認してください.
以下はコマンド実行時の出力例です.

user@hostname:~$ uname -a
Linux hostname 5.10.102.1-microsoft-standard-WSL2 #1  SMP Wed Mar 2 00:30:59 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

次にUSB/IP Windowsをインストール必要があります.以下のコマンドを管理者モードでPowerShellから実行するか,Githubのレポジトリからインストールファイルをダウンロードしてインストールしてください.
winget install usbipd
https://github.com/dorssel/usbipd-win
 
WSL2から,USB/IP用のユーザースペースツールとUSBハードウェア識別子のデータベースをインストールします.ここではUbuntuの場合を想定していますが他のディストリビューションでは,別のusbipクライアント・パッケージが必要な場合があります.Ubuntu 20.04 LTSでは,以下のコマンドを実行してください.

sudo apt install linux-tools-5.4.0-77-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20

これでLinux側で使用するUSB/IP経由でホストマシンに繋いだUSBデバイスを使用する準備が整います.

USBデバイスをWSL側で使用可能にする方法

管理者権限でPowershellを開き以下のコマンドを実行します.

usbipd wsl list

WSL にアタッチしたいデバイスのバス ID を選択し,以下のコマンドを実行します.

usbipd wsl attach --busid <busid>

私の環境下での実行例を載せておきます.
以下のようにWindowsホスト側ですでに接続されているUSB機器がすべて表示されてますが,ここでは,USB Serial ConverterのみWSL2にアタッチしています.

usbpidコマンドの実行例

WSL内でlsusbを実行し,接続されているUSBデバイスをリストアップします.今アタッチしたデバイスが表示され,通常のLinuxツールを使って操作できるはずです.アプリケーションによっては,非 root ユーザーがデバイスにアクセスできるように udev ルールを設定する必要があるかもしれません.

dmesgコマンドを私の環境で実行した例を載せておきます.

[    0.409397] usbcore: registered new interface driver cdc_acm
[    0.409398] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[    0.409412] usbcore: registered new interface driver ch341
[    0.409416] usbserial: USB Serial support registered for ch341-uart
[    0.409422] usbcore: registered new interface driver cp210x
[    0.409426] usbserial: USB Serial support registered for cp210x
[    0.409430] usbcore: registered new interface driver ftdi_sio
[    0.409434] usbserial: USB Serial support registered for FTDI USB Serial Device

ここでは,USBシリアルコンバータをアタッチした結果,FTDI USB Serial Deviceが認識されていることがわかります.
USBシリアルコンバーターの場合はシリアルポートがWSL2側で使用可能になったか確認してみましょう.ここではpython3でシリアル通信モジュールのテスト用コマンドを実行します.
python3 –m serial.tools.list_ports -v

出力結果は/dev/ttyUSB0にマウントされていることが分かります.
自作のプログラムの場合は上記のポートを開いて動作確認,マイコンなどの書き込みツールでも明示的にポート指定して動くことを確認してください.

まとめ

仕事でUSBデバイスをWSL2に認識される必要があったので,自分の備忘録も兼ねて解説してみました.もちろんLinux専用の開発環境がある人はそのほうが手っ取り早いですが,普段Windows機で開発を行っていてたまたまLinux上でUSBハードにアクセスするアプリ開発を行うときなど便利だなと感じました.JTAG書き込みのツールなどは試していませんが,他のwebサイトを観察する限りでは,問題なく上記の方法で使えているようです.


この記事が気に入ったらサポートをしてみませんか?