WSL2環境からUSBシリアルデバイスを使う方法についてのメモ書きです。
標準WSL2環境のままではUSBデバイスを認識することができないのですが、ここに書いたusbipd-winツールを使用すればUSBデバイスをWindowsホスト側で使うかWSL2側で使うかを切り替えることができるようになります。
また、Arduino、ESP32、Spresenseといったボードの開発でWSL2を使用する場合、標準のWSL2 kernel(5.10.74.3)にはUSBシリアルドライバが含まれていないので、そのままでは使えません。USBシリアルドライバを有効にしたWSL2 kernelを作成する必要があります。ここに書いた方法でWSL2 kernelを更新することで、WSL2環境からUSBシリアルターミナルを表示したり、WSL2環境からUSBシリアル経由でプログラムの書き込みを実行することができるようになります。
事前環境
- Windows10 or Windows11 (私は Windows10 を使用)
- WSL2 kernel 5.10.60.1 以上がインストールされていること
- 参考: WSL2でSpresense開発環境を構築する
インストール
usbipd-winツールをインストールする
-
usbipd-winのリリースページから 最新の
usbipd-win_バージョン.msi
(例:usbipd-win_1.3.0.msi
)をダウンロードする
-
usbipd-win_バージョン.msi
を実行してWindowsPCへインストールする
WSL2環境へUSBIPツールをインストールする
- WSL2コマンドプロンプトから
linux-tools
とhwdata
をaptコマンドでインストールする
$ sudo apt install linux-tools-5.4.0-77-generic hwdata
-
usbip
コマンドを実行するためにsudo権限を変更します。visudo
コマンドでsudoersファイルを編集するためにnano
エディタを起動します
$ sudo visudo
-
secure_path
に/usr/lib/linux-tools/5.4.0-77-generic
を追加します
Defaults secure_path="/usr/lib/linux-tools/5.4.0-77-generic:/usr/local/sbin:..."
USBデバイスの接続方法
- PowerShellを管理者権限で起動します
- WindowsPCとUSB機器を接続した状態で、USBデバイスリストを表示します
- ここでの例は
BUSID
に1-1
にSilicon Labs CP210x USB to UART Bridge
が表示されています -
STATE
はNot attached
状態になっています
PS C:\windows\system32> usbipd wsl list
BUSID DEVICE STATE
1-1 Silicon Labs CP210x USB to UART Bridge (COM4) Not attached
1-3 USB 入力デバイス Not attached
- USBデバイスのうちWSL2から使用するデバイスの
BUSID
を選択してattachします
- ここでの例は
BUSID
に1-1
を指定します - attach後にもう一度list表示すると
STATE
がAttached
状態に変更されていることを確認できます
PS C:\windows\system32> usbipd wsl attach --busid 1-1
[sudo] password for mario: (ここでパスワードを入力する)
PS C:\windows\system32> usbipd wsl list
BUSID DEVICE STATE
1-1 Silicon Labs CP210x USB to UART Bridge (COM4) Attached - Ubuntu-20.04
1-3 USB 入力デバイス
- WSL2側で、
lsusb
コマンドを実行する
-
Silicon Labs CP210x UART Bridge
が接続されていることが確認できます
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ただしこの時点では、CP210xドライバがインストールされておらず、/dev/ttyUSB0デバイスが見つかりません。/dev/ttyUSB0として利用するためには、後述する WSL2 kernelのビルドが必要になります
- もし、USB接続をWindows側に戻したいときは、
BUSID
を指定してdetachを実行するか、もしくはUSBを抜き差しすると元に戻ります
- ここでの例は
BUSID
に1-1
を指定してdetachを実行しています - detach後にもう一度list表示すると
STATE
がNot attached
状態に変わっていることが分かります
PS C:\windows\system32> usbipd wsl detach --busid 1-1
PS C:\windows\system32> usbipd wsl list
BUSID DEVICE STATE
1-1 Silicon Labs CP210x USB to UART Bridge (COM4) Not attached
1-3 USB 入力デバイス Not attached
CP210X USBドライバを認識させるためにkernelをリビルドする
- Kerelビルドに必要なツールをaptコマンドでインストールします
$ sudo apt install build-essential flex bison libssl-dev libelf-dev dwarves libncurses-dev
- WSL2リポジトリをクローンします
$ git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
$ cd WSL2-Linux-Kernel
- menuconfigを開いて
CONFIG_USB_SERIAL_CP210X
を有効にします
$ make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl
- Spresenseで使用する
USB CP210x family of UART Bridge Controllers
(CONFIG_USB_SERIAL_CP210X
)は次の階層にあります
-> Device Drivers
-> USB support (USB_SUPPORT [=y])
-> USB Serial Converter support (USB_SERIAL [=y])
- WSL2 kernelをビルドします
$ make -j4 KCONFIG_CONFIG=Microsoft/config-wsl
- ビルドしたイメージをWindowsディレクトリにコピーします
- ユーザー名のmarioは、自分のユーザー名に置き換えてください
$ cp arch/x86/boot/bzImage /mnt/c/Users/mario/wsl_kernel
- Windows側に
.wslconfig
ファイルを作成して、kernel=
でさきほど作成したwsl_kernel
を指定します
$ nano /mnt/c/Users/mario/.wslconfig
[wsl2]
kernel = C:\\Users\\mario\\wsl_kernel
- WSLを一旦シャットダウンします
PS C:\windows\system32> wsl --shutdown
- WSL2を再び起動します
- WSL2起動後にバージョンを確認すると新しいカーネルで起動していることを確認できます
-
/proc/config.gz
でCONFIG_USB_SERIAL_CP210X
が有効になっていることを確認できます
$ cat /proc/version
Linux version 5.10.74.3-microsoft-standard-WSL2+ (mario@DESKTOP-UKT9H1D) (gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #1 SMP Fri Jan 7 00:32:37 JST 2022
$ zcat /proc/config.gz | grep CONFIG_USB_SERIAL_CP210X
CONFIG_USB_SERIAL_CP210X=y
- USBデバイスの接続方法 をもう一度実行します
- USBシリアルデバイスドライバが正常に動作していれば
/dev/ttyUSB0
が表示されます
TIPS
usbipd
を実行したときにusbipd: warning: Server is currently not running.
が表示される
PS C:\windows\system32> usbipd wsl list
BUSID DEVICE STATE
1-1 Silicon Labs CP210x USB to UART Bridge (COM4) Not attached
1-3 USB 入力デバイス Not attached
usbipd: warning: Server is currently not running.
usbipd-win_バージョン.msi
を起動してRepair
を実行すると治ります
メモ追記(2022/06/05)
WSL2をUbuntu22.04に更新したときにusbipdの利用手順が変わっていたことに気が付いたので追記。
usbipd-winのリリースページから最新版usbipd-win_2.3.0.msi
を落としてきて更新する。
あとはこちらのWikiページを参考に、
$ sudo apt upgrade
$ sudo apt update
$ sudo apt install linux-tools-virtual hwdata
$ sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*/usbip 20