• Windows Subsystem for Linuxガイド 第29回 USBデバイスをWSLで使う - その3

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ギガバイト程度のファイルをダウンロードするため、数分かかる。

  • 写真01: ソースコードを保存するディレクトリを作ったら、以下のコマンドを使って、ソースコードのクローン、menuconfigの実行(操作は図01参照)、そしてコンパイル(makeコマンド)を行う

カーネルの構成変更とコンパイル

コマンドが終了したら、以下のコマンドを使って、memuconfigを起動する。


make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl

ここからは、カーソルキーやタブキーを使ったTUI(Text User Interface)での操作になる(写真02)。起動したページをここでは「トップレベル」と呼ぶ。修正箇所は全部で3つ。「ローカルバージョン文字列の変更」、「USB Mass Storageの有効化」、「BTFのオフ」である。

  • 写真02: コマンドを実行するテキストをカーソルキーやタブキーなどで操作できるTUIのmenuconfigが開く

まずは、トップレベルから「General Setup ⇒ Local version」を選択して、ローカルバージョン文字列を変更する(図01)。これは、起動したLinuxでカーネルのバージョンを示す文字列となる。行わなくても動作するが、自分で作ったカーネルとWSL本来のカーネルの区別ができなくなってしまう。できれば、ここは設定し、自分でコンパイルしたカーネルか、本来のカーネルのどちらでWSLを動かしているのかを区別できるようにしておく。

  • 図01: 最初にローカルバージョンの書き換えを行う。カーソルキーでとエンターキーでGeneral Setup ⇒ Local versionと選択していく。文字列変更ダイアログに自分で作成したことがわかる文字列を入れておく。起動するとuname -aコマンドで表示できる

設定したらタブキーやカーソルキー右でExitを選択し、トップレベルに戻る。次に「Device Drivers ⇒ USB support ⇒ USB Mass Storage support」と移動し、Yキーで、USB Mass Storage supportの行頭にある“< >”(OFF状態を示す)を“<*>”(同ON)に変更する(図02)。

  • 図02: トップレベルからDevice Drivers ⇒ USB support ⇒ USB Mass Storage supportと進み、yキーで有効化する。その後Exitでトップレベルに戻る

最後にトップレベルから「Kernel hacking ⇒ Compile-time checks and compiler options ⇒ Generate BTF typeinfo」に移動して、Nキーで設定をOFF状態にする(図03)。

  • 図03: トップレベルからKernel hacking ⇒ Compile-time checks and compiler options ⇒ Generate BTF typeinfoと進み、nキーで無効化する。そのごExit2回でトップレベルに戻りmenuconfigを終了する

再びトップレベルに戻り、さらにExitを選択すると、終了確認(写真03)が出るので、“< Yes >”を選択して保存して抜ける。

  • 写真03: トップレベルでExitを選択すると、menuconfigが終了確認を行う(修正した場合)。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/