使用 qemu-nbd 需要 nbd 内核模块,有趣的是 WSL2 没有提供, apt-cache search linux-headers-$(uname -r) 也是啥也没有,只好手动编译。

uname -r 找到自己的版本,去 https://github.com/microsoft/WSL2-Linux-Kernel 找 Release Tag

$ uname -r

5.10.16.3-microsoft-standard-WSL2

依赖包:

$ sudo apt-get install build-essential bison libelf-dev libncurses-dev

编译安装:

$ unzip WSL2-Linux-Kernel-linux-msft-wsl-5.10.16.3.zip
$ cd WSL2-Linux-Kernel-linux-msft-wsl-5.10.16.3
$ cp Microsoft/config-wsl .config
$ make menuconfig

找到 Device Drivers 下的 Block devices 下的 Network block device support 选中为 built-in 。

$ make -j $(expr $(nproc) - 1)

……省略输出
  ZOFFSET arch/x86/boot/zoffset.h
  OBJCOPY arch/x86/boot/vmlinux.bin
  AS      arch/x86/boot/header.o
  LD      arch/x86/boot/setup.elf
  OBJCOPY arch/x86/boot/setup.bin
  BUILD   arch/x86/boot/bzImage
Kernel: arch/x86/boot/bzImage is ready  (#3)

最后会生成一个 bzImage ,将其拷贝出来,假设放在 C:\Users\weilinfox\bzImage (其中 weilinfox 是假设的用户名)。

建立 C:\Users\weilinfox\.wslconfig ,加入(注意双反斜杠):

[wsl2]
kernel=C:\\Users\\weilinfox\\bzImage

进入 powershell 运行:

wsl --shutdown

重新启动 WSL2 即可。 ls /dev 应该就可以看到 nbd 设备了。

参考:https://unix.stackexchange.com/questions/594470/wsl-2-does-not-have-lib-modules

by SDUST weilinfox