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

news2024/11/21 2:21:27

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
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.coloradmin.cn/o/2185520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分页】Spring Boot 列表分页 + javaScript前台展示

后端: 准备好查询实体与分页实体 1、分页工具实体 package com.ruoyi.dms.config;import com.alibaba.nacos.api.model.v2.Result; import lombok.Data;import java.io.Serializable; import java.util.List;/*** author 宁兴星* description: 列表返回结果集*/ …

信息学奥赛复赛复习09-CSP-J2020-03表达式求值前置知识点-中缀表达式求值、模运算、模运算性质、栈

PDF文档回复:20241002 **1 P1981 [NOIP2013普及组] 表达式求值 ** [题目描述] 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值 [输入格式] 一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 “” 和乘法运算符 …

C/C++语言基础--C++IO流、输入输出流、文件流、字符串流、重定向流等详解

本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 流思想,我认为在计算机中是一个很重要的思想,因为计算机、编程无非就是获取数据,然后对数据进行操作;C给主要给我们提供了3种流,输入输出流、文件流…

react-问卷星项目(4)

项目实战 使用CSS 尽量不要使用内联CSS 内联style代码多&#xff0c;性能差&#xff0c;扩展性差外链css文件可复用代码&#xff0c;可单独缓存文件 元素内联style 和HTMl元素的style相似必须用JS写法&#xff0c;不能是字符串&#xff0c;里面必须是对象 <span style…

# VirtualBox中安装的CentOS 6.5网络设置为NAT模式时,怎么使用SecureCRT连接CentOS6.5系统?

VirtualBox中安装的CentOS 6.5网络设置为NAT模式时&#xff0c;怎么使用SecureCRT连接CentOS6.5系统&#xff1f; 一、查询 【VirtualBox Host-Only Network】虚拟网卡的网络配置 IP。 1、按键盘上WIN R 组合键&#xff0c;打开【运行】&#xff0c;输入【 ncpa.cpl 】&…

C0012.Clion改用VS编译器开发Qt界面

1.VS编译器添加 2.配置MSVC2019环境变量 3.各种问题报错与解决 问题描述 warning C4819&#xff1a;该文件包含不能在当前代码页(936)中表示的字符。解决办法 在CMakeLists.txt中添加如下代码 # 如下代码只在使用VS编译器时需要&#xff0c;使用mingw32编译器时需要注释掉 #…

利用Numpy实现全连接神经网络实验分析

一、实验要求 用 python 的 numpy 模块实现全连接神经网络。网络结构为一个输入层、一个隐藏层、一个输出层。隐藏层的激活函数为 Relu 函数&#xff0c;输出层的激活函数为 softmax 函数&#xff0c;损失函数为交叉熵。 二、实验目的 学会构建一个简单的全连接神经网络模型学…

鸿蒙网络管理模块01——HTTP与WebSocket请求数据

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、概述 鸿蒙的网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1…

影刀RPA实战:网页爬虫之电影数据

1.实战目标 电影自媒体是指个人或团队通过互联网平台&#xff0c;如微博、微信公众号、抖音、B站等&#xff0c;发布与电影相关的内容&#xff0c;包括但不限于电影评论、推荐、幕后制作揭秘、明星访谈等。这些内容旨在吸引电影爱好者&#xff0c;并与之互动&#xff0c;构建起…

十六字心传

中国文化传统中著名的“十六字心传”&#xff1a;“人心惟危&#xff0c;道心惟微&#xff1b;惟精惟一&#xff0c;允执厥中。 ”语出于《虞书大禹谟》。 人心与道心&#xff1a;人的人欲与天理的区别&#xff1b;所谓“人心惟危”&#xff0c;即是说人们的那种物欲情欲&…

【FPGA开发】Xilinx FPGA差分输入时钟的使用方法

正文 以前在使用ZYNQ的领航者ZYNQ7020进行FPGA学习时&#xff0c;它们使用的单端50M的输入时钟&#xff0c;在verlog代码编写上比较简单&#xff0c;而现在使用Alinx的AXU3EG开发板时&#xff0c;发现它使用的是200M的差分输入时钟&#xff0c;哪这个时候&#xff0c;输入时钟要…

pyecharts-快速入门

pyecharts文档&#xff1a;渲染图表 - pyecharts - A Python Echarts Plotting Library built with love. pyecharts-gallery文档&#xff1a;中文简介 - Document (pyecharts.org) 一、快速入门案例 from pyecharts.charts import Barbar Bar() bar.add_xaxis(["衬衫…

7-3 集合的运算-并、交、对称差

顺序表&#xff1a; #include <bits/stdc.h> using namespace std; int main() {int n;cin>>n;int *pnew int[n];for(int i0;i<n;i)cin>>p[i];int m;cin>>m;int *qnew int [m];for(int j0;j<m;j)cin>>q[j];int *bingnew int[nm];int *jia…

详细介绍:API 和 SPI 的区别

文章目录 Java SPI (Service Provider Interface) 和 API (Application Programming Interface) 的区别详解目录1. 定义和目的1.1 API (Application Programming Interface)1.2 SPI (Service Provider Interface) 2. 使用场景2.1 API 的应用场景2.2 SPI 的应用场景 3. 加载和调…

Elasticsearch基础_5.ES聚合功能

文章目录 一、数据聚合1.1、桶聚合1.1.1、单维度桶聚合1.1.2、聚合结果排序1.1.3、限定聚合范围 本文只记录ES聚合基本用法&#xff0c;后续有更复杂的需求可以查看相关书籍&#xff0c;如《Elasticsearch搜索引擎构建入门与实战》 一、数据聚合 聚合可以让我们极其方便的实现…

进程和线程之间的通用方式

进程之间的通信方式有哪些 进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;是指不同进程之间传递信息和数据的机制。由于进程之间的内存空间是相互独立的&#xff0c;因此必须使用特定的通信方式来实现数据共享。 以下是常见的进程间通信方式&#xff1…

【前端开发入门】css快速入门

目录 引言一、css盒模型1. 盒模型概念2. 盒模型案例 二、css编写1. html文件内部编写1.1 标签style属性编写1.2 css选择器关联1.2.1 id选择器1.2.2 class选择器1.2.3 标签选择器1.2.4 css选择器作用域1.2.5 其他选择器1.2.6 各css选择器优先级 2. 单独维护css文件2.1 创建css文…

【韩顺平Java笔记】第6章:数组、排序和查找

文章目录 153. 回顾上节课内容154. 听懂和会做155. 数组的必要性156. 数组快速入门157. 数组使用1158. 数组使用2160. 数组使用3161. 数组注意事项161. 数组练习1162. 数组练习2163. 数组赋值机制1164. 数组赋值机制2165. 数组拷贝166. 数组翻转1168. 169. 数组扩容1,2170. 数组…

解决银河麒麟服务器操作系统中`/etc/bashrc`环境变量不生效的问题

解决银河麒麟服务器操作系统中/etc/bashrc环境变量不生效的问题 1、问题描述2、问题原因3、解决方法 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 在银河麒麟服务器操作系统中&#xff0c;有时你可能会遇到在/etc/bashrc文件中配置的环境…

VMware 设置静态IP

环境 os: centos 7vmware: 16.2.0 build-18760230 设置静态IP 不知道桥接模式和nat模式抽什么疯&#xff0c;忽然用不了了&#xff0c;虚拟机开机之后&#xff0c;本地ssh连接不上&#xff0c;ping 了一下&#xff0c;本机ping不通虚拟机。干脆参考网上的方法&#xff0c;直…