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
  2. 以下のメッセージが表示された場合はセキュアブートの無効化を実行する。
    要素データ設定中にエラーが発生しました。
    この値はセキュアブートポリシーによって保護されているため、変更 または削除できません。
  3. 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
  4. ファイアウォールの許可(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
  2. カーネルのソースコード取得
    $ 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
  3. オプション選択
    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]
  4. ビルド(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
  5. 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}')
  6. 実行権限付与
    $ sudo chmod +x startusb.sh
  7. カーネルのコピー
    $ 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
  2. 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