はじめに
WSLでデフォルトで使われるカーネルはio_uringが無効になっています。
すこし調べると本家からフォークしたこちらのリポジトリでbzImageが配布されていてio_uringが使えるのですが、少しヘビーな使う方をするとうまく動きません。https://github.com/hatoo/io_uring_test のプログラムがうまく動きません。
今回は普通にhttps://github.com/microsoft/WSL2-Linux-Kernel のコンフィグをいじって自分でカーネルをビルドしたらうまく行ったのでそのやり方を共有します。
手順
作業はWSL上で行います
1. microsoft/WSL2-Linux-Kernelのリリースページからソースコードをダウンロードする。
クローンしたコードだとうまくいきませんでした
$ wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/linux-msft-wsl-5.10.16.3.tar.gz
2. 解凍する
$ tar -zxvf https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/linux-msft-wsl-5.10.16.3.tar.gz
$ cd linux-msft-wsl-5.10.16.3
3. コンフィグを編集してio_uringを有効にする
Microsoft/config-wslを編集してCONFIG_IO_URINGのところをCONFIG_IO_URING=yにする。
4. Make
make -j16 KCONFIG_CONFIG=Microsoft/config-wsl
5. bzImageをWindowsの適当なところに置く
例えば
cp arch/x86_64/boot/bzImage /mnt/c/Users/$(ユーザー名)/Linux/bzImage
6. .wslconfigを編集する
C:\Users\$(ユーザー名)\.wslconfigを編集して
こんな感じにする
[wsl2]
kernel = C:\\Users\\$(ユーザー名)\\Linux\\bzImage
7 WSLの再起動
Windowsのシェルで
> wsl --shutdown
ulimit -l
io_uringを使っているとmax locked memoryの値が足りなくてエラーになることがあります。
WSLだと普通のやり方ではulimitの値が変えられないようなのでその場合はhttps://github.com/microsoft/WSL/issues/1576#issuecomment-643804974 を参考にすると良いです。