wsl(4) -- 编译驱动模块

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。

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
PL2303驱动
启动PL2303模块使能
保存并退出,然后编译模块。

# 这个我没有加-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

上一篇:wsl(3) – USB使用
目录:wsl – 集合

8. 参考

如何让WSL2使用自己编译的内核
WSL 中的高级设置配置

`wsl --import` 是一个在Windows系统中使用Windows Subsystem for Linux (WSL) 功能时的一个命令行指令。该命令用于将一个Linux发行版导入到WSL中。这个过程通常涉及以下几个步骤: 1. 从微软的官方网站或其他来源下载Linux发行版的zip格式文件。这个文件包含了发行版的根文件系统镜像。 2. 找到一个用于存放Linux发行版的目录。该目录称为导入目录。 3. 使用`wsl --import`命令将下载的zip文件导入到指定的导入目录中。 该命令的基本语法如下: ``` wsl --import <DistributionName> <InstallationDrive> <InstallPackagePath> [Options] ``` - `<DistributionName>`:指定将要导入的Linux发行版的名字。 - `<InstallationDrive>`:指定导入的Linux发行版将要安装的驱动器路径。 - `<InstallPackagePath>`:指定下载的Linux发行版zip文件的完整路径。 例如,如果你下载了Ubuntu的zip文件,并希望将其导入到WSL中,可以使用如下命令: ``` wsl --import Ubuntu D:\Apps\WSL\Ubuntu D:\Downloads/ubuntu-18.04.4-desktop-amd64.zip ``` 在这个例子中,“Ubuntu”是导入的发行版的名称,“D:\Apps\WSL\Ubuntu”是导入后安装的路径,而“D:\Downloads/ubuntu-18.04.4-desktop-amd64.zip”是下载的Ubuntu发行版的zip文件路径。 执行`wsl --import`命令后,Linux发行版就被导入到了WSL中,之后就可以通过`wsl -l`查看所有可用的发行版,通过`wsl -d <DistributionName>`启动指定的发行版了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值