Windows 10 和 Windows 11 上跑 Linux,现在最主流的方案就是 WSL。不过很多刚接触的朋友装好之后发现,自己用的还是第一代 WSL,性能、兼容性、Docker 支持都不太顺手。这篇文章就专门聊一件事:小白如何稳稳当当把 WSL 升级成 WSL2,从原理、检查、安装、配置到排坑,全程实操,一条龙讲完。
我一开始接触 WSL 的时候也踩过不少坑,什么 wsl --install 卡半天、内核更新包下载失败、莫名其妙报 error_file_not_found,都遇到过。这篇博文里的思路和步骤,就是我反复折腾之后沉淀下来的完整流程,照着做基本能一次搞定。
1. 升级前的准备工作:先搞懂 WSL1 和 WSL2 到底差在哪
1.1 为什么推荐升级到 WSL2
很多教程上来就让你敲命令,但搞不清楚 WSL1 和 WSL2 区别的人,出了问题也不知道怎么排查。简单说,WSL1 是微软写的一个“翻译层”,把 Linux 系统调用翻译成 Windows 系统调用,好处是启动快、内存占用低,但坏处是兼容性不行,很多 Linux 软件跑不起来,Docker 也没法直接使用。
WSL2 则是微软在 Windows 里面内置的一个轻量级虚拟机,跑的是真正完整的 Linux 内核。这意味着你几乎可以把它当成一台全功能的 Linux 服务器来用,Docker 直接支持,GPU 加速也有,文件 IO 性能提升非常明显。
用一个不恰当但很好懂的类比:WSL1 像是“同声传译”,两边各说各的语言,虽然能交流但效率有限;WSL2 像是直接把一位外国专家请到了公司内部,交流完全无障碍。所以只要条件允许,我都建议升级到 WSL2。
1.2 升级前先确认当前 WSL 版本
打开 PowerShell 或者 Windows Terminal,输入:
powershell复制wsl --list --verbose
或者简写:
powershell复制wsl -l -v
输出结果里会有一个 VERSION 列,如果显示的是 1,说明你还在用 WSL1;如果显示 2,恭喜你已经是 WSL2 了。如果显示“没有已安装的分发版”,那就说明你只是安装了 WSL 框架,还没有装任何 Linux 发行版,这时候更应该看看这篇文章。
如果 wsl 命令直接报错“无法将‘wsl’项识别为 cmdlet”,多半是系统太老或者没装 WSL 框架,下文会专门说这个。
1.3 系统要求和硬件条件自查
升级 WSL2 不是所有 Windows 版本都能干,需要满足几个条件:
| 条件 | 要求 | 说明 |
|---|---|---|
| Windows 10 版本 | 2004 及以上,或者 1903/1909 + KB5004296 补丁 | 老版本也能升,但建议直接更新到最新 |
| Windows 11 | 任意正式版 | 原生支持,体验最好 |
| 处理器 | 支持并开启虚拟化 | BIOS/UEFI 中开启 Intel VT-x 或 AMD-V |
| 内存 | 建议 8GB 以上 | 实际 4GB 也能跑,但开 Docker 会比较吃紧 |
| 磁盘 | SSD 优先 | WSL2 的虚拟磁盘读写性能跟物理盘直接相关 |
检查虚拟化是否开启,可以在 PowerShell 里输入:
powershell复制systeminfo
找到“Hyper-V 要求”那一项,如果四条全是“是”,就说明虚拟化没问题。如果显示“已检测到虚拟机监控程序”,并且“虚拟化固件中已启用虚拟化”是“否”,那就要重启进 BIOS 去开虚拟化。
折腾半天发现升级失败,十有八九是这一步没做好。
1.4 备份已有数据:升级前千万别偷懒
这一步很容易被忽略,但我必须强调:在把 WSL1 转换成 WSL2 之前,先备份你的数据。
WSL2 和 WSL1 的磁盘架构完全不同。WSL1 直接使用 Windows 文件系统,WSL2 则使用一个 ext4.vhdx 虚拟磁盘文件。升级转换过程中,系统会把 WSL1 里的文件迁移到新的虚拟磁盘里,这个迁移过程偶尔会出幺蛾子。
最简单的备份方式,把 WSL 里重要的文件复制到 Windows 目录下,或者直接用 wsl --export 导出整个发行版:
powershell复制wsl --export Ubuntu D:\backup\ubuntu-backup.tar
如果转换失败,还能用 wsl --import 把数据恢复回来。不要嫌麻烦,我就是因为懒,有一次转换中断,里面一个项目代码差点没了,后来花了一晚上才从临时文件里找回来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 两条升级路线:图形界面操作和命令行操作
2.1 路线一:纯界面操作,适合不喜欢碰命令的朋友
升级 WSL2 最稳妥的方式,其实是在 Windows 的“启用或关闭 Windows 功能”里把需要的组件打开,流程如下:
- 按下
Win + R,输入optionalfeatures,回车。 - 在弹出的窗口里,勾选三项:
- “适用于 Linux 的 Windows 子系统”
- “虚拟机平台”
- “Windows 虚拟机监控程序平台”(如果存在这一项)
- 点击确定,然后重启电脑。
- 重启后,到 微软官网 WSL 内核更新包页面 下载“适用于 x64 计算机的最新 WSL2 Linux 内核更新包”,双击安装。
- 下载并安装一个 Linux 发行版(比如从 Microsoft Store 安装 Ubuntu 24.04)。
完成之后,再打开 PowerShell 执行:
powershell复制wsl --set-default-version 2
这样以后安装的所有新发行版,默认都会以 WSL2 方式运行。
如果你不想用商店装发行版,也可以直接往下看第二部分的离线安装方法。商店有时候下载速度很慢,体验并不好。
2.2 路线二:纯命令行操作,一条龙安装
如果你用的是最新版 Windows 10 或 Windows 11,最省事的方式是直接用一条命令装好整套环境。以管理员身份打开 PowerShell,输入:
powershell复制wsl --install
这条命令会默认帮你做这几件事:
- 启用“适用于 Linux 的 Windows 子系统”功能
- 启用“虚拟机平台”功能
- 下载并安装最新的 WSL2 Linux 内核
- 将 WSL2 设为默认版本
- 安装默认的 Ubuntu 发行版
我实测下来,在 Windows 11 上执行这条命令,等几分钟就搞定了,后面跟着提示设置 Linux 用户名和密码就行。
如果想指定发行版,比如装 Ubuntu 24.04,用:
powershell复制wsl --install -d Ubuntu-24.04
装完之后,想确认是 WSL2 还是 WSL1,还是用刚才那条命令:
powershell复制wsl -l -v
2.3 将已有发行版从 WSL1 转为 WSL2
假设你之前在 WSL1 下装过 Ubuntu,现在想把它升级成 WSL2,不需要卸载重装,直接用命令转换即可。
先查出发行版的准确名称:
powershell复制wsl -l -v
假设你的发行版叫 Ubuntu,执行:
powershell复制wsl --set-version Ubuntu 2
系统会开始转换,过程可能持续几分钟到十几分钟,取决于你 WSL1 里的数据量。转换期间不要关闭 PowerShell 窗口,也不要重启电脑,让它安安静静跑完最好。
转换完成后再确认版本:
powershell复制wsl -l -v
如果看到 VERSION 列变成了 2,就说明大功告成。
注意:
wsl --set-version Ubuntu 2的转换只对已有的这个发行版生效,以后新装的发行版默认版本是 1 还是 2,取决于wsl --set-default-version的值。
3. 离线安装与疑难杂症:网络慢、403、内核装不上怎么处理
3.1 为什么 wsl --install 会卡很久,甚至直接 403
很多朋友反应 wsl --install 太慢了,有的还直接报 已禁止(403)。这个问题我研究过,本质上是因为 wsl --install 需要从微软服务器拉取 WSL 内核和相关组件,而某些网络环境下,访问 Windows 更新服务器或者 Microsoft Store 的速度非常不稳定,甚至被干扰。
遇到这种情况,最直接的解决方案是走“手动离线安装”路线,完全绕开在线下载环节。
3.2 完整离线安装 WSL2 流程
离线安装一共三步,每一步都可以手动完成,完全不依赖 wsl --install 的在线下载。
第一步:启用必要 Windows 功能
以管理员身份打开 PowerShell,执行以下两条命令:
powershell复制dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
第一条启用 Linux 子系统功能,第二条启用虚拟机平台。执行完重启电脑。
第二步:安装 WSL2 内核更新包
去微软官网手动下载“WSL2 Linux 内核更新包”,对应下载链接一般是:
text复制https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
如果用浏览器直接访问这个地址总是失败,可以换个思路:直接在搜索引擎搜“WSL2 Linux 内核更新包下载”,找到微软官方页面后再从页面里的链接下载。现在新版的 WSL 内核也支持通过 wsl --update 命令在线更新,但如果你 wsl --install 都 403 了,那 wsl --update 大概率也不顺,还是老老实实下 MSI 安装包最靠谱。
下载后双击运行,一路 Next 完成安装。
第三步:安装 Linux 发行版
这里有两种方式。如果你能找到 Microsoft Store 里的 Ubuntu 页面,并且商店下载正常,直接在商店安装最省事。但如果商店也是龟速,推荐用“rootfs 导入”的方式。
微软和 Ubuntu 官方提供了可以直接下载的 rootfs 包,下载后通过 wsl --import 导入即可。我记得有一个 Ubuntu 官方提供的 rootfs tarball 链接,格式类似:
text复制https://cloud-images.ubuntu.com/wsl/jammy/current/ubuntu-jammy-wsl-amd64-wsl.rootfs.tar.gz
下载到本地后,先创建一个目录用于存放 WSL 的虚拟磁盘文件,然后执行:
powershell复制wsl --import Ubuntu-DIY D:\WSL\Ubuntu-DIY D:\Downloads\ubuntu-jammy-wsl-amd64-wsl.rootfs.tar.gz --version 2
命令的意思是:将下载好的 rootfs 包导入为名为 Ubuntu-DIY 的发行版,数据放在 D:\WSL\Ubuntu-DIY 目录,版本指定为 WSL2。
导入完成后,启动它:
powershell复制wsl -d Ubuntu-DIY
rootfs 导入的发行版默认是 root 用户登录,没有普通用户。进去后可以自己创建用户和设置默认用户,命令如下:
bash复制useradd -m -s /bin/bash yourname
passwd yourname
然后在 /etc/wsl.conf 里写上:
ini复制[user]
default=yourname
再退出重新进入,就是普通用户身份了。
3.3 老版本 Windows 10 升级 WSL2 需要注意的补丁
如果是 Windows 10 1903 或 1909,直接安装 WSL2 可能会提示内核无法正常工作。这时候需要先安装 KB5004296 补丁,然后再走上面说的流程。补丁可以在 Windows 更新里搜索“可选更新”,或者在微软更新目录网站手动下载。
如果不想折腾老系统,我真心建议直接升级到 Windows 10 2004 以上版本或者 Windows 11,省去很多不必要的坑。
3.4 离线安装包和 rootfs 的选型建议
选择 Linux 发行版时,大多数人默认选 Ubuntu,因为教程多、资料全、软件源丰富。但其实 WSL2 还支持多种发行版,比如 Debian、Kali、openSUSE、Alpine 等,可以按需选择。
我自己常用的组合是:日常开发用 Ubuntu 24.04,轻量测试用 Alpine。Alpine 的 rootfs 非常小,启动速度快,内存占用感人,适合跑一些小脚本和容器测试。
4. 升级完成后的验证与常用配置
4.1 验证 WSL2 是否真的生效
升级完成后,别急着高兴,先做三件事确认环境没问题。
第一,确认版本:
powershell复制wsl -l -v
第二,在 WSL 里确认内核版本:
bash复制uname -r
如果能看到一个类似 5.15.x.x-microsoft-standard-WSL2 的内核版本号,说明你的 WSL 内核已经是真正的 Linux 内核了。如果显示的是 4.4.x 之类的老内核,可能还有问题。
第三,确认虚拟化是否正常:
bash复制systemd-detect-virt
如果输出 microsoft,说明系统检测到自己在 WSL 虚拟机里运行。
4.2 设置默认发行版和默认版本
如果机器上装了多个发行版,可以通过以下命令设置默认启动的发行版:
powershell复制wsl --set-default Ubuntu
设置所有新发行版默认使用 WSL2 版本:
powershell复制wsl --set-default-version 2
4.3 让 WSL2 使用 Systemd
新版的 WSL2 默认会启用 Systemd,这个功能非常关键。Systemd 是 Linux 系统的服务管理机制,没有它,很多服务(比如 Docker、SSH)无法开机自启。
确认 Systemd 是否启用,在 WSL 里执行:
bash复制systemctl --version
如果提示找不到命令,或者你用的是旧版本 WSL,可以手动在 /etc/wsl.conf 里加上:
ini复制[boot]
systemd=true
然后回到 Windows 执行 wsl --shutdown,再重新进入 WSL,Systemd 就生效了。启动后可以验证:
bash复制systemctl list-units --type=service --state=running
能看到一堆服务在跑,说明 Systemd 工作正常。
4.4 在 VSCode 里使用 WSL2
这步几乎是所有开发者的刚需。WSL2 装好后,在 Windows 上安装 VSCode,再装微软官方的“WSL”扩展,然后在你 WSL2 的项目目录里运行:
bash复制code .
VSCode 会自动以“WSL”模式打开当前目录,左下角会显示类似“WSL: Ubuntu”的标识。整个编辑、调试、终端都运行在 Linux 环境里,非常爽。
有朋友问过我:在 WSL2 里跑 VSCode,和直接在 Windows 上跑 VSCode 有什么区别?区别很大,WSL 模式下的 VSCode 服务端跑在 Linux 里,编译器、解释器、调试器全都能直接访问 Linux 环境,省去了“Windows 一套环境、Linux 一套环境”的重复配置烦恼。
4.5 安装 Docker Desktop 并开启 WSL2 后端
升级 WSL2 的一个重要原因就是 Docker。Docker Desktop 安装时,会让你选择后端引擎:
- Use WSL 2 based engine
- 使用 Hyper-V
一定要选择 “Use WSL 2 based engine”,这样 Docker 的守护进程会跑在 WSL2 的虚拟机里,启动速度更快,内存占用更可控,关键是还能和 WSL 里的 Linux 环境共享 Docker 命令。
安装完成后,在 Docker Desktop 的 Settings 里找到 Resources -> WSL Integration,打开你需要的发行版集成开关,这样在 WSL 终端里直接输 docker ps 就能用,不用每次切回 Windows。
4.6 配置网络代理和镜像源,提高下载速度
国内使用 WSL2 时,很多时候会遇到 GitHub、Docker Hub 等资源下载慢的问题。这个可以通过配置代理和镜像源缓解。
在 WSL2 里配置代理,关键是拿到 Windows 宿主机的 IP。注意 WSL2 是虚拟机,不能直接用 localhost 访问宿主机。以前可以通过 /etc/resolv.conf 里的 nameserver 拿到宿主机 IP,新版的 WSL 则可以使用一个特殊的域名 host.docker.internal 或者通过 ip route show | grep default 获取。
举个例子,假设 Windows 宿主机 IP 是 172.x.x.1,WSL 里的代理端口是 7890,在 ~/.bashrc 里加:
bash复制export http_proxy="http://172.x.x.1:7890"
export https_proxy="http://172.x.x.1:7890"
然后 source ~/.bashrc 生效。
如果是 Ubuntu,建议把软件源换成国内镜像源,比如清华、阿里云、中科大的镜像,命令就不多写了,网上教程很多,注意备份一下原来的 sources.list 就行。
4.7 WSL2 的磁盘和内存占用管理
WSL2 使用一个名为 ext4.vhdx 的虚拟磁盘文件,默认最大可以增长到 256GB,存储在 Windows 的某个目录下。这个文件只增不减,即使你在 Linux 里删了很多文件,虚拟磁盘文件也不会自动缩小。时间久了会非常占磁盘空间。
手动压缩虚拟磁盘的方法是:
wsl --shutdown关停所有 WSL 实例- 找到该发行版的
ext4.vhdx文件位置 - 在 Windows 中以管理员身份打开 PowerShell,执行
diskpart - 依次执行:
text复制select vdisk file="完整路径\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
这个过程我操作过几次,能把原本 60GB 的虚拟磁盘压缩到 30-40GB,效果很明显。
内存方面,Windows 11 和较新版 WSL 可以通过 .wslconfig 文件限制 WSL2 的最大内存。在 C:\Users\你的用户名\.wslconfig 文件里写:
ini复制[wsl2]
memory=4GB
processors=4
swap=2GB
然后 wsl --shutdown 再重新启动,配置就生效了。这个对于老电脑、内存小的用户非常有用,否则 WSL2 可能会吃掉大量系统内存。
5. 常见错误排查:从报错代码到解决方案
5.1 错误代码 Wsl/WslService/CreateVm/Hcs/Error_File_Not_Found
这个错误我遇到过一次,印象很深。它通常出现在 WSL 启动时,报 error_file_not_found,让人感觉莫名其妙,因为明明没有删除任何文件。
产生原因一般是 WSL2 的底层虚拟机配置出现异常,或者 ext4.vhdx 文件损坏、路径错误。排查顺序是:
- 执行
wsl --shutdown彻底关闭 WSL - 检查发行版注册信息是否完整,用
wsl -l -v看看发行版是否正常列出 - 如果
wsl --import时指定的存储目录被移动或删除,也会导致这个错误,需要重新导入或者修改注册表路径
我当时的解决办法是重新导入发行版:先用 wsl --export 导出(如果还能导出的话),再删除原发行版,最后用 wsl --import 重新导入到新目录。整个过程十分钟,数据基本无损。
5.2 wsl --update 报 403 / wsl --install 报 403
这个在“离线安装”部分已经提到过。这里再补充一点:如果你的网络本身没问题,但执行 wsl --update 还是 403,可能是公司网络策略或安全软件拦截了 WSL 更新请求。可以把系统地区切换到非中国区再试一次(这个操作有争议,但确实有效),或者直接用浏览器下载 MSI 安装包手动更新。
5.3 无法将“wsl”项识别为 cmdlet
这个说明你的系统根本没有安装 WSL,wsl.exe 不在 PATH 环境变量中。解决方法是确认是否执行过 wsl --install 或者 dism 启用功能命令,如果没有,重新按第一部分的操作来。如果执行过但还是报错,那么需要检查 C:\Windows\System32\wsl.exe 文件是否存在,不存在的话,去 Windows 更新里检查有没有待安装的更新,有些系统组件需要更新后才能出现 wsl.exe。
5.4 中文乱码和 UTF-8 编码问题
有些朋友在 WSL 里跑 Windows 文件中的中文内容时,会看到一堆乱码。这通常不是 WSL 的问题,而是 Windows 的中文编码(GBK)和 Linux 的 UTF-8 不一致导致的。
解决办法分两种:一种是在 Windows 设置里开启“Beta:使用 Unicode UTF-8 提供全球语言支持”,这样系统层面会尽量统一用 UTF-8;另一种是在 Linux 端用工具转换编码,比如 iconv、dos2unix 等。
5.5 常见错误速查表
| 错误 | 可能原因 | 解决方案 |
|---|---|---|
wsl --install 太慢 / 403 |
网络不稳定,商店下载受限 | 离线安装或 wsl --update 手动更新 |
Error_File_Not_Found |
虚拟磁盘文件丢失或路径异常 | wsl --shutdown 后重新导入发行版 |
无法将 wsl 识别为 cmdlet |
系统未安装 WSL 组件 | 启用 Windows 功能或升级系统版本 |
set-version 转换卡死 |
数据量大或磁盘性能差 | 耐心等待,不要中途关闭窗口 |
| Docker Desktop 无法连接 WSL | WSL 集成未开启 | 在 Docker Desktop Settings 中开启 WSL Integration |
| WSL2 内存占用过高 | 默认不限制内存 | 配置 .wslconfig 限制 memory |
5.6 万一翻车了:如何彻底卸载 WSL 重装
如果真的到了走投无路的地步,还有一个办法就是卸载重来。卸载 WSL 要卸干净,分几步:
- 列出所有发行版,并逐个注销:
powershell复制wsl --list
wsl --unregister Ubuntu
- 如果已经安装新版 WSL 应用商店版,可以在“设置 -> 应用”里卸载“Windows Subsystem for Linux”
- 最后在“启用或关闭 Windows 功能”里把“适用于 Linux 的 Windows 子系统”和“虚拟机平台”取消勾选,重启电脑
这样基本能清干净。之后再重新安装,就是全新的 WSL2 环境。
写在最后的实操心得
从 WSL1 升级到 WSL2,本质上是一次“小规模重装系统”的体验,需要你有耐心,也需要你养成备份的习惯。我个人这两年的使用感受是,WSL2 已经成为我在 Windows 上做开发最顺手的工具,比虚拟机轻量,比双系统省心,比 Git Bash 强大太多。
最后再分享一个小技巧:升级完 WSL2 之后,建议第一时间把常用工具装齐,比如 build-essential、git、curl、vim、htop、zsh 这些,一次性配好开发环境,省得以后用到什么装什么,零零散散很烦人。还有,记得设置好你自己的 .wslconfig,限制内存和 CPU,让 WSL2 跟 Windows 和谐共处。
