WSLでUSBデバイスを利用する方法を解説する記事の3回目になる。初回はusbipd-winの解説、2回目でコマンドを解説し、USBシリアルによる開発ボードの接続をおこなった。今回は、usbipd-winでUSB大容量記憶(Mass Storage)デバイスを接続するため、WSLのLinuxカーネルの構成を変更する。そのためには、Linuxカーネルのソースコードを入手して、再コンパイルしなければならない。
なお、前回の記事のあと、usbipd-winがアップデートし、WSLのLinuxカーネルも更新された。前回とは動作環境が若干異なっている(後述)。
カーネルコンパイルの準備
カーネルをコンパイルは、Linux側で行う。まずは、以下のコマンドで、コンパイルに必要なプログラムをインストールしておく。
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool zip unzip v4l-utils libssl-dev python3-pip cmake git iputils-ping net-tools dwarves -y
次にカーネルのソースコードを取得する。原稿執筆時点での最新版はlinux-msft-wsl-5.15.133.1である。
まずは、適当なディレクトリを用意する。ここではユーザーのホームディレクトリに「wsl2-kernel」という名前で作成したと仮定する。なお、このフォルダは、WSL2側のext4ファイルシステム側に作成する。/mnt/cなどのWin32側に置くと、アクセス速度が遅く、処理やコンパイルが遅くなってしまう。
次のgitコマンドでソースコードのクローンを行う(写真01)。
cd wsl2-kernel
git clone -b linux-msft-wsl-5.15.133.1 https://github.com/microsoft/WSL2-Linux-Kernel.git .
環境にもよるが2ギガバイト程度のファイルをダウンロードするため、数分かかる。
カーネルの構成変更とコンパイル
コマンドが終了したら、以下のコマンドを使って、memuconfigを起動する。
make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl
ここからは、カーソルキーやタブキーを使ったTUI(Text User Interface)での操作になる(写真02)。起動したページをここでは「トップレベル」と呼ぶ。修正箇所は全部で3つ。「ローカルバージョン文字列の変更」、「USB Mass Storageの有効化」、「BTFのオフ」である。
まずは、トップレベルから「General Setup ⇒ Local version」を選択して、ローカルバージョン文字列を変更する(図01)。これは、起動したLinuxでカーネルのバージョンを示す文字列となる。行わなくても動作するが、自分で作ったカーネルとWSL本来のカーネルの区別ができなくなってしまう。できれば、ここは設定し、自分でコンパイルしたカーネルか、本来のカーネルのどちらでWSLを動かしているのかを区別できるようにしておく。
設定したらタブキーやカーソルキー右でExitを選択し、トップレベルに戻る。次に「Device Drivers ⇒ USB support ⇒ USB Mass Storage support」と移動し、Yキーで、USB Mass Storage supportの行頭にある“< >”(OFF状態を示す)を“<*>”(同ON)に変更する(図02)。
最後にトップレベルから「Kernel hacking ⇒ Compile-time checks and compiler options ⇒ Generate BTF typeinfo」に移動して、Nキーで設定をOFF状態にする(図03)。
再びトップレベルに戻り、さらにExitを選択すると、終了確認(写真03)が出るので、“< Yes >”を選択して保存して抜ける。
その後、以下のコマンドでカーネルのコンパイルを行う。“-j”は並列実行するオプションで“$(nproc)”はCPUのコア数を表す。
make -j$(nproc) KCONFIG_CONFIG=Microsoft/config-wsl
マシンにもよるが、コンパイルにはかなり時間が掛かる。最後に“Kernel: arch/x86/boot/bzImage is ready”といったメッセージが、出ればコンパイルは成功している。ソースコードを保存したディレクトリに「vmlinux」というファイルができているはずだ。
カーネルのコンパイルでは、ソースコードや利用するコマンドのバージョンなどにより、異なる手順が必要になる、あるいは問題が発生することもある。今回は、Windows 11 Ver.23H2(OSビルド 22631.2861)の上で、WSL バージョン2.0.14.0を使い、Linuxカーネル5.15.133.1をコンパイルした。
WSLやLinuxカーネルのバージョンが異なる場合を除いてmakeコマンドがエラーを出すような場合、aptコマンドによるソフトウェアの更新などを行う必要があるかもしれない。
次回は、コンパイルしたカーネルに差し替えてWSLを起動し、usbipd-winをアップデートして、USB Mass Storageデバイスを接続してみる。
> Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/