Windows -> WSL2 Ubuntu への USB カメラパススルーを行う前準備として、 USB/V4L2 関連の機能を有効にしたカーネルをビルドし、差し替える方法をまとめた。
現時点で USB カメラへの接続まで確認できていないが、とりあえず作業記録を残す。
前提
- ホスト OS: Windows 11 Pro 21H2
- ゲスト OS: Ubuntu 18.04(WSL2)
検証環境の準備
以前使っていた環境が残っていたので、 Ubuntu 環境を削除して作り直す
PS C:\Users\mikoto> wsl -l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-18.04 (既定)
docker-desktop-data
docker-desktop
PS C:\Users\mikoto> wsl --unregister Ubuntu-18.04
登録を解除しています...
PS C:\Users\mikoto> wsl -l
Linux 用 Windows サブシステム ディストリビューション:
docker-desktop-data (既定)
docker-desktop
PS C:\Users\mikoto> wsl --install -d Ubuntu-18.04
Ubuntu 18.04 LTS は既にインストールされています
Ubuntu 18.04 LTS を起動しています...
この流れで Ubuntu が起動するので、続けて作業していく。
パッケージアップグレードと必要パッケージのインストール
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool
カーネル更新
現在のカーネルバージョンを確認
カーネルバージョンにあったカーネルをチェックアウト
sudo git clone --depth 1 https://github.com/microsoft/WSL2-Linux-Kernel -b linux-msft-5.4.91 /usr/src/5.4.91-microsoft-standard
念のためチェックアウトしたブランチを確認。
mikoto@DESKTOP-CO13JB2:~$ cd /usr/src/5.4.91-microsoft-standard/
mikoto@DESKTOP-CO13JB2:/usr/src/5.4.91-microsoft-standard$ git log
commit 807335635710b9038f2bb95019878d846130501a (grafted, HEAD, tag: linux-msft-5.4.91)
Author: Vivek Yadav <vyadav@microsoft.com>
Date: Wed Jan 20 18:25:17 2021 +0000
Merge remote-tracking branch 'msft/linux-msft-wsl-5.4.y' into linux-msft-wsl-5.4.y
mikoto@DESKTOP-CO13JB2:/usr/src/5.4.91-microsoft-standard$ cd -
/home/mikoto
linux-msft-5.4.91
のタグがチェックアウトされているのを確認できる。
現在のカーネル設定をコピー
cd /usr/src/5.4.91-microsoft-standard/
sudo cp /proc/config.gz config.gz
sudo gunzip config.gz
sudo mv config .config
カーネルモジュール設定
make menuconfig
で、カーネルモジュールの設定を行う。
以下に今回変更したものだけ記載する。環境によって差があるかも…。
■ USB 関連
Device Drivers
+- [*] USB support
+- <M> Support for Host-side USB
+- <M> USB Modem (CDC ACM) support
+- <M> USB Mass Storage support
+- <M> USB/IP support
| +- <M> VHCI hcd
+- <M> USB Serial Converter support
| +- <M> USB FTDI Single Port Serial Driver
+- USB Physical Layer drivers
| +- <M> NOP USB Transceiver Driver
+- Network device support
+- <M> USB Network Adapters
+- <M> Multi-purpose USB Networking Framework
| +- <M> Host for RNDIS and ActiveSync devices
+- <M> Multi-purpose USB Networking Framework
■ V4L2 関連
Device Drivers
+- <M> Multimedia support
+- [*] Cameras/video grabbers support
+- [*] Media USB Adapters
+- <M> USB Video Class (UVC)
カーネルのビルドとインストール
gcc 8 以上でないとコンパイルできないコードがあるため、 gcc のバージョンを上げて make
する。
sudo apt-get install -y gcc-8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8
sudo make -j 12 && sudo make modules_install -j 12 && sudo make install -j 12
カーネルを Windows から見られる場所へコピー
sudo mkdir /mnt/c/Users/mikoto/.wsl
sudo cp /usr/src/5.4.91-microsoft-standard/vmlinux /mnt/c/Users/mikoto/.wsl/
新カーネルで WSL 起動
起動カーネル設定
~/.wslconfig
で、使用するカーネルを指定する。
[WSL2]
kernel=C:\\Users\\mikoto\\.wsl\\vmlinux
WSL 再起動
uname
で確認すると、新しいカーネルで起動しているのがわかる。
mikoto@DESKTOP-CO13JB2:/mnt/c/Users/mikoto$ uname -a -r
Linux DESKTOP-CO13JB2 5.4.91-microsoft-standard-WSL2+ #1 SMP Sun Oct 24 09:46:32 JST 2021 x86_64 x86_64 x86_64 GNU/Linux
ここから Windows -> Ubuntu への USB カメラパススルーまでもっていきたかったけど、 IP 経由でやり取りするためにアプリインストールとかあるらしくめげた。今日はここまで。
以上。