概览
WSL 是啥
让你在 Windows 系统上高效运行原生 Linux 的新解决方案。
有别于传统虚拟机的低效、与主操作系统割裂、占用较大资源:WSL 虽是完整的 Linux(包括 GUI 支持)但轻量,和 Windows 操作系统有惊为天人的集成度和适配性,而且对硬件的调用更加高效。
对于 WSL 的种种优势,笔者虽在长时间实践中有千言万语的赞叹,但水平有限,无法付诸文字;而 NVIDIA CUDA on WSL 用户指南中做出了精辟而完整的总结
,笔者在此对这部分内容加以摘录和翻译如下:WSL 或 Windows Subsystem for Linux 是 Windows 的一个功能,它使用户可以在 Windows 11 及更高版本的操作系统中直接运行原生 Linux 应用程序、容器和命令行工具。
- Linux 应用程序可以在 WSL 2 中直接运行。WSL 2 具有包含 Linux WSL 内核的虚拟机特性,提供与主流 Linux 内核的完整兼容性,支持原生 Linux 应用程序,包括流行的 Linux 发行版。
- 更快的文件系统支持,并且性能更高。
- WSL 2 与 Microsoft Windows 操作系统紧密集成,这使得它能够与其他 Windows 桌面和现代应用商店应用并行运行 Linux 应用程序,甚至互操作。
通常,跨越 Linux 和 Windows 环境工作的开发人员会有非常繁琐的工作流程。他们要么必须:
- 使用不同的系统分别运行 Linux 和 Windows,或者:
- 双系统安装,即在系统的同一块或不同硬盘的不同分区上分别安装 Linux 和 Windows,并选择启动所需的操作系统。
在这两种情况下,开发人员都必须停止所有工作,然后切换系统或重新启动。这在历史上也限制了在两个主要生态系统之间无缝集成工具和软件系统的开发。
WSL 允许用户在两个环境中实现无缝转换,无需使用资源密集的传统虚拟机,并提高生产力,同时使用工具整合工作流进行开发。更重要的是,WSL 2 使原本只能在 Linux 上使用的应用程序能够在 Windows 上使用。WSL 2 对 GPU 的支持使这些应用程序能够受益于 GPU 加速计算,并扩展了可以在 WSL 2 上开发的应用程序领域。
有了 NVIDIA CUDA 对 WSL 2 的支持,开发人员可以利用 NVIDIA GPU 加速计算技术,通过 WSL 在 Windows 上进行数据科学、机器学习和推理。GPU 加速还能够通过在 GPU 上以较少的 CPU 干预并行处理更多工作,将应用程序在类似 WSL 环境中运行的性能开销降低到接近原生水平。
WSL 2 是实现 Windows 和 Linux 应用程序在同一系统上无缝共享 GPU 加速的关键推动者。这提供了灵活性和多功能性,同时也通过使其更易于访问来推动 GPU 加速计算的发展。
得益于以上优势:
会使用 Linux 的用户无需考虑“我应如何在 WSL 上实现 xxx”:WSL 的实质仍是虚拟机,仍是原生 Linux,无需做过多特殊考虑;
不会使用 Linux 的初学者也可以藉由 WSL 省去繁琐低效的虚拟机配置流程,也可以免受双系统带来的不便(什么?用 Linux 的同时不能在 Windows 进行办公娱乐?——不存在的)。
WSL 咋装
吹了这么半天,好装吗?——这是 Windows 亲爹的小儿子,不好装他们岂不是很打脸。
虽然需要专业版才能通过勾选功能开启的 Hyper-v,但是家庭版系统仍然能正常安装。
前置操作:启用 WSL 功能
打开开始菜单,在开始菜单中点击应用与程序;
在应用与程序选项里面,鼠标滚到最底下,点击程序与功能;
点击选项启用或关闭 Windows 功能;
在弹出的窗口中勾选 虚拟机平台 和 适用于 Linux 的 Windows 子系统。
以上操作等价于:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
同时建议:
开启 Hyper-v 功能:
bcdedit /set hypervisorlaunchtype auto
通过 Microsoft Store 安装

这将会自动完成所有后续的配置——直到你开始使用 WSL 之前的步骤。
但这有很大的弊端:
- 实例默认安装在 C 盘用于安装从 Store 下载 APP 的默认文件夹内,对于大多数人来说,这是灾难性的,你的整个子系统会持续占用 C 盘空间;
- 静默安装跳过了安装过程中手动设置部分,造成后续不便;
- 理解 WSL 的部署结构对你深入理解和维护优化这套优秀的系统至关重要,手动安装可以帮助你逐步发掘“WSL”的真相。
手动安装
功能安装
在 WSL Github Release 下载 WSL 功能包,双击安装。
系统安装
参考笔者初步尝试 WSL 时的第一篇教程,我们需要手动下载 WSL 发行版安装包进行系统的安装。
自定义 WSL 的安装位置,别再装到 C 盘啦 - 知乎 - Locietta
根据文章,我们找到这个位置下载我们需要的系统(实际上是一个带有两种架构的 Rootfs 的整合包)。
剩余步骤可遵循文章完成。
如果你对使用电脑有较深的心得,你会发现这个步骤其实就是提取发行版的根文件系统,并据此原地创建虚拟磁盘的过程。你在哪里解压,WSL 发行版就被安装至何处,这极大的方便了对系统的管理。
也因此,安装后,该文件夹下面除了默认生成的
ext4.vhdx
外,其余文件都完成了自己的历史使命,可以安全地被删除。至此,我们就完成了 WSL 在 Windows 上的部署。
接下来我们将对 WSL 在使用过程中有别于传统 Linux 虚拟机或双系统的问题做整理和解答。
Q&A
根据《提问的智慧》,在遇到问题的时候,不妨先查阅该项目的文档——适用于 Linux 的 Windows 子系统文档. 该文档由官方编写,全面、规范、易于理解。文档中提供了多个 WSL 应用场景的最佳实践,非常便于新手快速熟悉 Linux 系统的特性和使用逻辑。同时,该文档给予了对 Linux 有一定理解的玩家快速对 WSL 中各种进行调整、个性化和故障检查与排除的根据。
笔者多次遇到问题的时候,都是在文档中发现了自己曾经遗漏的关键解决方案,因此对该文档的熟悉应优先于直接上手体验该系统。(跳过新手村直接刷 boss be like.jpg)
本部分的目的在于记录一些实践过程中一些普遍会遇到的或搜索资料较为困难的问题,对于过于个性化或是在搜索引擎中具有十分详细且完善的解决方案的问题,暂不予记录,请直接进行搜索。
WSL 怎么用
这个问题非常泛泛,因此,从整体的角度,可以分成三点进行解释。对于其中任何功能或特性的细节用法,也请读者另行个性化地搜索。
- WSL 作为实质上的虚拟机,是原生的 Linux,在终端中的使用方法和你所使用的发行版在物理机/其他虚拟机软件内使用完全相同。
- 对于图形化的需求,WSL 有原生的支持,请参阅官方文档在适用于 Linux 的 Windows 子系统上运行 Linux GUI 应用,除此之外,个人较为推荐使用
vcxsrv
,这是一个开源的 X 服务器,来替代自带的 wslg。这在互联网上有较多的教程,本问题中不再赘述。 - 对于因 WSL 和 Windows 的特殊关系而导致的疑问,请在搜索资料的时候带上
WSL
关键词,例如WSL 设置网络模式为镜像模式
。
安装内核更新包提示系统没有 WSL/需要 wsl.x.x.x.x.x64.msi

这种情况一般在刚刚开启 WSL 功能的机器上出现,笔者近期遇到了很多机器出现这个现象,如果你在上一步确认安装了 WSL 功能包,请忽视这个报错,跳过这个步骤。目前的经验表明它不会影响后续的任何操作。

参考 安装部分,下载独立的 WSL 功能包(而不是更新包)进行安装。
怎么在 WSL 里面进行编程、开发?
强烈建议使用微软这一套工具链中的 VScode 进行 WSL 的连接使用,请在互联网上以“在 vscode 中使用 wsl”为关键词搜索教程进行安装,配置成功后,开发工作与使用 VScode 在 Windows 和 Linux 上编程皆无二致。
得益于 WSL 文档中提到的 appendWindowsPath 配置(默认为 true
),Windows 下的环境变量将被拼接到 Linux 中,这意味着:你可以直接在 Linux 文件系统中运行 code .
,而这一操作将直接在 WSL 环境中启动 VScode 连接,并直接在 Code 中打开当前的文件夹。
执行sudo
需要密码,但是我刚刚设置过的密码不对
这是因为你设置的是用户密码,在执行 sudo 命令的时候需要的是 root 密码,使用:
sudo passwd root
设置密码并激活 root 账户即可。详见:https://blog.csdn.net/chou_kawaii/article/details/118514244
我的 WSL 我不知道装到哪了/装的位置我不喜欢
首先,如果你的 WSL 是使用微软商店一键安装的,强烈建议你趁早转移位置,微软商店安装的 WSL 默认安装在 C:\Users\<yourname>\Appdata(隐藏)
下,具体位置请自行搜索得到,在此我们暂不关心。上文提到,WSL 的实质是虚拟机,而一份适应生产生活使用的系统,其磁盘开销是大多数人的 C 盘剩余空间负担不起的,请在你的 C 盘变红之前将你的 WSL 换个地方储存。
WSL 位置的更换方法较多,其操作方法和实际效果各有不同,下面简单列举供读者参考:
微软官方在“WSL 的基本命令”列出了大量使用命令,可以遵循其中的导出导入命令。详见:WSL 的基本命令 - 导出分发版。 通过这种方法,你的 WSL 储存位置完全可控。
值得注意的是,导出发行版为 .tar 的过程实际上是对整个文件系统按目录树进行提取,耗时可能较长。
上述命令也可在搜索引擎搜索,有大量的教程提供了导入导出的详细操作命令教程,且基本都基于官方的上述命令,内容大同小异,在此不再赘述。
经过笔者不完整的实践验证,基于单个虚拟磁盘的 WSL 系统完全可以直接对其虚拟磁盘(默认为
ext4.vhdx
)进行移动到你指定的位置的操作,这种方法简单粗暴,且在笔者的电脑上数次成功进行,这也可以成为直接快速备份 WSL 系统的方法。成功移动后,请对原发行版进行注销操作(会清除被注销的原有发行版,所以请保证虚拟磁盘已经被正确转移),再在有移动后虚拟磁盘的目标目录下进行指定 vhdx 导入或“就地导入”发行版命令,将虚拟磁盘注册为新的发行版。
值得注意的是,导出导入时发行版名称设置不同可能导致进入系统后默认用户变为 root 用户,在此提供一篇带有解决方法的 教程,更多细节请自行搜索解决。
特别的,如果你的 WSL 是使用微软商店一键安装的,在 Windows 系统中即可以通过设置控制其所在盘符。具体操作是:在
Windows 的设置 > 应用 > 安装的应用
中,移动 Ubuntu 应用(也可以是你安装的其他发行版),在程序后有三个点,点开就有移动到 D 盘的选项了。这种放方法实际上是建立在把你的 WSL 识别为一个 MicrosoftStoreAPP 的基础上,系统也仅会将包含发行版的整个 APP 文件夹移动到目标盘符的 WindowsAPP 专有目录下,简单但是并不直观,适合对文件管理不敏感和怕麻烦的用户使用。
在撰写这篇文章时,笔者发现这篇文章的作者正是 Github 项目 xanmod-kernel-WSL2 的开发者。笔者在为 WSL 更换自定义 Linux 内核的时候于这个项目的 issue 中和作者讨论过一些小问题,该项目具有一定可玩性,值得尝试。 ↩︎