https://github.com/rpasek/usbip-wsl2-instructions
https://github.com/cezanne/usbip-win
https://snowstar.org/2020/06/14/wsl2-usb-via-usbip/
WSL のカーネルをカスタムしてUSB デバイスにアクセスしてみました。

$ uname -r -v
4.19.104-microsoft-standard #1 SMP Mon Jul 6 18:00:19 JST 2020
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

環境

  • セキュアブート無効
  • Windows 10 Insider Preview Build 20161
    • usbip-win 0.3.0
    • WSL2 (Ubuntu 20.04 LTS)

構築(Windows 10)

USBIP-WIN のインストール

  1. ファイルのダウンロード
    https://github.com/cezanne/usbip-win/releases
    usbip-win 0.1.0 のAssets からダウンロード
  2. 証明書のインポート
  • usbip_test.pfxをダブルクリック
  • パスワードは「usbip」
  • 保存場所はローカルコンピュータ
  • 以下の2つの証明書ストアに繰り返して配置
    • 信頼されたルート証明機関
    • 信頼された発行元
  1. テスト署名されたドライバーの読み込みの有効化
>bcdedit.exe /set TESTSIGNING ON
  1. 以下のメッセージが表示された場合はセキュアブートの無効化を実行する。
要素データ設定中にエラーが発生しました。
この値はセキュアブートポリシーによって保護されているため、変更 または削除できません。
  1. USB 一覧の表示と転送
    マスストレージデバイス(busid = 1-112)の場合
>usbip.exe list -l
- busid 1-112 (0bda:0169)
Realtek Semiconductor Corp. : Mass Storage Device (0bda:0169)
>usbip.exe bind -b 1-112
usbip: info: bind_device: bind device on busid 1-112: complete
> usbipd.exe -d -4
  1. ファイアウォールの許可(TCP port 3240)の問い合わせがあったら許可する。

構築(WSL)

カーネルのビルド

  1. ビルド用パッケージのインストールと現在のカーネルバージョンの確認
$ sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool
$ uname -r
4.19.104-microsoft-standard
  1. カーネルのソースコード取得
$ sudo git clone https://github.com/microsoft/WSL2-Linux-Kernel.git /usr/src/4.19.104-microsoft-standard
$ cd /usr/src/4.19.104-microsoft-standard
$ sudo git checkout v4.19.104
$ sudo cp /proc/config.gz config.gz
$ sudo gunzip config.gz
$ sudo mv config .config
$ sudo make menuconfig
  1. オプション選択
Device Drivers->USB support[*]
Device Drivers->USB support->Support for Host-side USB[M]
Device Drivers->USB support->Enable USB persist by default[*]
Device Drivers->USB support->USB Modem (CDC ACM) support[M]
Device Drivers->USB support->USB Mass Storage support[M]
Device Drivers->USB support->USB/IP support[M]
Device Drivers->USB support->VHCI hcd[M]
Device Drivers->USB support->VHCI hcd->Number of ports per USB/IP virtual host controller(8)
Device Drivers->USB support->VHCI hcd->Number of USB/IP virtual host controllers(1)
Device Drivers->USB support->USB Serial Converter support[M]
Device Drivers->USB support->USB Serial Converter support->USB FTDI Single Port Serial Driver[M]
Device Drivers->USB support->USB Physical Layer drivers->NOP USB Transceiver Driver[M]
Device Drivers->Network device support->USB Network Adapters[M]
Device Drivers->Network device support->USB Network Adapters->[Deselect everything you don't care about]
Device Drivers->Network device support->USB Network Adapters->Multi-purpose USB Networking Framework[M]
Device Drivers->Network device support->USB Network Adapters->CDC Ethernet support (smart devices such as cable modems)[M]
Device Drivers->Network device support->USB Network Adapters->Multi-purpose USB Networking Framework->Host for RNDIS and ActiveSync devices[M]
  1. ビルド(6 多重で実行)
$ sudo make -j 6 && sudo make modules_install -j 6 && sudo make install -j 6
$ cd tools/usb/usbip
$ sudo ./autogen.sh
$ sudo ./configure
$ sudo sed 's/-Werror//g' -i Makefile
$ sudo sed 's/-Werror//g' -i src/Makefile
$ sudo sed 's/-Werror//g' -i libsrc/Makefile
$ sudo make install -j 6
$ sudo cp libsrc/.libs/libusbip.so.0 /lib/libusbip.so.0
  1. USB 有効化スクリプトの作成
$HOME/startusb.sh
#!/bin/bash
sudo modprobe usbcore
sudo modprobe usb-common
sudo modprobe hid-generic
sudo modprobe hid
sudo modprobe usbnet
sudo modprobe cdc_ether
sudo modprobe rndis_host
sudo modprobe usbserial
sudo modprobe usb-storage
sudo modprobe cdc-acm
sudo modprobe ftdi_sio
sudo modprobe usbip-core
sudo modprobe vhci-hcd
echo $(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
  1. 実行権限付与
$ sudo chmod +x startusb.sh
  1. カーネルのコピー
$ cp /usr/src/4.19.104-microsoft-standard/vmlinux /mnt/c/Users/<username>/

構築(Windows 10)

WSL のカーネルファイル指定

  1. WSL のカーネル指定
C:\Users\ユーザ名\.wslconfig
[WSL2]
kernel=C:\\Users\\<username>\\vmlinux
  1. WSL のシャットダウン(再起動)
>wsl --shutdown

構築(WSL)

カーネルの確認とUSB アクセス

  1. カーネルの確認とUSB デバイスの参照
$ uname -r -v
4.19.104-microsoft-standard #1 SMP Mon Jul 6 18:00:19 JST 2020
$ ./startusb.sh
$ sudo usbip attach --remote=192.168.11.2 --busid=1-112
$ sudo dmesg
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub