2021年10月24日日曜日

WSL2 の Ubuntu 18.04 で WSL2 カーネルをビルドして差し替える

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

カーネル更新

現在のカーネルバージョンを確認

mikoto@DESKTOP-CO13JB2:~$ uname -r
5.4.91-microsoft-standard-WSL2

カーネルバージョンにあったカーネルをチェックアウト

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 で、カーネルモジュールの設定を行う。

sudo 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 再起動

wsl --shutdown
wsl -d Ubuntu-18.04

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 経由でやり取りするためにアプリインストールとかあるらしくめげた。今日はここまで。

以上。

参考資料

0 件のコメント:

コメントを投稿