1. 内核源码
编译模块需要内核源码信息,wsl是修改过的内核无法使用下面的命令从标准镜像源上下载内核源码信息。
sudo apt-get install kernel-headers-$(uname -r)
sudo apt-get install kernel-devel-$(uname -r)
2. 下载wsl内核源码
可以考虑下载wsl的源码重新进行编译,wsl的源码仓库WSL2-Linux-Kernel,当前默认的分支是linux-msft-wsl-6.6y
,我们可以去release页面下载我们系统对应的版本。
$ uname -r
5.15.153.1-microsoft-standard-WSL2
我使用的内核版本是5.15.153.1
,下载linux-msft-wsl-5.15.153.1.tar.gz,文件大小约189.8MB,解压后大约1GB。
3. 编译内核
下载后将压缩包解压到wsl文件系统中,配置编译环境。
# 解压文件,文件在windows F:\迅雷下载\WSL2-Linux-Kernel-linux-msft-wsl-5.15.153.1.tar.gz
mkdir kernel; cd kernel
tar -zxf /mnt/f/迅雷下载/WSL2-Linux-Kernel-linux-msft-wsl-5.15.153.1.tar.gz
cd WSL2-Linux-Kernel-linux-msft-wsl-5.15.153.1
# 安装依赖包,这个是github上推荐的依赖包
sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev cpio
# 执行make menuconfig时提示缺少的安装包
sudo apt install pkg-config libncurses-dev
# 将配置文件拷贝一份
cp Microsoft/config-wsl .config
# 使用make menuconfig 进行配置,因为已经拷贝了一个.config,故可以不再指定KCONFIG_CONFIG
# make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl
make menuconfig
# 编译内核,我电脑有12个核24线程,使用-j16,即16线程进行编译
#make KCONFIG_CONFIG=Microsoft/config-wsl -j16
make -j16
# 从git编译的代码会带有+号,可以通定义LOCALVERSION=(空),进而取消+号
#LOCALVERSION= make -j16
# 第一次下载了6.6那个版本,一共编译了35分钟,ext4.vhdx文件增加了约10GB
# 5.15.153.1一共编译了13分钟,编译后目录的大小为5.2GB
# 编译成功后可以看到 Kernel: arch/x86/boot/bzImage is ready (#1),将这个文件拷贝到任意windows目录下,我把它和ext4.vhdx文件放在了一起
cp arch/x86/boot/bzImage /mnt/f/wsl/Ubuntu-24.04/
# 查看一下当前更新前内核的信息
uname -a
Linux asus 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
4. 更新内核
内核编译成功后需要在用户目录%UserProfile%
中创建.wslconfig
文件,对应到我的电脑是C:\Users\xflm\.wslconfig
,内容如下。
[wsl2]
kernel=F:\\wsl\\Ubuntu-24.04\\bzImage
打开windows终端,关闭wsl,等待8s后重新启动wsl。
> wsl --shutdown
进入wsl之后查看下当前的内核信息,和之前的已经不同了,表示内核替换成功了。
$ uname -a
Linux asus 5.15.153.1-microsoft-standard-WSL2 #1 SMP Wed Oct 2 13:14:07 CST 2024 x86_64 x86_64 x86_64 GNU/Linux
5. 更新驱动模块
# /lib/modules下面空空的,需要到WSL2-Linux-Kernel-linux-msft-wsl-5.15.153.1目录
$ cd ~/workspace/kernel/WSL2-Linux-Kernel-linux-msft-wsl-5.15.153.1
# 编译模块,这一步在之前编译的时候已经做过了,这条命令很快就结束了
$ make modules -j16
# 使用管理员权限更新modules目录
$ sudo make modules_install
arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/block/nbd.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/net/bonding/bonding.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/net/dummy.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/net/vrf.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/usb/serial/ch341.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/usb/serial/cp210x.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/usb/serial/ftdi_sio.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/usb/serial/usbserial.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/net/ipv4/ipip.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/net/ipv4/tunnel4.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/net/ipv6/sit.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/net/netfilter/xt_CT.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/net/netfilter/xt_bpf.ko
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/net/netfilter/xt_u32.ko
DEPMOD /lib/modules/5.15.153.1-microsoft-standard-WSL2
# 这一步不知道做了什么,应该不需要做
$ sudo make install
arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support
sh ./arch/x86/boot/install.sh 5.15.153.1-microsoft-standard-WSL2 \
arch/x86/boot/bzImage System.map "/boot"
run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 5.15.153.1-microsoft-standard-WSL2 /boot/vmlinuz-5.15.153.1-microsoft-standard-WSL2
# 安装模块依赖文件
$ sudo make headers_install ARCH=x86_64
# 查看内核源码信息,已经存在了
$ ls /lib/modules/$(uname -r)/build
...
6. 内核更新前后的变化
此时通过windows终端关闭wsl,再将.wslconfig
清空,也即恢复内核更新之前的状态,会发现/lib/
目录下的数据也恢复到之前状态了,再配置成新内核,/lib
目录中的数据会跟着新的内核变化,但文件系统中的bzImage
大小并没有变。
7. 添加新驱动
后面需要用到PL2303
驱动,在WSL2-Linux-Kernel-linux-msft-wsl-5.15.153.1
目录下执行make menuconfig
,使用/
进行收索,是可以找到PL2303
的驱动的,默认处于n
状态,将其修改为m
。
保存并退出,然后编译模块。
# 这个我没有加-j16大概花了3分钟
$ make modules -j16
# 重新安装modules,看到信息中多了pl2303这个驱动
$ sudo make modules_install
...
INSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/usb/serial/pl2303.ko
...
# 加载驱动,此时可以看到/dev/ttyUSB0已经就绪,需要在windows上使用usbipd将串口映射到wsl中
$ modprobe pl2303
# 查看dmesg日志
$ dmesg
[ 1239.770358] usb 1-1: New USB device found, idVendor=067b, idProduct=2303, bcdDevice= 3.00
[ 1239.770367] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 1239.770370] usb 1-1: Product: USB-Serial Controller
[ 1239.770372] usb 1-1: Manufacturer: Prolific Technology Inc.
[ 1239.772432] pl2303 1-1:1.0: pl2303 converter detected
[ 1239.784922] usb 1-1: pl2303 converter now attached to ttyUSB0
8. 编写udev rule
编辑sudo vi /etc/udev/rules.d/serial.rules
,增加内容如下。这里的vid/pid
是在dmesg
中看到的,这句话表示对于该类型的设备,加载pl2303
驱动,同时设置设备的访问权限为0666
,即允许任意角色访问。
SUBSYSTEMS=="usb", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="230*", RUN+="/sbin/modprobe pl2303", MODE="0666"
上一篇:wsl(3) – USB使用
目录:wsl – 集合
9. 参考
如何让WSL2使用自己编译的内核
WSL 中的高级设置配置