(开头)
Windows下玩Linux,绕不开WSL。如果你已经装过WSL1,最近又总看到别人说“WSL2”“Docker + WSL2”“AI训练用WSL2”,那你大概率正在纠结一件事:怎么把手里的WSL升级为WSL2?别急,这篇文章就是专门写给小白的。我会从WSL1和WSL2的本质区别讲起,再带你把升级前要检查的东西过一遍,最后给出完整操作步骤和最常见的报错处理方案。整个过程不需要你有虚拟机基础,也不需要碰Linux内核源码,跟着一步步走就行,顺利的话十分钟内能搞定。
1. 别急着敲命令,先搞清楚WSL2和WSL1差在哪
很多人一听说升级就急着复制粘贴命令,结果遇到报错一脸懵。我建议你先花三分钟弄明白WSL1和WSL2到底差在哪,这样后面无论是操作还是排错,心里都有底。
1.1 WSL1像一个同声传译,能跑但有些话翻不了
WSL1的底层机制是“系统调用翻译”。你可以把Linux程序想象成一个只说中文的人,Windows内核想象成一个只说英文的人,WSL1就是坐在中间的同声传译,把Linux发出的系统调用翻译成Windows内核能理解的调用。
这套方案最大的优点是启动速度快、内存占用低,而且因为运行在Windows本机文件系统之上,你在Linux里访问/mnt/c目录下的Windows文件,速度几乎和原生Windows文件操作一样快。
但“翻译”终究有边界。很多依赖Linux内核特性的操作,WSL1没法翻译:内核模块完全加载不了,Docker跑起来各种别扭,inotify、io_uring这类底层机制支持不全,导致不少常用软件在WSL1里要么报错,要么静默出问题。我身边就有同事在WSL1里跑数据库容器,跑着跑着就崩溃,换了WSL2之后世界清净了。
1.2 WSL2是带着完整Linux内核的轻量虚拟机
WSL2换了路线,它不再做翻译,而是借助Windows的VirtualMachinePlatform功能,启动一个真正的Linux内核。这一次Linux程序是在原生内核环境里运行的,兼容性自然脱胎换骨。大多数在WSL1里跑不了的软件,到了WSL2都能正常跑。
代价也很直观:因为多了一层虚拟机环境,WSL2的启动时间比WSL1慢,不过实际也就是两三秒的事;内存占用会比WSL1高一些,默认最多可以吃掉物理内存的50%左右,小内存机器要注意。
还有一个容易被忽略的坑:WSL2访问Windows文件的速度明显不如WSL1。原因很简单,Windows文件在WSL2里要跨虚拟机文件系统协议才能访问,这个开销绕不开。所以如果你要在WSL2里做重IO操作,尽量把文件放在发行版自己的目录里,也就是/home/你的用户名下面,而不是放在/mnt/c里。
1.3 到底要不要升级?
我的判断标准很简单:如果只是一天到晚敲几条命令行、跑跑脚本,WSL1完全够用;如果你想在Windows下认真搞开发、用Docker容器、跑数据库、编译大型项目、甚至做AI训练,WSL2基本就是必经之路。
特别是Docker Desktop for Windows,官方主推的就是WSL2后端。你会发现升级完WSL2之后,Docker、数据库、编译这些重操作的稳定性比WSL1时代好太多了。
| 对比项 | WSL1 | WSL2 |
|---|---|---|
| 架构 | 系统调用翻译层 | 轻量虚拟机 |
| Linux内核 | 无完整内核 | 完整Linux内核 |
| 跨系统文件访问 | 快 | 慢 |
| Linux内部文件IO | 一般 | 好 |
| Docker等容器支持 | 不完整 | 接近原生 |
| 内存开销 | 低 | 较高 |
| 启动速度 | 极快 | 较快 |
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 升级前的三分钟自查,决定后面顺不顺
升级WSL2的很多失败,问题不是出在命令本身,而是环境没准备好。动手前我建议你花三分钟把下面三件事查一遍。
2.1 查系统版本,决定你能不能直接升级
WSL2对Windows版本有硬性要求:Windows 10版本2004及以上(内部版本19041或更高),或者Windows 11。版本不够的话,后面的步骤会处处受阻。
查询方法很简单:按Win+R键,输入winver回车,弹窗里会显示当前系统版本和内部版本号。看到“版本 22H2”“版本 21H2”这种字样,或者内部版本号大于等于19041,就满足条件。
如果你还在用1903、1909这种老版本,我建议先去Windows Update把系统更新到最新,再回来继续。强行在老版本上折腾WSL2,虽然微软提供了手动方案,但过程繁琐,不值得小白尝试。
2.2 查虚拟化状态,提前暴露BIOS里的问题
WSL2依赖CPU虚拟化。这一步经常被跳过,结果装完以后启动报错“未启用虚拟化”,你才回头查,白白浪费半小时。
最简单的检查方式:打开任务管理器(Ctrl+Shift+Esc),切到“性能”标签页,选中左侧的“CPU”,右下角有一个“虚拟化”状态。
- 显示“已启用”:BIOS层面没问题,可以直接往下走。
- 显示“已禁用”:需要重启进BIOS,把CPU虚拟化开关打开。
- 显示“已在固件中启用但未运行”:多半是Windows功能没开,后面第3章会处理。
BIOS里虚拟化选项的位置和名称因主板而异。Intel平台通常叫“Intel Virtualization Technology”或“VT-x”,AMD平台通常叫“SVM Mode”。进BIOS的方法动不动就是F2、Del、F10,品牌机建议直接搜“你的型号+开启虚拟化”,比在BIOS里翻来翻去快得多。
2.3 查现有WSL状态,看看你是哪种情况
打开Windows PowerShell(普通权限就行,查询用不到管理员),执行:
powershell复制wsl --status
wsl --list --verbose
第一条可以看到当前默认WSL版本,第二条能看到已经装过哪些发行版以及它们当前所在的WSL版本。这里有三种情况:
- 已有WSL1发行版,VERSION列显示1:这是最常见的情况,文章第3章的转换命令就是为你准备的。
- 已有发行版,VERSION列显示2:说明你其实已经在WSL2里了,不需要再折腾。
- 没有任何发行版:那你不需要走“升级”路线,直接在新装系统时选WSL2即可,第3章的安装路径也适用。
另外还可以用 systeminfo 看一眼Hyper-V要求部分,如果显示“已检测到虚拟机监控程序。将不显示 Hyper-V 所需的功能。”,说明虚拟化已经正常启用,心里更有底。
3. 完整升级路径:两条命令、一个安装包、一次重启
自查没问题后,就可以正式动手了。我按顺序把每一步拆开讲,命令都给全,你直接复制到管理员PowerShell里执行就行。
3.1 用管理员终端开启两个Windows功能
WSL2需要两个Windows功能支撑:一个是“适用于Linux的Windows子系统”,另一个是“虚拟机平台”。右键点击开始菜单,选择“Windows PowerShell(管理员)”或者“终端(管理员)”,然后执行:
powershell复制dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
第一条命令开启WSL基础功能,第二条命令开启虚拟机平台。如果你的系统已经有其他虚拟化软件在跑,比如VMware、VirtualBox,开启虚拟机平台后可能会需要重新兼容,这个后面遇到再说。
命令执行完一般会提示“是否立即重启”。我的建议是马上重启。千万别图省事连续搞完再重启,因为内核安装包和后续转换都依赖这两个功能真正生效,重启一次可以省掉很多莫名其妙的权限问题。
3.2 安装WSL2内核更新包
重启完成,重新打开管理员PowerShell,接下来需要安装WSL2内核更新包。这个包的本质是WSL2运行Linux内核所需的驱动组件,微软官方下载地址是:
https://aka.ms/wsl2kernel
下载后是一个msi安装包,双击运行,一路Next装完就行。这个包很小,按说下载不了几秒。如果下载特别慢,多半是网络环境的问题,换个网络或者换个时间段再试。
如果你的Windows版本比较新,其实不用手动下载,直接在管理员PowerShell里执行:
powershell复制wsl --update
这条命令会自动更新WSL内核到最新版本。两种方式选一个就行。实测下来,能自动更新就自动更新,省事且不容易装错版本。
3.3 设置默认版本,并把旧发行版转换到WSL2
内核装好后,还是在管理员PowerShell里,先把默认WSL版本设为2,这样以后新装的发行版默认都是WSL2:
powershell复制wsl --set-default-version 2
然后查看已有发行版列表:
powershell复制wsl --list --verbose
假设你看到有一个发行版叫“Ubuntu-22.04”,VERSION列是1,那就执行:
powershell复制wsl --set-version Ubuntu-22.04 2
系统会显示“正在进行转换,这可能需要几分钟时间”。转换期间千万别关终端、别重启电脑。等它提示“转换已完成”就算成功了。
如果你有多个发行版,每个都需要单独执行一次上面的转换命令。发行版名字用 wsl --list --verbose 里显示的实际名字替换就行。
3.4 验证是不是真的升级成功了
转换完成后,再次执行:
powershell复制wsl --list --verbose
看到VERSION列都变成2,说明系统层面已经升级到WSL2了。
光看列表还不够,稳妥起见,进入发行版终端,执行:
bash复制uname -r
如果输出里带“microsoft-standard-WSL2”字样,说明当前跑的就是WSL2内核。比如我的机器输出是 5.15.153.1-microsoft-standard-WSL2,这就没问题了。
顺带补充一个更省事的场景:如果你压根没装过WSL,只是想直接拥有WSL2环境,在管理员PowerShell执行一句 wsl --install 就能一键搞定,系统会自动开启功能、安装内核、装一个默认Ubuntu发行版。但如果你已经装过WSL1且有数据在发行版里,那还是老老实实走上面这套流程,避免数据迁移的麻烦。
4. “计算机上未启用虚拟化”这类报错,完整排查链路
升级过程中最劝退小白的,就是各种不明不白的报错。我把出现频率最高的几个场景整理成下面的排查链路,你照着顺序检查,能少走很多弯路。
4.1 报“未启用虚拟化”时,按顺序查这四层
完整的报错文案大概是:“WSL2 无法启动,因为此计算机上未启用虚拟化。请确保计算机固件设置中‘虚拟机平台’已启用。”看到这个提示,别急着重启进BIOS,先按下面的顺序排查。
第一层:Windows“虚拟机平台”功能到底开没开。在管理员PowerShell里执行:
powershell复制Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
看到State为Enabled,说明功能层没问题;如果是Disabled,回到第3章,用dism命令重新开启,重启后再试。
第二层:BIOS虚拟化是否真的开启了。执行:
powershell复制systeminfo
在“Hyper-V 要求”段落里看“虚拟化在固件中启用”这一项。显示“是”就说明BIOS没问题,显示“否”就去BIOS里开VT-x(Intel)或SVM(AMD)。很多品牌笔记本会把这类选项藏起来,实在找不到就去搜“笔记本型号 + 开启虚拟化”。
第三层:检查有没有其他虚拟化软件在干扰。老版本的VMware Workstation、VirtualBox和Hyper-V/WSL2是出了名的不对付。如果你电脑上装了这些,先看看能否升级到新版本,新版基本都支持共存。不能升级的话,就考虑在运行WSL2的时段内停掉这些虚拟化服务。
第四层:你的机器本身是不是一台虚拟机。如果你实在云服务器、虚拟机软件里再装Windows跑WSL2,那就必须开启“嵌套虚拟化”,不然WSL2永远起不来。这个场景平时用得少,但做开发测试或者看教程用虚拟机时特别容易踩。
4.2 安装和更新过程卡住、太慢、拒绝访问
热搜词里“用powershell命令行安装wsl2太慢”“wsl2 update慢”这类问题非常常见,原因多半出在下载环节。WSL2内核更新包和发行版安装文件都需要从微软服务器拉取,网络环境不好时,命令执行到一半卡住太正常了。
应对方法有三种:
- 优先手动下载内核更新包MSI,在浏览器里下载比命令行稳。
- 检查Windows Update服务是否被禁用。Win+R输入services.msc,找到“Windows Update”,确保它是“正在运行”状态。
- 公司网络、校园网这类受控网络环境可能会拦截安装包下载,换个网络环境往往立刻解决。
至于“安装wsl2拒绝访问”的报错,我遇到最多的情况就是PowerShell没有以管理员身份运行。WSL2的安装和升级命令都要求管理员权限,普通权限下执行必报拒绝访问。Windows的安全软件也可能拦截msi安装包,临时把实时保护关掉、装完再开,一般就能过。
4.3 转换完成后发行版进不去的应急方案
还有一种情况很让人崩溃:wsl --set-version 明明提示转换成功,但再次进入发行版时却卡住、黑屏或者闪退。根据个人经验,按下面的顺序处理。
第一步:执行 wsl --shutdown 把所有WSL实例彻底关掉,再重新启动发行版。这一步能解决大部分还挂着的临时状态问题。
第二步:如果还是进不去,重新执行一次转换命令:
powershell复制wsl --set-version Ubuntu-22.04 2
让它把转换流程完整重新跑一遍,期间务必别关机、别关窗口。
第三步:到“设置 -> 应用 -> 已安装的应用”里找到对应的Linux发行版,选择“高级选项”,执行“修复”或“重置”。这个过程大概率不会删除home目录下的用户数据,但严格来说有风险,操作前最好先备份。
第四步:如果上面都无效,就用导出导入大法。先 wsl --export 导出备份,然后 wsl --unregister 注销发行版,再 wsl --import 重新导入。这个方案相当于给系统做了一次完整的备份恢复,绝大多数发行版损坏都能救回来。
5. 升完之后的好处才刚开始:迁盘、网络与Docker
升级成功不代表折腾结束,恰恰相反,很多实用配置是从WSL2开始才真正好用的。这一章挑出三个小白最关心的话题:怎么把发行版挪到D盘、局域网访问怎么配、Docker怎么跑起来。
5.1 把WSL2发行版挪到非系统盘
很多人初始装WSL时没太在意,后来才发现发行版文件在C盘占了几个G甚至几十个G。如果C盘吃紧,完全可以把发行版迁到其他盘。
先停掉WSL:
powershell复制wsl --shutdown
导出当前发行版到备份文件:
powershell复制wsl --export Ubuntu-22.04 D:\wsl-backup\ubuntu.tar
注销现有发行版:
powershell复制wsl --unregister Ubuntu-22.04
再从备份导入到目标目录,比如D盘:
powershell复制wsl --import Ubuntu-22.04 D:\WSL\Ubuntu-22.04 D:\wsl-backup\ubuntu.tar --version 2
这里有个特别容易踩的坑:通过 wsl --import 导入的发行版,默认用户会变成root,而不是你之前的用户名。解决办法是进到发行版里,手动创建或修改 /etc/wsl.conf:
bash复制sudo vim /etc/wsl.conf
写入:
ini复制[user]
default=你的用户名
保存后执行 wsl --shutdown,重新打开发行版,用户就恢复成普通用户了。我第一次迁移时没注意这个,登录进去直接是root,后来才发现是import带来的默认行为。
5.2 WSL2网络配置:从localhost到局域网访问
WSL2默认走NAT网络,Windows里访问WSL2里的服务很方便,直接访问localhost端口就行。比如在WSL2里启动一个Web服务监听8080端口,Windows浏览器里打开 http://localhost:8080 就能访问。
但局域网里的其他设备要访问这个服务,就会遇到麻烦。WSL2的IP不固定,而且默认对局域网不可见。解决思路是在Windows上做端口转发:
powershell复制netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8080 connectaddress=<WSL2的IP> connectport=8080
同时给防火墙放行对应端口:
powershell复制netsh advfirewall firewall add rule name="WSL2 Port 8080" dir=in action=allow protocol=TCP localport=8080
不过手动转发有个痛点:WSL2的IP会在每次重启后变化,你得重新查IP再更新转发规则。所以如果你用的是Windows 11,我更推荐直接开启镜像网络模式。在用户目录下创建一个.wslconfig文件,写入:
ini复制[wsl2]
networkingMode=mirrored
执行 wsl --shutdown 再重新进入WSL2,WSL2会共享Windows主机的网络接口,IP和Windows一致,局域网访问的配置会简单很多。
5.3 Docker Desktop配上WSL2后端,容器体验直接起飞
升级WSL2以后,我最推荐做的事就是安装Docker Desktop for Windows。安装过程中勾选“Use the WSL 2 based engine”,装好后进入 Settings -> Resources -> WSL Integration,把你常用的发行版打开集成开关。
这时候在你选择的WSL2发行版终端里执行:
bash复制docker version
应该能看到客户端和服务端都正常运行了。比起过去在WSL1里费劲手动装Docker守护进程,用WSL2后端省事太多,而且性能和稳定性都接近原生Linux环境。
我个人的建议是:容器项目的工作目录尽量放在WSL2发行版内部文件系统里,不要放到/mnt/c下面,否则跨系统的IO性能会拖慢容器的启动和文件操作。这也是WSL2使用中最容易被忽略的性能要点。
5.4 进阶方向:CUDA与AI训练
如果你有NVIDIA显卡,又想尝试AI训练或深度学习实验,WSL2现在是Windows下的首选方案之一。只要Windows安装了支持WSL2的NVIDIA驱动,WSL2内部可以直接识别GPU,再装上CUDA Toolkit for WSL,就能在Linux环境里跑PyTorch、TensorFlow等项目。
这个方案的好处很明显:不用为了训练模型专门装一个Linux双系统,也不用来回重启切换。IDE、截图、微信这些日常工具留在Windows,训练代码放WSL2里跑,两边互不打扰。
需要注意的依旧是内存分配。默认情况下WSL2最多使用物理内存的50%,如果训练任务吃内存,可以在.wslconfig里临时调高,但别把内存全留给WSL,Windows本身也需要缓存和响应。这个平衡点要根据自己的机器配置多试几次。
到这里,升级WSL2这件事算是真正落地了。回顾整个流程,最核心的不是那些命令本身,而是升级前对系统状态有一个清晰认识:虚拟化开没开、系统版本够不够、现有WSL是什么状态。我个人的体会是,WSL2的坑大部分不是WSL2本身的问题,而是周围环境没有准备好。常见的原因就那么几个:BIOS虚拟化没开、Windows功能没开全、安装包被安全软件拦截。照着上面这些思路排查,基本都能找到出口。最后再多说一句,刚升级完WSL2之后,尽量把经常用的代码和数据放在发行版内部文件系统(/home/你的用户名)下面,体验会比放在/mnt/c下好得多,这也是我折腾这么久WSL2之后最想告诉你的一个细节。
