你是不是把“WSL2”敲成“WLS2”了?这两个字母一颠倒,搜索引擎出来的东西完全不是一回事。按标题上下文,你要装的应该是Windows Subsystem for Linux 2,通称WSL2。我在Windows下用了三年多,从WSL1一路用到WSL2,从最初只能在命令行里跑ls、grep的小玩具,到现在直接在Windows里开Docker、跑K8s、编译C++项目,WSL2已经成为我日常开发环境里最顺手的那个部分。这篇就把安装、配置、避坑的完整过程写下来,给同样想入坑的读者做一份能直接照着操作的教程。
WSL2不是虚拟机也不是双系统,它本质上是跑在Windows里的一个轻量化Linux环境,共享Windows内核的虚拟机平台,启动速度比VMware快不少,内存占用也比全虚拟机小得多。它适合谁?适合需要Linux环境做后端开发、运维脚本练习、跑数据库中间件、又不想为了一个apt命令去重装系统的人。也适合刚接触Linux的入门用户,因为完全不用折腾分区。
1. 为什么推荐WSL2而不是虚拟机或双系统
很多教程喜欢直接甩命令,但我觉得先搞清楚“为什么选它”更重要,否则你会带着错误预期踩一半的坑。
1.1 和传统虚拟机的本质区别
传统虚拟机像VMware、VirtualBox,是在Windows里跑一个完整的硬件模拟层,然后在这个虚拟硬件上装整套Linux系统。好处是隔离彻底,坏处是启动要几分钟、内存要吃几个GB、磁盘镜像动辄几十GB,而且和Windows之间的文件交换要靠共享文件夹,切换起来很别扭。
WSL2用了另一条路:它借用Windows的Hyper-V虚拟机平台,直接跑一个经过微软优化过的真实Linux内核,但通过特殊机制和Windows进程管理整合在一起。装完以后,你打开Windows Terminal输入wsl,几秒钟就能进入一个完整的Ubuntu命令行,内存开销远小于传统虚拟机,和Windows的文件互访几乎像本地目录一样自然。
1.2 WSL2与WSL1的取舍
WSL1本质上是一个“翻译层”,它把Linux系统调用翻译成Windows的系统调用,所以启动极快,兼容很多基础命令,文件IO也还可以。但一旦遇到依赖完整内核特性的软件,比如需要iptables、需要mount、需要某些内核模块的Docker容器,WSL1就顶不住了。
WSL2是做在轻量虚拟机里,跑一个真正的Linux内核,所以Docker能在里面直接跑,fuse、inotify这类内核特性也都支持。代价是文件IO性能在跨Windows文件系统时会降低,如果你把项目直接放在/mnt/c/下面用WSL2编译,会有明显的性能损失。所以我一般强调:代码放Linux自己的文件系统里,通过\\wsl$路径访问,效率更好。
1.3 什么样的开发场景最适合WSL2
后端开发是最典型的场景。比如你要在本地启动一个Elasticsearch,Windows原生版不是不能跑,但版本一多、环境一乱就头疼;在Windows上装Docker也要额外装Docker Desktop,底层还是绕不开虚拟机。有WSL2以后,这些都可以在同一个Linux环境里搞定,你还能直接在Windows侧用VSCode远程连接WSL2里的目录,编辑体验和本地几乎没差别。
如果你只是偶尔想查几个Linux命令,或者只用来看log,WSL1也够用了。但既然现在WSL2这么稳,直接上WSL2是更省心的选择。安装起来也不比WSL1复杂。
2. 安装前的准备工作
不要越级直接执行安装命令。先花两分钟确认硬件和系统层面是否满足条件,不然你会在报错信息里绕半天。
2.1 确认Windows版本和硬件虚拟化
WSL2要求64位Windows 10版本2004及以上,或者Windows 11。Windows 10 1909及以下版本虽然能用WSL1,但装WSL2会比较麻烦。最简单的确认方法:在“运行”里输入winver,看弹出的系统信息。
硬件虚拟化一定要在BIOS里开启。现在大多数新电脑默认是开着的,但有些品牌机默认关闭。你可以打开任务管理器,切到“性能”页,看左下角是否有“虚拟化: 已启用”。如果显示“已禁用”,需要进BIOS找到Intel Virtualization Technology(VT-x)或AMD SVM Mode,把它改成Enabled,保存重启。这一步不做,后面启动WSL2会直接提示0x80370102。
2.2 开启“Windows Subsystem for Linux”和“虚拟机平台”功能
在Windows功能列表里,需要勾选两个和WSL2直接相关的组件:“适用于Linux的Windows子系统”和“虚拟机平台”。如果只用WSL1,第一个就够了;要跑WSL2,两个都得开。
可以用图形界面操作,但我更习惯用管理员权限的PowerShell直接跑命令,这样方便记录和排查:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完以后,根据提示重启系统。别偷懒不重启,我当时第一次就是没重启直接装,结果后面一连串错误,最后还是要重启才能解决。
2.3 安装内核更新包与WSL命令行基础命令
如果你是Windows 10较老版本,还需要手动下载一个WSL2内核更新包,这是微软官方提供的MSI文件,装上就完事。Windows 11和更新版本的Windows 10一般不需要,系统会通过Windows Update自动带上。
安装完后,打开Windows Terminal或者PowerShell,先确认一下wsl命令是否可用:
wsl --status如果提示“默认版本:2”,说明已经进入WSL2状态。如果还没有,或者提示无法识别命令,先执行:
wsl --update这会拉取最新的WSL组件。注意这一步需要网络畅通,国内网络环境下这一步一般没问题,偶尔会慢,耐心等就好。
3. 安装与初始化Linux发行版
准备工作做完,真正安装Linux发行版其实非常快。微软商店里的Ubuntu、Debian、openSUSE等发行版都能用,但命令行安装才是最省事的。
3.1 用wsl --install一键安装Ubuntu
新版本Windows下,一键安装非常简单。在管理员PowerShell里执行:
wsl --install -d Ubuntu这个命令会自动下载Ubuntu,并且创建WSL2环境。整个过程大概几分钟,取决于网速。执行完以后会自动进入Ubuntu初始化界面,要求设置一个新的UNIX用户名和密码。注意这个账号不是Windows账号,是Linux里的独立账号。密码输入时不会显示任何字符,你以为是坏了,其实是在等键盘输入。
如果你是Windows 10旧版,wsl --install可能不显示-d参数,那可以先去Microsoft Store搜“Ubuntu”并安装,安装后打开Ubuntu应用,也会进入同样的初始化流程。
3.2 后装其他发行版与切换默认发行版
装完一个之后,你可以继续装更多发行版。比如你在生产环境用Debian,想在本地复现,就执行:
wsl --install -d Debian安装多个发行版后,系统会有一个默认发行版,进入wsl命令时默认启动它。查看所有可用的发行版:
wsl --list --verbose wsl -l -v如果想把默认发行版改成Debian:
wsl --set-default Debian注意每个发行版的用户名、密码、软件源都是独立的,不要在一个发行版里改了配置,期望另一个也跟着变。
3.3 设置WSL2为默认版本并创建用户
有时候wsl默认版本还是1,需要手动指定:
wsl --set-default-version 2如果提示需要更新内核,就按之前说的执行wsl --update。安装Ubuntu完成后,首次初始化会让你创建用户名密码。如果你不小心跳过,或者想要root账号,也可以后面重新设置:
sudo passwd root设置完root密码后,日常使用还是应该用普通用户,只在需要时用sudo。WSL2默认以普通用户身份登录,不用像某些教程那样强制切到root,这样更安全。
3.4 文件系统互访:\wsl$与/mnt/盘符
WSL2安装好以后最重要的就是和Windows共享文件。在Windows资源管理器地址栏输入:
\\wsl$这里会列出所有发行版。点开Ubuntu,你就能看到Linux的根目录,可以直接用Windows资源管理器复制、移动文件。
反过来,在Linux里访问Windows盘:
ls /mnt/c/Users/你的用户名这里需要注意的是:如果项目需要频繁读写Windows磁盘,别直接放在/mnt/c下编译,性能会比较差。正确做法是把项目克隆到WSL2内部,比如~/projects,然后通过\\wsl$\Ubuntu\home\你的用户名\projects从Windows侧访问。我在实际项目里就把一个几万文件的Node项目放在Linux文件系统里,再通过VSCode的WSL远程模式打开,编译速度和直接在Linux服务器上差不多。
4. 环境配置与日常使用优化
装完只是开始。WSL2默认配置偏保守,内存不是吃满就是没用上,软件源在国外也慢。做完下面这几个配置,体验会顺很多。
4.1 用.wslconfig限制内存和CPU
WSL2默认的情况是:内存最多占用Windows总内存的50%,或者8GB,取较小值。如果你的电脑只有16GB内存,Windows和WSL2同时跑,可能会觉得有点紧。可以通过.wslconfig文件来精确控制。
在Windows用户目录(C:\Users\你的用户名)下新建一个文件,名字是.wslconfig,内容可以这样写:
[wsl2] memory=4GB processors=2 swap=2GB localhostForwarding=truememory限制WSL2最大内存,processors限制CPU核心数,swap是虚拟内存大小。改完后,在PowerShell执行:
wsl --shutdown再重新进入WSL2,配置才会生效。我以前默认情况下WSL2内存吃了6GB,但我实际只需要3GB,加了限制之后,Windows侧明显流畅很多。
4.2 替换软件源加速包下载
如果你用Ubuntu,apt默认源在国外,国内下载经常只有几十KB/s。换成阿里云或清华镜像后,速度翻好几倍。先备份原始源文件:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后编辑/etc/apt/sources.list。以Ubuntu 24.04(Noble)为例,用阿里云镜像的内容大致是:
deb http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse如果你不确定自己的Ubuntu版本,可以执行lsb_release -a查看。替换完以后:
sudo apt update执行update时看到从mirrors.aliyun.com拉取索引,就说明换源成功了。
4.3 安装Docker和常用开发工具
WSL2里跑Docker,是它最吸引人的地方。首先是安装依赖:
sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release添加Docker官方GPG密钥和仓库:
sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin最后启动服务:
sudo service docker start sudo usermod -aG docker $USER重新进入终端后,直接用docker version确认。日常写Python的话,系统自带python3,但版本可能不够新,推荐用工具如pyenv或直接用apt装最新版。Node的话,建议通过nvm安装,方便切换版本。
4.4 与Windows终端、VSCode的整合
WSL2最爽的一点就是和Windows工具链无缝配合。在WSL里输入explorer.exe .可以直接打开当前目录到Windows资源管理器:
explorer.exe .想用Notepad打开一个Linux下的文件:
notepad.exe ~/test.txt开发层面,VSCode的Remote - WSL扩展是标配。在Windows侧装好VSCode和Remote-WSL扩展后,在WSL目录下执行code .,VSCode会自动以远程模式启动,底部显示“WSL: Ubuntu”,你能直接用VSCode的图形界面编辑Linux里的文件,比较顺畅。
Windows Terminal也是强烈推荐的终端。安装后在设置里把默认终端改成“Windows Terminal”,启动配置文件里添加Ubuntu,以后打开终端直接就是Linux命令行,不再需要手动在PowerShell里输入wsl。
5. 常见问题与避坑指南
这一段是硬通货。我这几年前前后后帮同事处理过不少WSL2的问题,下面这些是出现频率最高的,每个都有对应的解决办法。
5.1 启动时报错0x80370102怎么办
这个错误基本等于告诉你,CPU虚拟化没开启。排查路径很清晰:
- 打开任务管理器,确认“虚拟化”状态;
- 如果显示已禁用,进BIOS开启Intel VT-x或AMD SVM;
- 开启后重启,再执行
wsl --set-default-version 2验证。
如果你确认BIOS已经开启,还会报错,检查一下Windows功能里的“虚拟机平台”是否真正启用了。用PowerShell执行:
Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform看State是不是Enabled,如果是Disabled,用前面dism命令开启再重启。
5.2 vmcompute服务异常导致WSL2无法启动
WSL2依赖一个叫Virtual Machine Compute的Windows服务,简称vmcompute。有时候Windows更新后,这个服务会停掉,导致所有WSL发行版启动时报“无法停止 vmcompute 服务”或者“操作超时”。可以在管理员PowerShell里查看服务状态:
Get-Service vmcompute如果状态不是Running,执行:
net start vmcompute如果服务被禁用,先在“服务”管理工具里找到Hyper-V Host Compute Service,把启动类型改为自动,再启动它。这个问题在Windows 11早期版本偶发,现在的版本已经稳定很多,但遇到WSL启动异常且无法定位时,先看一眼这个服务总没错。
5.3 WSL2磁盘膨胀的压缩方法
WSL2的磁盘镜像VHDX文件默认会“只扩不缩”。你安装了几个大软件、删了又装,删掉的文件不会自动释放空间,最终你会发现Windows的C盘越来越臃肿,而WSL2里的实际内容只占了一小部分。
压缩步骤如下:
- 在WSL2内清理系统:
sudo apt clean sudo apt autoremove- 用fstrim释放未使用的块:
sudo fstrim -v /这一步会告诉虚拟磁盘哪些块是空闲的,Windows侧才能安全压缩。
- 关闭WSL2:
wsl --shutdown找到发行版的VHDX文件。默认路径在
C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited...里,可以搜索.vhdx。用diskpart压缩。管理员PowerShell执行:
diskpart select vdisk file="C:\Users\你的用户名\AppData\Local\Packages\Ubuntu...\ext4.vhdx" attach vdisk readonly compact vdisk detach vdisk exit注意路径要根据实际发行版调整。我给同事操作过一次,原本30GB的VHDX压缩到了8GB,效果很直观。
5.4 网络DNS失灵和端口访问的排查
WSL2的网络模式是NAT,内置DNS解析默认会借鉴Windows的DNS配置。如果Windows网络环境变化频繁(比如换了wifi、用了公司网络),WSL2里可能出现apt update能连但ping域名不通的情况。这时先看/etc/resolv.conf:
cat /etc/resolv.conf如果里面指向的DNS不可用,可以改成公共DNS,比如:
sudo sh -c 'echo "nameserver 223.5.5.5" > /etc/resolv.conf'但要注意,WSL2重启后会自动重新生成resolv.conf。如果你希望手动固定DNS,在/etc/wsl.conf里加上:
[network] generateResolvConf = false然后重启WSL,之后再手动改/etc/resolv.conf就不会被覆盖了。
至于端口访问,WSL2里启动的服务(比如nginx监听8080)一般在Windows侧可以直接通过localhost:8080访问,因为默认开启了localhostForwarding。如果你遇到访问不了,先确认服务监听的是0.0.0.0而不是127.0.0.1,再检查Windows防火墙是否拦截了相关端口。用curl.exe http://localhost:8080是从PowerShell里测WSL服务的一个好办法。
我在实际使用中还有一个小习惯:所有WSL2里的服务都让它们监听0.0.0.0,然后用localhost在Windows侧访问,很少遇到端口转发问题。如果哪天访问不通了,第一条命令永远是wsl --shutdown再重启,因为很多时候只是虚拟网络设备在小睡之后没醒过来。