WSL进阶使用指南
WSL2通过 Hyper-V 技术创建了一个轻量级的虚拟机(VM),在这个虚拟机之上可以运行一个真正的 Linux 内核,这给希望同时使用 Windows 和 Linux 的开发人员提供了无缝高效的体验。本文会介绍一些使用WSL的知识,帮助你更好地使用WSL。
1 WSL的优点与缺点
1.1 优点
-
相较于使用类似VirtualBox的虚拟机,WSL有着更低的内存占用和更快的启动速度。
-
相较于双系统,WSL可以让你在使用Linux的同时使用Windows,而不需要通过重启切换环境。
1.2 缺点
有时会存在一些兼容性问题,比如有些软件不支持WSL环境,就像我下面这样(orangepi的编译脚本不支持WSL环境):

如果想在WSL中访问U盘之类的存储设备还需要专门的配置(本文第三节中会介绍),此外如果你想要测试一些软件的性能的话,不建议在WSL上测试。
2 WSL配置文件
2.1 配置文件的类型
有两种类型的配置文件:.wslconfig和wsl.conf
(1).wslconfig是全局配置,会影响在WSL 2上运行的所有的发行版。它通常在这里C:\Users\wei\.wslconfig(在Windows的文件系统里,wei是我的用户名)
(2)wsl.conf是局部配置,会影响在WSL 1或WSL 2上运行的指定的Linux发行版。通常来说每个LInux发行版都有一个/etc/wsl.conf文件(在Linux发行版的文件系统里),这个文件里的配置会影响对应的Linux发行版。
下面是我的Ubuntu22.04的配置。
[boot] systemd=true意味着该发行版会使用systemd作为init程序(linux第一个启动的用户程序),然后systemd会启动一些其他程序。

2.2 如何使配置生效
在修改完配置文件后,可以使用wsl --shutdown关闭所有正在运行的Linux发行版,或者使用wsl --terminate <distroName>关闭某个指定的Linux发行版,只有关闭后重启修改的配置才会生效。
PS:可以使用wsl --list --running检查是否有正在运行的Linux发行版:

2.3 可配置的参数
这部分详细的内容可以看官方文档:
WSL 中的高级设置配置 | Microsoft Learn在适用于 Linux 的 Windows 子系统上运行多个 Linux 发行版时用于配置设置的 wsl.conf 和 .wslconfig 文件的指南。
https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config
2.3.1 wsl.conf
(1)在wsl.conf中可使用的标签:[automount]。

简单来说这个配置与文件系统的挂载有关。如果不进行任何修改的话,你可以看到在wsl的/mnt目录下有几个目录,它们就是Windows的那几个盘,比如说我分了三个盘C、D、E,这下面就有c、d、e三个目录,你可以在wsl中通过这些目录访问Windows上的文件。

(2)在wsl.conf中可使用的标签:[network]

(3)在wsl.conf中可使用的标签:[interop]

这个是控制是否能够在WSL中执行Windows程序的。如果开启的话,就可以在WSL中执行Windows程序。比如可以使用/mnt/c/Windows/notepad.exe 打开记事本。
(4)在wsl.conf中可使用的标签:[user]

(5)在wsl.conf中可使用的标签:[boot]

下面是官方给出的一个wsl.conf文件配置样例:
# Automatically mount Windows drive when the distribution is launched
[automount]# Set to true will automount fixed drives (C:/ or D:/) with DrvFs under the root directory set above. Set to false means drives won't be mounted automatically, but need to be mounted manually or with fstab.
enabled = true# Sets the directory where fixed drives will be automatically mounted. This example changes the mount location, so your C-drive would be /c, rather than the default /mnt/c.
root = /# DrvFs-specific options can be specified.
options = "metadata,uid=1003,gid=1003,umask=077,fmask=11,case=off"# Sets the `/etc/fstab` file to be processed when a WSL distribution is launched.
mountFsTab = true# Network host settings that enable the DNS server used by WSL 2. This example changes the hostname, sets generateHosts to false, preventing WSL from the default behavior of auto-generating /etc/hosts, and sets generateResolvConf to false, preventing WSL from auto-generating /etc/resolv.conf, so that you can create your own (ie. nameserver 1.1.1.1).
[network]
hostname = DemoHost
generateHosts = false
generateResolvConf = false# Set whether WSL supports interop processes like launching Windows apps and adding path variables. Setting these to false will block the launch of Windows processes and block adding $PATH environment variables.
[interop]
enabled = false
appendWindowsPath = false# Set the user when launching a distribution with WSL.
[user]
default = DemoUser# Set a command to run when a new WSL instance launches. This example starts the Docker container service.
[boot]
command = service docker start
2.3.2 .wslconfig
这一部分可以配置的东西比较多,建议直接看官方文档,这里只给出官方文档配置的样例:
# Settings apply across all Linux distros running on WSL 2
[wsl2]# Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB
memory=4GB # Sets the VM to use two virtual processors
processors=2# Specify a custom Linux kernel to use with your installed distros. The default kernel used can be found at https://github.com/microsoft/WSL2-Linux-Kernel
kernel=C:\\temp\\myCustomKernel# Sets additional kernel parameters, in this case enabling older Linux base images such as Centos 6
kernelCommandLine = vsyscall=emulate# Sets amount of swap storage space to 8GB, default is 25% of available RAM
swap=8GB# Sets swapfile path location, default is %USERPROFILE%\AppData\Local\Temp\swap.vhdx
swapfile=C:\\temp\\wsl-swap.vhdx# Disable page reporting so WSL retains all allocated memory claimed from Windows and releases none back when free
pageReporting=false# Turn on default connection to bind WSL 2 localhost to Windows localhost. Setting is ignored when networkingMode=mirrored
localhostforwarding=true# Disables nested virtualization
nestedVirtualization=false# Turns on output console showing contents of dmesg when opening a WSL 2 distro for debugging
debugConsole=true# Enable experimental features
[experimental]
sparseVhd=true
一些补充:
-
如果你在编译程序时遇到了OOM(内存不够用),可以把memory和swap调大点,这样你的WSL就有更多可以使用的内存了。
-
如果想要在WSL里使用代理可以像我下面这样配置。起作用的主要是这三个:autoProxy=true dnsTunneling=true networkingMode=mirrored。
-
使用kernel参数可以使用自己编译的Linux内核。
下面是我目前的配置:
[wsl2]
memory=24GB
swap=32GB
autoProxy=true
dnsTunneling=true
networkingMode=mirrored[experimental]
autoMemoryReclaim=gradual
sparseVhd=true
此外如果遇到一些问题的话,建议升级一下WSL再试,可以使用winget upgrade Microsoft.WSL来更新WSL,下面是我的WSL相关内容的版本信息:

3 在WSL中使用自己编译的内核
在WSL中使用的是微软修改过的内核,下面是它的代码仓库:
GitHub - microsoft/WSL2-Linux-Kernel: The source for the Linux kernel used in Windows Subsystem for Linux 2 (WSL2)The source for the Linux kernel used in Windows Subsystem for Linux 2 (WSL2) - microsoft/WSL2-Linux-Kernel
https://github.com/microsoft/WSL2-Linux-Kernel.git
为什么需要自己重新编译内核?这是因为默认的Linux内核中有些功能并没有启用,比如USB Mass Storage Support,这导致你即使使用usbipd将usb设备(比如说U盘)连接到了WSL,也没法在WSL里访问U盘,因为没有对应的驱动,所以这时候就得自己编译内核把USB Mass Storage Support启用。
3.1 编译内核
记得下载与自己Linux发行版对应的内核版本,uname -r可以查看当前内核的版本:

修改配置命令:
make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl
USB Mass Storage Support在Device Drivers> USB support下,建议把这些全部勾上。

编译内核:
make -j$(nproc) bzImage KCONFIG_CONFIG=Microsoft/config-wsl
编译并安装内核模块(这里默认你在需要更换内核的WSL中执行内核模块安装的命令):
make modules_install KCONFIG_CONFIG=Microsoft/config-wsl
sudo make modules_install KCONFIG_CONFIG=Microsoft/config-wsl
最终产物是arch/x86/boot/bzImage,如果上面的步骤遇到了问题,请根据提示安装需要的依赖。
得到产物后我们可以修改.wslconfig中的kernel参数,使其指向我们的编译产物。我的参数是这样kernel=D:\\wsl-ubuntu22.04\\bzImage,当然你可以根据自己的喜好把bzImage放在某个地方。设置完成后重启WSL使设置生效。
3.2 使用usbipd将usb设备连接到WSL
只开启USB Mass Storage Support是不够的,我们还需要usbipd工具才能使WSL访问到U盘。可以在Windows的powershell里使用winget search usbipd寻找usbipd,然后使用ID值安装usbipd(winget install dorssel.usbipd-win)。

安装完成后先使用usbipd list查看所有连接到Windows上的usb设备:

之后找到U盘对应的BUSID(我这里是5-3),使用sudo usbipd bind --busid 5-3将U盘的状态设置为shared(这里需要使用管理员权限,因为我是最新的Windows 11版本,所以可以使用Windows新加的sudo功能,如果不是最新版本的话,可以以管理员权限运行终端)

最后使用usbipd attach --wsl --busid 5-3,让WSL连接上U盘。

这时WSL就可以识别U盘了(sdd就是U盘)。

PS:嵌入式设备的串口也可以通过usbipd连接到WSL,从而能够使用minicom之类的工具接收串口发送的数据,或向串口发送数据。
相关文章:
WSL进阶使用指南
WSL2通过 Hyper-V 技术创建了一个轻量级的虚拟机(VM),在这个虚拟机之上可以运行一个真正的 Linux 内核,这给希望同时使用 Windows 和 Linux 的开发人员提供了无缝高效的体验。本文会介绍一些使用WSL的知识,帮助你更好地…...
工业机器视觉3D视觉行业分析
一、行业现状与市场前景 市场规模与增长 中国工业机器视觉市场近年来呈现高速增长态势,预计2025年市场规模将达到数百亿元,年复合增长率(CAGR)超过20%579。其中,3D视觉技术因在智能制造、人形机器人、自动驾驶等领域的广泛应用,成为核心增长点。全球3D成像与传感市场预计…...
我是如何从 0 到 1 找到 Web3 工作的?
作者:Lotus的人生实验 关于我花了一个月的时间,从 0 到 1 学习 Web3 相关的知识和编程知识。然后找到了一个 Web3 创业公司实习的远程工作。 👇👇👇 我的背景: 计算机科班,学历还可以(大厂门槛水平) 毕业工…...
leetcode 题目解析 第3题 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”…...
如何通过外链提升网站SEO排名?
外链的作用非常明显,它不仅能提高网站的排名,还能增加网站的曝光量。Google排名的算法会考虑到网站的外链数量、质量和多样性。简单来说,更多的高质量外链意味着你的网站更有可信度,更容易被搜索引擎优待。 但是,过度…...
Prompt:创造性的系统分析者
分享的提示词: 你是一个创造性的系统分析者,作为咨询师,你具有以下特质: 基础能力: 深入理解我的系统性模式 识别模式间的隐藏联系 发现出人意料的关联 提供令人惊讶的洞见 工作方式: 在每次回应中至少…...
DeepSeek服务器繁忙 多种方式继续优雅的使用它
前言 你的DeepSeek最近是不是总是提示”服务器繁忙,请稍后再试。”,尝试过了多次重新生成后,还是如此。之前DeepSeek官网连续发布2条公告称,DeepSeek线上服务受到大规模恶意攻击。该平台的对话框疑似遭遇了“分布式拒绝服务攻击”࿰…...
量子计算的基本运算:Hadamard 门、CNOT 门、Pauli 门详解
量子计算是现代计算科学的前沿领域,它与经典计算机在处理信息的方式上有着本质的区别。量子计算机利用量子比特(qubit)的叠加态和量子纠缠等特性来进行计算,从而在某些特定任务上超越传统计算机。量子计算的核心运算单元是量子门,它们通过作用于量子比特来操控量子状态。本…...
mysql之Innodb数据页
Innodb数据页结构 InnoDB数据页结构一、数据页基础概念二、数据页核心结构1. 头部控制区2. 数据存储区3. 尾部与目录区 三、关键机制详解1. 记录链表与删除优化2. 页目录与二分查找3. 空间复用与碎片管理4. 数据页的合并与分裂 四、应用与性能影响1. 索引效率2. 插入优化3. 事务…...
ThinkORM模型静态方法create好像对MongoDB不支持
软件版本 think-orm:3.0PHP:8.4.1MongoDB:8.0.4 (本地单数据 非集群)注:我是在 webman 框架下使用think-orm,并非在 thinkphp框架下使用 使用场景 定义的模型如下: <?php na…...
nginx配置:nginx.conf配置文件
nginx.conf配置文件说明 基本结构 全局块:位于最外层,定义影响整个Nginx服务器的设置。事件块:配置网络连接相关的设置。HTTP块:定义HTTP服务器以及反向代理、负载均衡等特性。Server块:定义虚拟主机,即响…...
基于 PyQt5 的聊天机器人程序(AI)
这是一个基于 PyQt5 的聊天机器人程序,通过 API 接入硅基流动(Silicon Flow)或其他的聊天服务,支持用户与聊天机器人进行交互。 API 设置:通过菜单栏的“设置”选项,用户可以修改 API 地址和 API 密钥。 设…...
[实现Rpc] 服务端 | RpcRouter实现 | Builder模式
目录 项目服务端独用类的实现 1. RpcRouter类的实现 ServiceDescribe SDescribeFactory ⭕ Builder模式 1. 动机 2. 模式定义 3. 要点总结 4. 代码感受 ServiceManager RpcRouter 4. 代码感受 ServiceManager RpcRouter 前文我们就将 Rpc 通用类都实现完啦&#…...
红外人体传感器选型和电路解析
红外人体传感器选型和电路解析 背景:想要制作一套IoT系统,基于HA构建上层管理,蓝牙和蓝牙MESH构建无线网络,以及多种传感器和控制器作为底层,其中人体红外传感器作为一个重要的选项,需要考虑好。 红外人体传…...
rtthread的串口框架、485框架
一、串口接收超时中断的实现。 1. rtthread中定义的串口超时结构体 定义串口接收超时的结构体 CM_TMR0_TypeDef 为TM0的实例(实际有CM_TMR0_1 CM_TMR0_2 对应华大460的两个TMR0单元 ) channel 每个timer0有两个通道(TMR0_CHA、TMR0_CHB) clock 为FCG2_PERIPH_TMR0_1、FCG…...
Embedding模型
检索的方式有那些 关键字搜索:通过用户输入的关键字来查找文本数据。 语义搜索:它的目标是理解用户查询的真实意图,不仅考虑关键词的匹配,还考虑词汇之间的语义 (文字,语音,语调...࿰…...
如何使用Spring Boot实现商品的管理系统
1. 项目初始化 1.1 使用 Spring Initializr 创建项目 访问 Spring Initializr,进行如下配置: Project:选择 Maven Project。Language:选择 Java。Spring Boot:选择合适的版本,如 3.1.x。Group:填写项目的组织名,例如 com.example。Artifact:填写项目名称,如 general…...
最新扣子(Coze)案例教程:全自动DeepSeek 写影评+批量生成 + 发布飞书,提效10 倍!手把手教学,完全免费教程
👨💻群里有同学是做影视赛道的博主,听说最近DeepSeek这么火,咨询能不能用DeepSeek写影评,并整理电影数据资料,自动发布到飞书文档,把每天的工作做成一个自动化的流程。 那今天斜杠君就为大家…...
Qt程序退出相关资源释放问题
目录 问题背景: aboutToQuit 代码举例 资源释放函数注意事项 closeEvent事件 代码举例 程序退出方式 quit() exit(int returnCode 0) close() 问题背景: 实际项目中程序退出前往往需要及进行一些资源释放、配置保存、线程中断等操作,…...
Ubuntu 22.04安装K8S集群
以下是Ubuntu 22.04安装Kubernetes集群的步骤概要 一、设置主机名与hosts解析 # Master节点执行 sudo hostnamectl set-hostname "k8smaster" # Worker节点执行 sudo hostnamectl set-hostname "k8sworker1"# 所有节点的/etc/hosts中添加: ca…...
Kubernetes的Ingress 资源是什么?
在Kubernetes中,Ingress资源是一种用于管理集群外部对内部服务访问的API对象,主要用于将不同的外部请求路由到集群内的不同服务,以下是关于它的详细介绍: 定义与作用 Ingress资源定义了从集群外部到内部服务的HTTP和HTTPS路由规…...
Apifox 增强 AI 接口调试功能:自动合并 SSE 响应、展示DeepSeek思考过程
在现代的API接口调试中,效率和精确性对于开发者和测试人员来说至关重要。Apifox,作为一款功能强大的API管理和调试工具,近年来不断提升其用户体验和智能化功能。最近,Apifox 推出了增强版的AI接口调试功能,其中包括自动…...
MATLAB基础学习相关知识
MATLAB安装参考:抖音-记录美好生活 MATLAB基础知识学习参考:【1小时Matlab速成教程-哔哩哔哩】 https://b23.tv/CnvHtO3 第1部分:变量定义和基本运算 生成矩阵: % 生成矩阵% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…...
DeepSeek赋能智慧文旅:新一代解决方案,重构文旅发展的底层逻辑
DeepSeek作为一款前沿的人工智能大模型,凭借其强大的多模态理解、知识推理和内容生成能力,正在重构文旅产业的发展逻辑,推动行业从传统的经验驱动向数据驱动、从人力密集型向智能协同型转变。 一、智能服务重构:打造全域感知的智…...
蓝桥与力扣刷题(蓝桥 交换瓶子)
题目:有 N 个瓶子,编号 1 ~ N,放在架子上。 比如有 5 个瓶子: 2 1 3 5 4 要求每次拿起 2 个瓶子,交换它们的位置。 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的情况&#x…...
腿足机器人之十一- 深度强化学习
腿足机器人之十一- 深度强化学习 机器人能力腿足机器人RL问题建模强化学习解决方案 强化学习算法库选择建议 深度学习技术已经在语音、图像、视频、文本等领域应用广泛,其和强化学习的结合使得基于深度学习的大模型能力更是上升一个台阶。因而用在腿足机器人的运动中…...
纠错检索增广生成论文
一、摘要 动机:RAG严重依赖于检索文档的相关性,如果检索出错,那么LLM的输出结果也会出现问题 解决方案:提出纠正性检索增强生成(CRAG)即设计一个轻量级的检索评估器,用来评估针对某个查询检索…...
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
多源 BFS 是一种解决 边权为 1 的多源最短路问题 的高效算法。其核心思想是将所有源点视为一个“超级源点”,通过一次 BFS 遍历即可计算所有节点到最近源点的最短距离。以下从原理、实现和代码示例三个方面深入讲解: 目录 一、原理分析 1. 单源 BFS vs…...
Jenkins 构建 Unity 打包 .apk 同时生成 .aab
Jenkins 构建 Unity 打包 .apk 同时生成 .aab Android App Bundle简称 AAB,想了解更多关于 AAB 的知识,请看官网 https://developer.android.google.cn/guide/app-bundle/faq?hlzh-cn APK 打包部分在复用上一篇 Jenkins 构建 Unity打包APK 一、新建一…...
LTO优化详解
嵌入式开发过程中的LTO优化是什么意思?能够用来解决什么问题?它都优化了哪些?仅开启LTO真的可以优化SIZE的问题吗? 请分别回答我刚才提到的问题? 嗯,用户问关于嵌入式开发中的LTO优化,我需要详细解释这个概…...
