做后端或者搞算法的人,应该都体会过这种纠结:主力机是Windows 11,但代码得在Linux环境里跑。以前要么开个虚拟机,要么装双系统,各有各的折腾。我用WSL2加Ubuntu 22.04这套组合已经两年多,现在日常开发、跑脚本、调模型基本都在这套环境里完成,再也没为“要不要重装个Ubuntu”纠结过。这篇就把我从零搭建Windows 11下Linux环境的完整过程写出来,包括怎么装、装完怎么配、遇到问题怎么排,以及踩过的坑。内容覆盖从安装到进阶配置的完整链路,适合刚接触WSL2的新手,也让已经装好但用着不顺的人有地方参考。
1. 为什么是WSL2:它和虚拟机、双系统到底差在哪
1.1 三种方案的使用场景对比
很多人在选方案时第一个问题就是:我用虚拟机不行吗?非得WSL2?我这些年三种方式都深度用过,简单说说各自的定位。
双系统适合那些需要完整硬件性能、要跑GPU训练、要做内核级开发的场景。但它最大的问题是切换成本:必须重启进另一个系统,两边文件系统互相访问别扭,Windows和Linux的数据基本是割裂的。我当年装完双系统后,实际使用频率越来越低,因为每次重启实在太劝退。
虚拟机(比如VirtualBox、VMware)的好处是隔离完整、不破坏宿主机,适合当“一次性测试环境”或者跑不想要了随时删的系统。缺点是性能损耗明显,尤其磁盘I/O和图形界面,而且虚拟机里的Linux访问宿主机文件效率很低,来回复制文件相当难受。
WSL2走的是完全不同的路线:它不是一个完整模拟器,而是基于Windows自带的虚拟机平台跑一个轻量级Linux内核,开机启动速度比虚拟机快一个量级,内存占用也克制得多。更重要的是它和Windows原生共享文件系统,你能在Windows资源管理器里直接打开Linux目录,也能在WSL2里直接访问/mnt/c/下的Windows文件,这种互操作体验是前两种方案给不了的。
1.2 WSL2的架构优势与短板
WSL2和WSL1的最大区别是底层架构。WSL1通过翻译层把Linux系统调用转成Windows调用,兼容性有限;WSL2则是一个真正的轻量虚拟机,Linux内核在Hyper-V虚拟化平台里真实运行,系统调用的兼容性接近原生,这也是它能跑Docker、跑CUDA这类需求的基础。
我个人的体感是:日常写代码、跑Python、用Git、编译小项目,WSL2的速度和原生Linux基本没有体感差异。就算跑一些重量级任务,比如Maven构建、Node的Webpack打包,比Windows原生环境还要稳定——因为路径转换、文件监听这些在原生Linux语义下更不容易出问题。
短板也是真实存在的。首先是跨文件系统的I/O性能,如果你把项目放在Windows目录(/mnt/c/...)下用WSL2里的工具构建,速度会明显偏慢,正确做法是把项目放在WSL2家目录下。其次是GPU和硬件直通能力有限,虽然CUDA已经能跑,但涉及USB直通、特殊外设时,还是得用完整虚拟机或双系统。最后,WSL2的网络默认走NAT模式,和宿主机是两个网络栈,个别场景(比如局域网设备直接访问WSL2服务)需要额外配置。
一句话总结:WSL2是“90%日常开发场景”的最优解,但如果你要做硬件相关、完整桌面体验、极致的I/O性能,那它替代不了双系统。想清楚这一点,后面所有配置就都很顺了。
2. 动手前先做三件事:版本检查、BIOS虚拟化和Windows功能
2.1 版本与硬件检查
安装WSL2之前,先确认系统满足条件,这一步最多花两分钟,但能省掉后面一大堆莫名其妙的问题。
首先确认Windows 11版本。WSL2在Windows 11 21H2及以上版本里体验最完整,一般只要系统更新到最新,都没问题。在“运行”里输入winver可以快速看到版本号,如果是22H2或者更新的版本,放心往下走。
其次是确认CPU虚拟化已经开启。打开任务管理器,切到“性能”页签,看CPU一栏是否有“虚拟化:已启用”。如果没有显示“已启用”,大概率是BIOS/固件里关了虚拟化功能(Intel的VT-x或者AMD的SVM),后面装WSL2会遇到“尚未准备就绪”之类的错误。
还有一个容易忽略的检查点:如果机器内存小于8GB,建议开WSL2之前先掂量一下。WSL2默认会占用一定内存,虽然能在.wslconfig里限制上限,但内存只有4GB的老机器,同时跑Windows和WSL2确实会比较紧张,这种情况更推荐用WSL1。
2.2 开启CPU虚拟化
如果任务管理器里显示虚拟化未开启,需要进BIOS设置。不同品牌主板入口不一样,一般是开机时按Del或者F2,但联想、戴尔这些品牌机也可能是F12或者Esc,具体看开机画面提示。
进BIOS之后找CPU配置相关的菜单,Intel平台找Intel Virtualization Technology(也有叫VT-x的),AMD平台找SVM Mode,改成Enabled保存退出。注意安全功能的名字容易混淆,不要和VT-d搞混,那个是I/O虚拟化,WSL2依赖的是CPU虚拟化,虽然一起打开也无妨。
改完后回到Windows,再确认一次任务管理器里的虚拟化状态。这一步如果没做对,后面无论怎么折腾wsl --install,都可能碰到系统提示虚拟化平台未开启的问题。
2.3 启用WSL相关Windows功能
Windows上有些可选功能默认是关闭的,需要手动打开。这一步需要管理员权限的PowerShell或CMD。
以管理员身份打开PowerShell,依次执行下面两条命令:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart第一条是启用WSL(Windows Subsystem for Linux)基础功能,第二条是启用虚拟机平台。执行完之后系统会提示重启,一定重启一次再继续。这一步别跳过,很多人后面遇到“WSL2尚未准备就绪”或安装内核失败,回头查基本都是功能没开全。
如果你用的是Windows 11较新版本,wsl --install命令本身也会自动打开这些功能,但如果你的系统之前改过可选功能,或者从旧版本升级上来,手动执行一遍更稳妥。反正也就两行命令的事。
3. 正式安装:从一行命令到Ubuntu 22.04跑起来
3.1 用wsl --install装好底层
Windows 11系统在满足前面的条件后,安装WSL2比你想象中简单。还是在管理员PowerShell里,执行:
wsl --install这条命令会帮你做完大部分事情:启用需要的Windows功能、下载并安装WSL2内核、安装默认的Linux发行版(通常是Ubuntu最新LTS)。如果你不想装默认版本,想直接指定Ubuntu 22.04,那就用:
wsl --install -d Ubuntu-22.04首次执行完后重启电脑。重启后再打开终端,系统会自动进入Ubuntu 22.04的初始化流程。
这里多说一句:旧版本的安装方式(手动下载WSL包、手动装Ubuntu App)已经不需要了,新版本Windows 11全部走wsl --install就够。如果遇到下载慢或者中途失败,多半是网络波动,重试一次或者换个时间段再跑,一般能过。
3.2 安装Ubuntu 22.04并完成初始化
重启后第一次启动Ubuntu 22.04,会提示设置UNIX用户名和密码。这个用户名不需要和Windows用户名一致,密码也随意,但一定要记好,后面用到sudo的次数太多了。
设置完会直接进入Linux Bash提示符,这时候可以做几件基础的事:
sudo apt update sudo apt upgrade -y sudo apt install -y build-essential git curl wgetbuild-essential包含gcc、g++、make这些编译工具,几乎是开发环境标配;git和curl/wget就不多解释了,装完基本就能开始干活。如果网络慢,别急,第4节有换源的方案。
3.3 用命令确认安装结果
装完别急着关,先确认一下WSL2的版本和发行版状态。在Windows PowerShell里执行:
wsl --status wsl --list --verbose第一条能看到默认版本是否是2,第二条能看到所有已安装的发行版列表,以及它们的运行状态和存储占用。正常应该看到Ubuntu-22.04这一行,VERSION列显示2。
如果你发现VERSION是1,说明发行版还在用旧的WSL1模式,用下面命令手动转换:
wsl --set-version Ubuntu-22.04 2转换可能要花一两分钟,等它提示转换完成就好。这里有个小技巧:wsl --set-default-version 2可以把默认版本改成2,以后安装新发行版时都默认用WSL2,不用每次手工转换。
4. 安装提速与踩坑实录:下载慢、尚未准备就绪、网络异常
4.1 下载慢的提速办法
“wsl2下载慢”是我看到最多人问的问题之一。这里有两层含义:一是wsl --install下载WSL2包慢,二是Ubuntu 22.04每次apt update时,从官方源拉取软件包慢。
第一层慢,通常发生在安装WSL2内核或者初始下载发行版时。这类下载走的是Windows系统组件下载渠道,受所在网络环境影响较大,没有太多本地控制的办法,最实际的做法就是多试几次,选择一个网络空闲的时段再装。安装包本身不大,一旦下载完成进入安装阶段就基本不会卡了。
第二层慢是日常使用中真正烦人的,解决办法是把Ubuntu的apt源换成国内镜像。我习惯用清华TUNA或者阿里云的镜像,速度稳定得多。以清华源为例,先备份再替换:
cd /etc/apt sudo cp sources.list sources.list.bak sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list sudo apt update阿里云源同理,把域名换成mirrors.aliyun.com即可。21.04之后版本的Ubuntu还引入了ports.ubuntu.com,但22.04的x86_64版本用上面这条替换就够了。换完之后apt update的速度体感差别非常大。
4.2 “wsl2 尚未准备就绪”的排查链路
这个错误提示很经典,出现的时候通常伴着无法启动任何发行版。我按实际排查顺序说一下:
第一步,检查虚拟化是否真的开启了。有时候BIOS里改了,但Windows快速启动或休眠导致内核状态异常,直接重启电脑更有效。
第二步,在管理员PowerShell里执行wsl --update,手动更新WSL2内核。这个操作会把内核更新到最新版本,很多“尚未准备就绪”的问题就是内核版本太老导致的。
第三步,确认Windows相关功能没有被安全软件或系统策略禁掉。打开“启用或关闭Windows功能”,看“适用于Linux的Windows子系统”和“虚拟机平台”两项是否都已经勾选。如果被勾掉了,重新勾上并重启。
第四步,检查系统虚拟化状态:
systeminfo | find "Hyper-V"看到“Hyper-V要求: 已检测到虚拟机监控程序。将不启用Hyper-V”这类的提示一般没问题;如果提示“固件中已禁用虚拟化”,说明BIOS那一步还没做对。
4.3 WSL2的网络配置异常处理
WSL2默认网络模式是NAT,虚拟网卡和宿主机不在同一个子网。大部分情况下这不妨碍使用,因为你上网、apt update、访问远程服务器都是正常的。但有几个典型问题需要单独处理。
一是WSL2里访问Windows上的服务,一般直接用localhost就行,WSL2做了NAT转发,不用记IP。反过来,如果Windows要访问WSL2里启动的服务(比如开发服务器监听在某个端口),通常也直接访问localhost即可,新版WSL2对端口转发支持得比较好,但偶尔会因为防火墙或Windows更新导致自动转发失效。遇到这种情况,在Windows PowerShell里执行wsl --shutdown再重启WSL2,往往就能恢复。
二是WSL2里的时间不同步。如果你发现date显示的UTC时间和Windows对不上,执行:
sudo hwclock -s让它与硬件时钟同步即可。
三是DNS偶尔失灵,导致能ping通IP但域名解析不了。检查一下/etc/resolv.conf,如果里面是空的或只有一行奇怪的注释,重启WSL2:
wsl --shutdown再启动一般就恢复了。这类网络问题本质都是WSL2作为轻量虚拟机的网络栈特性导致的,绝大多数都能靠重启WSL2解决,不用太焦虑。
5. 存储优化:把WSL2迁到D盘,给C盘减负
5.1 导出导入法迁移发行版
WSL2默认把虚拟磁盘文件存在%LOCALAPPDATA%\Packages\...\LocalState\ext4.vhdx,路径藏在C盘用户目录下。开发用久了,这个vhdx文件能膨胀到几十GB,C盘扛不住。我基本每半年就迁移一次,流程非常成熟。
先把WSL2正常关闭:
wsl --shutdown然后导出当前发行版为tar包:
wsl --export Ubuntu-22.04 D:\wsl-backup\ubuntu22.04.tar接着注销当前发行版(注意:注销会删除当前发行版的所有数据,所以上一步的导出必须成功之后再继续):
wsl --unregister Ubuntu-22.04最后把tar导入到D盘的新位置:
wsl --import Ubuntu-22.04 D:\WSL\Ubuntu-22.04 D:\wsl-backup\ubuntu22.04.tar导入完成后,发行版会被注册,默认进入root用户,文件也搬到了D:\WSL\Ubuntu-22.04。最后把之前的tar包删掉就行,但建议保留一段时间,确认一切正常再删。
5.2 指定默认用户和磁盘瘦身
用import方式迁移后的发行版有个典型问题:默认登录用户变成了root,之前那个UNIX用户还在,但你每次打开终端都是root,不习惯也容易误操作。解决办法有两种:一是改配置文件,在WSL2发行版内编辑/etc/wsl.conf,加上:
[user] default=你的用户名保存后重启WSL2,默认用户就恢复了。二是在Windows侧用命令指定,Ubuntu发行版自带配置:
ubuntu2204 config --default-user 你的用户名磁盘瘦身是另一个常被忽略的点。WSL2的vhdx文件只增不减,你删了再多文件,虚拟磁盘文件可能还是那么占用。压缩方法是:关闭WSL2后,在管理员PowerShell里用diskpart,依次执行:
select vdisk file="D:\WSL\Ubuntu-22.04\ext4.vhdx" attach vdisk readonly compact vdisk detach vdisk执行完后vhdx会尽量收缩到实际使用大小。我试过把60多GB的文件压回20多GB,效果非常明显。
5.3 配置Docker等其他数据目录
如果你装了Docker Desktop且使用WSL2后端,Docker的数据也会存在WSL2的发行版里,C盘压力会更大。Docker Desktop本身在设置里可以改WSL2数据目录,位置在“Settings -> Resources -> Advanced -> Disk image location”,把那里改到D盘。
如果不用Docker Desktop,而是直接在WSL2里装Docker Engine,数据目录默认在/var/lib/docker,一样在虚拟磁盘里。想单独指定Docker数据位置,可以编辑/etc/docker/daemon.json,把>wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt update sudo apt install -y cuda-toolkit
装完在WSL2终端里执行nvidia-smi,如果能看到GPU信息,说明环境已经通了。再配合PyTorch的CUDA版本,就能直接在WSL2里训练模型。
这里有个我踩过的坑:在WSL2里编译CUDA项目时,gcc版本别太低,Ubuntu 22.04自带的gcc-11在多数情况下够用。如果编译报和CUDA版本不匹配的错,优先考虑升级CUDA Toolkit到最新版,而不是降gcc版本。
6.2 Docker Desktop与WSL2集成
在Windows 11上用Docker,最顺滑的方式就是配合WSL2。Docker Desktop安装时可以选“Use WSL 2 based engine”,安装完Settings里能指定哪些WSL发行版可以访问Docker。
选好集成之后,在Ubuntu 22.04里直接执行docker命令就能用,相当于Docker引擎跑在WSL2内核上,但命令行在Linux里执行,这是很舒服的开发体验。Windows侧再配一个VS Code的Dev Containers插件,就能做到完全在容器里开发。
需要注意的一点是资源占用。Docker Desktop默认分配的内存等于总内存的一半,如果开发机内存只有16GB,开了Docker之后WSL2的Linux内存会紧张不少。在.wslconfig里手动限制一下:
[wsl2] memory=6GB processors=4 swap=2GB保存后执行wsl --shutdown再启动,限制就生效了。
6.3 Kali Linux等其他发行版共存
WSL2的一个明显优势是能同时装多个发行版,互不干扰。我经常用Kali做安全测试,安装同样是一行命令:
wsl --install -d kali-linux装完用wsl -d kali-linux指定进入Kali,默认还是Ubuntu-22.04;不带-d参数时进入默认发行版。如果想把Kali设为默认,用:
wsl --set-default kali-linux多个发行版之间文件系统完全隔离,但都能访问Windows文件。我自己的习惯是:日常开发在Ubuntu 22.04,安全工具类的东西放Kali,两者共享Windows工作目录,互不污染。
7. 日常维护与善后:更新、重置、备份和彻底卸载
7.1 系统和软件包更新
WSL2里的Ubuntu本质就是一个正版Linux,日常维护节奏和物理机一样。最简单的更新:
sudo apt update && sudo apt upgrade -y建议每周跑一次,尤其Ubuntu 22.04这种长期支持版本,安全更新要及时。要清理不再依赖的包:
sudo apt autoremove -y sudo apt clean这些维护做完,虚拟磁盘文件里都是干净状态,定期关闭WSL2再compact一次vhdx,C盘占用会维持在一个很健康的状态。
7.2 重置、备份和彻底卸载
如果哪天把系统搞坏了,不用重装Windows。先试重置:在Windows的“设置 -> 应用 -> 安装的应用”里找到Ubuntu 22.04,进入高级选项,选择“重置”。这会恢复初始状态,但你的数据也可能一起没了,所以操作前一定要备份。
备份用导出最好,把整个发行版导成tar:
wsl --export Ubuntu-22.04 D:\backup\ubuntu.tar恢复则用wsl --import,整个过程都是文件级复制,不依赖任何备份软件,很可靠。
想彻底卸载,顺序是先注销发行版,再卸载应用:
wsl --unregister Ubuntu-22.04wsl --unregister会把虚拟磁盘文件一并删掉,相当于格式化。然后再去“设置 -> 应用”里卸载Ubuntu的App。要注意:注册表和残留配置如果还想清理,去%LOCALAPPDATA%\Packages\下找相关目录手动删除,但除非洁癖,一般没必要。
7.3 几个让我省心的使用习惯
最后分享几个纯经验层面的习惯,都是折腾出来的结论。
第一,所有项目文件放在WSL2的家目录里,而不是/mnt/c/下。跨文件系统读写慢的问题,放在家目录后用任何编译工具、包管理器都更舒服。需要和Windows交换文件时,用\\wsl$路径在Windows资源管理器里访问,或者干脆用VS Code直接编辑WSL里的文件。
第二,给WSL2配置一套独立的Git SSH key,别和Windows混用。这样在Linux和Windows下操作不同仓库时,认证互不干扰,也不会出现一个改动了公钥导致另一个环境失效的奇怪问题。
第三,不要试图在WSL2里跑桌面环境。虽然理论上能装xfce4之类的,但体验真的不怎么样,也会大幅增加内存负担。我见过有人把WSL2当轻量虚拟机用,装了个完整桌面,结果内存占用高到Windows都卡。WSL2适合的是终端工作流,图形需求交给Windows本机,各司其职效率最高。