当前位置: 首页 > news >正文

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,解压后大约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 supportINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/block/nbd.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/net/bonding/bonding.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/net/dummy.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/net/vrf.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/usb/serial/ch341.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/usb/serial/cp210x.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/usb/serial/ftdi_sio.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/usb/serial/usbserial.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/net/ipv4/ipip.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/net/ipv4/tunnel4.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/net/ipv6/sit.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/net/netfilter/xt_CT.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/net/netfilter/xt_bpf.koINSTALL /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/net/netfilter/xt_u32.koDEPMOD  /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

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 中的高级设置配置


http://www.mrgr.cn/news/41527.html

相关文章:

  • 【FPGA开发】Xilinx FPGA差分输入时钟的使用方法
  • 10月2日笔记(内网资源探测篇)
  • 鸢尾花书实践和知识记录[数学要素3-3几何]
  • 系统安全 - Linux 安全模型及实践
  • AI通用大模型编程需要的能力
  • 《重生到现代之从零开始的C语言生活》—— 内存函数
  • 【GESP】C++一级练习BCQM3021,输入-计算-输出-2
  • Python(三)——列表
  • JavaScript for循环语句
  • npm包管理深度探索:从基础到进阶全面教程!
  • UniVue大版本更新:UniVue2.0.0-preview
  • 枫叶MTS格式转换器- 强大、操作简单的MTS、M2TS视频转换工具供大家学习研究参考
  • 老年人最真实的养老需求
  • 【GESP】C++一级练习BCQM3022,输入-计算-输出-3
  • Mysql 索引底层数据结构和算法
  • IDEA 设置自动定位文件
  • 【分布式微服务云原生】如何在ActiveMQ中优雅处理提前支付的延时订单
  • MySQL高阶2066-账户余额
  • 小白必看web专题!AWVS漏洞扫描安装部署(全网最详细)
  • 消息队列RabbitMQ