概要
WSL2で動作しているUbuntu20.04でwindowsで認識したUSBデバイスを使えるようにする。
前提
- Windows 11 (ビルド 22000 以降)
- x64/x86 プロセッサ(Intel or AMD)
- WSL 2
- Linux カーネル 5.10.60.1 以上が実行されている
手順
認識させたいディストリが既定に設定されてることを確認する。
> wsl --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 (既定)
Ubuntu-18.04
docker-desktop-data
docker-desktop
既定になってない場合は、既定に設定する。
> wsl --set-default <ディストリID>
usbipdをインストール
公式リポジトリ からmsiをダウンロードしてインストール。
windowsホストでバスIDを調べてWSL2にアタッチする
powershellを管理者権限で実行して以下を実行
> usbipd wsl list
BUSID VID:PID DEVICE STATE
2-6 045e:0990 Surface Camera Front, Surface IR Camera Front Not attached
2-14 0411:023a USB 大容量記憶装置 Not attached
バスIDを指定してデバイスをアタッチ
> usbipd wsl attach --busid 2-14
USBデバイスを取り外したい場合はでタッチを実行する
> usbipd wsl detach --busid 2-14
(option)カーネルをリビルドする
デフォルトだとUSBメディアがブロックデバイスとして認識されないので、オプションを追加してカーネルをリビルドする必要がある。
以下の手順をWSL2のUbuntuで実行する。
依存パッケージをインストール
$ sudo apt install -y \
build-essential \
git \
flex \
bison \
libssl-dev \
libelf-dev \
pkg-config \
libncurses-dev \
dwarves
カーネルのソースをクローン
$ git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
$ cd WSL2-Linux-Kernel/
$ cp ./Microsoft/config-wsl .config
$ make menuconfig
コンソールで設定メニューが開くので、
Device Drivers
-> USB support
-> USB Mass Storage support
の順番で項目を探して、USB Mass Storage supportにチェックを入れる(スペースキーでチェック)
チェックを入れたらSaveしてExit
設定を変更出来たらビルドする
$ make -j $(nproc)
ビルドした vmlinux
をWindowsホストにコピーする
$ sudo mkdir -p /mnt/c/wslkernel
$ sudo cp ./vmlinux /mnt/c/wslkernel/
ホストPCのユーザ直下に .wslconfig
を作成して先ほど作成したカーネルを指定する
[wsl2]
kernel=C:\\wslkernel\\vmlinux
WSL2をシャットダウン
> wsl --shutdown
ビルドしたカーネルドライバをインストール
$ sudo insmod ./drivers/usb/storage/usb-storage.ko
powershellからデバイスをアタッチするとUSBメディアが認識されるようになる。
以下の例だとsdfが対象のデバイス
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 331.6M 1 loop /mnt/wsl/docker-desktop/cli-tools
loop1 7:1 0 302.9M 1 loop
sda 8:0 0 256G 0 disk
sdb 8:16 0 339.8M 1 disk
sdc 8:32 0 256G 0 disk /
sdd 8:48 0 256G 0 disk /mnt/wsl/docker-desktop/docker-desktop-proxy
sde 8:64 0 256G 0 disk /mnt/wsl/docker-desktop-data/isocache
sdf 8:80 1 14.8G 0 disk
├─sdf1 8:81 1 499M 0 part
└─sdf2 8:82 1 14.3G 0 part