1. 安装前先想清楚:你需要的到底是WSL 1还是WSL 2
我第一次接触WSL(Windows Subsystem for Linux)是好几年前的事了,当时折腾双系统、虚拟机来回切换,光在Windows里写个Linux命令都得开个VMware,内存直接爆掉。后来微软推出WSL,等于在Windows里原生跑一个Linux子系统,不需要虚拟机那套虚拟化开销,启动一个终端就能用上bash、apt、Ubuntu那一套东西。这个概念一出来,我就知道Windows开发者的好日子来了。
但很多人上来就问“WSL怎么装”,其实WSL坑不多,真正要命的是版本选择。WSL分两代,WSL 1不是一个传统意义上的虚拟机,它是通过翻译层把Linux系统调用转成Windows系统调用,启动快、内存占用低,但兼容性有限,很多依赖内核模块的工具跑不起来。WSL 2则是真正跑在一个轻量级虚拟机里,里面是一个完整的Linux内核,Docker、CUDA、binwalk这类工具都能正常工作,代价是首次启动慢一点、内存占用稍微高一点。
1.1 两种版本的核心差异
如果你只是偶尔用一下bash命令、跑跑shell脚本,WSL 1够用。但只要你碰过这些场景——装Docker Desktop、做固件分析用binwalk、跑深度学习装CUDA、在WSL里跑conda环境——WSL 1马上就会成为瓶颈。最典型的问题是Docker,WSL 1不支持完整的Docker守护进程,很多教程会让你绕来绕去,最后你还是得切到WSL 2。
还有一个很多人忽略的差异:文件系统性能。WSL 1访问Windows盘符下的文件速度比较快(因为本身就是文件映射),而WSL 2在访问/mnt/c这类跨系统文件时,因为要走9P协议,速度慢得让人抓狂。反过来,WSL 2在自家Linux文件系统(也就是/home、/root)里读写速度吊打WSL 1,编译源码、跑数据库、解压大文件,体验完全是两个级别。
所以我的建议很简单:网站如果只是临时玩一下,WSL 1可以试试;只要你的目标是正经开发,直接上WSL 2,别走弯路。
1.2 兼容性自查:Win10、Win11、长期企业版到底行不行
“Win10 长期企业版能用WSL吗”这个问题我被人问过无数次。先说结论:能,Windows 10 LTSC 2019及其以上版本都支持WSL,只是老的LTSC版本默认带着的是WSL 1时代的内核,你需要手动升级内核包才能用WSL 2。Windows 10 22H2、Windows 11全系都能通过一条命令把WSL 2装好,差别只是系统设置界面长得不一样。
检查方法很简单:按Win+R输入winver,看到你的系统版本号,同时打开“启用或关闭Windows功能”,确认这三个东西的状态:
- 适用于Linux的Windows子系统;
- 虚拟机平台(Virtual Machine Platform);
- 在Windows 11上还有一个“Windows虚拟机监控程序平台”。
这三个是WSL 2能不能跑起来的关键。安装完WSL后如果提示“your version of windows subsystem for linux (wsl) is too old”,基本就是内核版本太老,或者是Windows功能没开全,跟系统是不是正版没有半毛钱关系。
1.3 虚拟机平台与BIOS虚拟化检查
WSL 2是基于Hyper-V虚拟化技术的,所以BIOS里的虚拟化开关必须开着。怎么检查?打开任务管理器,切到“性能”标签页,右下角看“虚拟化”这一项,显示“已启用”就OK。如果显示“已禁用”,你需要重启进BIOS,找到Intel Virtualization Technology(Intel VT-x)或AMD SVM Mode,改成Enabled,保存退出。
这一步看着简单,但踩坑的人特别多。有些品牌机的BIOS把虚拟化开关藏得很深,甚至有些机型默认关闭还不显示。另一个容易忽略的地方是Windows Defender的内核隔离功能,有些安全软件也会把虚拟化功能占住,导致WSL 2启动失败,报错信息五花八门。处理方式是:先关掉所有第三方安全软件,再打开“Windows安全中心-设备安全性-内核隔离-内存完整性”,如果打不开就先关掉试。
2. 从0到1:三种最常用的WSL安装方式
安装方式我分三条线讲:标准安装、离线安装、第三方工具安装。大部分人卡在“wsl --install太慢”或者“wsl --update下载很慢”上,本质都是网络问题。我不绕弯子,直接给你能落地的方案。
2.1 标准安装:wsl --install 一条命令搞定
Windows 10 22H2和Windows 11上,最推荐的路径是管理员身份打开PowerShell或CMD,然后执行:
wsl --install这条命令会自动开启WSL功能、虚拟机平台,然后下载并安装默认的Ubuntu发行版。装完重启,系统会让你设置Linux用户名和密码,接着就进入Ubuntu环境了。
如果你不想用默认版本,可以先看有哪些可选发行版:
wsl --list --online然后指定发行版安装,比如装Ubuntu 22.04:
wsl --install -d Ubuntu-22.04这里有个小细节:很多人的wsl --list --online会卡住或超时,爆出“wsl --list --online 连接超时”的错误。这不是你电脑坏了,而是微软官方发行版列表服务器响应不稳定。你可以换思路,直接指定已知可用的镜像名安装,比如Ubuntu、Debian、kali-linux,这些是内置默认的,不依赖在线列表。
2.2 离线安装:没有网络或下载太慢时的救星
离线安装排第一,理由很简单——这是解决下载太慢、403、连接超时等一切网络问题的最终手段。WSL的发行版本质上是一个appx包,你可以从微软官方商店页面或者第三方镜像站拿到离线安装包,然后在本地解压安装。
我在离线环境里装过Ubuntu 22.04,步骤大致是这样:
- 找一台能正常下载的机器,下载Ubuntu 22.04的appx包(文件名类似Ubuntu2204-220513.1526.appx);
- 把appx复制到目标机器上,后缀改成zip,用资源管理器或tar命令解压;
- 解压后目录里有一个install.tar.gz或rootfs文件,还有exe启动器;
- 打开PowerShell,进入解压目录,执行那个exe文件,系统会把rootfs注册到WSL里;
- 接下来照常设置用户名密码。
还有一种方式是用wsl命令直接导入rootfs。比如你有一个ubuntu_22.04_rootfs.tar.gz的根文件系统包,可以这样做:
wsl --import Ubuntu2204 D:\wsl\Ubuntu2204 D:\path\to\ubuntu_22.04_rootfs.tar.gz --version 2注意,用wsl --import导入的发行版默认是以root身份进入的,下次想用普通用户登录,可以这样指定:
wsl -d Ubuntu2204 -u root然后在系统里创建普通用户,再设置默认用户。这个办法对网络环境特别差的机器最友好,一次性把rootfs放到位。
2.3 wsl --install太慢、403、连接超时的解决思路
先明确一件事:WSL官方安装过程会把文件从微软的CDN拉到你本地,不同地区、不同运营商,体验天差地别。我遇到过的情况包括:
- wsl --install卡在0%,或者每秒几十KB,过半小时还在转;
- wsl --update报“已禁止(403)”;
- wsl --install -d ubuntu报403;
- 从raw.githubusercontent.com拉发行版清单时连接超时。
处理这些,我不会让你碰什么违规工具,正经可用的路子有这几条。
第一条,用系统自带的“联机搜索更新”替换在线命令。微软把WSL内核更新做成了独立的msi安装包,你可以下载这个msi包手动安装,绕开wsl --update。装上之后WSL内核就是最新版,那个“too old”的报错直接消失。
第二条,给官方域名换个DNS。很多连接超时其实是DNS解析到了错误的节点,尤其是一些企业网络。把DNS改成公共DNS,比如223.5.5.5(阿里)或8.8.8.8,在PowerShell里用Resolve-DnsName测试一下能不能拿到微软相关域名的解析结果。实测下来,换DNS能解决一部分启动慢、连接超时的问题。
第三条,如果你主要是想用某个发行版,别死磕在线安装,直接走离线包路线。离线包下载是走浏览器或下载器,断点续传支持好,你还可以用镜像加速地址下载,速度比wsl --install那个进程稳定得多。这也是我每次帮同事排障时首推的路线:省钱省时省脾气。
还有一条冷门但有效的经验:关闭IPv6。有些网络IPv6路由质量差,WSL的在线安装反而被拖慢。在“网络设置-高级网络设置-更多网络适配器选项”里,找到当前连接的网卡,右键属性,取消勾选“Internet协议版本6 (TCP/IPv6)”,然后重试。这个办法没有科学依据背书,但我在自己机器上试过,确实有改善。
3. 装完不是终点:Ubuntu的基本运行与初始化
WSL装好之后,很多人以为就万事大吉了,结果第一次打开Ubuntu终端就遇到各种报错,或者根本打不开。这一节我把Ubuntu运行和初始化过程中最关键的几步拆开讲。
3.1 首次启动与账号配置
第一次启动Ubuntu,系统会要求你设置一个Linux用户名和密码。注意,这个用户名不需要和Windows用户名一致,密码不会在你输入时显示,别以为键盘坏了。这个用户名是你的普通用户,默认有sudo权限,日常操作就用它,不要默认切到root。
如果手滑把初始化流程关了,或者想重新设置默认用户,在Windows端打开PowerShell,执行:
wsl -d Ubuntu -u root这样你能直接以root身份进入那个发行版,然后编辑/etc/wsl.conf,写入如下内容:
[user] default=你的用户名保存退出后,用wsl --terminate Ubuntu关掉实例,再重新进入就会以普通用户身份登录。
WSL的Linux子系统虽然跑在虚拟化环境里,但它的rootfs默认放在Windows系统盘里(通常是C:\Users\你的用户名\AppData\Local\Packages...),这意味着你的Ubuntu会占用C盘空间。时间长了,你会发现C盘莫名其妙少了几十个G。解决办法是把发行版迁移到其他盘,用wsl --export和wsl --import,将rootfs导出再导入到D盘,或者用第三方工具(比如LxRunOffline)改安装目录。我个人的习惯是一开始就规划好:C盘只放系统,Linux子系统一律放D:\wsl目录下。
3.2 换源与基础工具安装(含binwalk安装)
Ubuntu装好之后,第一件事永远是换软件源。默认官方源在国内速度惨不忍睹,apt install一个包能等半天。我建议直接把源换成清华TUNA源或阿里云源。
以Ubuntu 22.04为例,备份原文件:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后用sed替换源内容,或者直接编辑文件,把http://archive.ubuntu.com/ubuntu/ 替换成https://mirrors.tuna.tsinghua.edu.cn/ubuntu/。换完源后执行:
sudo apt update sudo apt upgrade -y接下来安装基础工具。编译环境、网络工具、常用编辑器,我一般一次性装好:
sudo apt install -y build-essential git curl wget net-tools vim tree这里单独说一下binwalk。binwalk是一个固件分析工具,在安全研究和嵌入式开发里用得非常多,很多跑WSL的人就是为了用它分析固件。安装很简单:
sudo apt install -y binwalk装完可以马上验证一下,把固件文件放到WSL里,运行:
binwalk 固件.bin它会自动扫描并列出文件中的嵌入式文件。但要注意,binwalk的某些高级功能依赖Python模块(比如sasquatch、jefferson等),apt装的版本不一定带全,如果你要做深度解包,建议用pip再装一层:
pip install ubi_reader3.3 网络问题排查:计算机无法连接到远程计算机
“WSL计算机无法连接到远程计算机”这个问题,我见过好几种触发场景:一是你在WSL里ping不通外网;二是Windows防火墙拦截了WSL的网络流量;三是WSL 2的虚拟网卡和宿主机网络冲突导致无法互相访问。
最简单的方法是先分别测试:
ping 127.0.0.1 ping 8.8.8.8 ping baidu.com如果127.0.0.1通、8.8.8.8通,但域名不通,大概率是DNS问题,去/etc/resolv.conf检查一下nameserver,或者在/etc/wsl.conf里加:
[network] generateResolvConf = false然后手动设置DNS为223.5.5.5。注意改完要重启WSL实例才生效。
如果Windows能ping通WSL,WSL却连不上宿主机,那多半是防火墙入站规则没有放行。在Windows上以管理员身份执行:
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow创建一条针对WSL虚拟网卡的入站规则,问题一般就解决了。
4. 高频场景实操:从开发到工具链
WSL最大的价值不只是当个Linux终端用,而是能和Windows下的开发工具无缝配合。这一节我挑几个被问得最多的场景,逐一演示。
4.1 VSCode + WSL:命令行与编辑器的最佳组合
“在vscode中使用wsl”是我看到最多的热搜词,确实,这也是WSL最爽的用法。微软在VSCode里做了Remote - WSL扩展,装上之后,你在Windows里启动VSCode,可以一键连接到WSL里的Ubuntu环境,编辑器界面看起来完全一样,但所有操作都在Linux里执行,文件路径是Linux路径,终端是bash,插件也可以单独装Linux版本。
步骤非常简单:
- 在VSCode扩展市场搜索Remote - WSL并安装;
- 打开VSCode,按Ctrl+Shift+P,输入“WSL: Connect to WSL”;
- 选择你要连接的发行版;
- VSCode会重新加载,左下角显示“WSL: Ubuntu”字样。
连接成功后,你在VSCode里打开文件夹,选的是/home/yourname/xxx,而不是C:\盘路径。这样做的最大好处是:你在Windows里用VSCode的图形界面写代码,但编译、运行、调试全部走Linux环境,再也不用纠结Windows和Linux路径转换的问题。
一个真实教训:如果你要跑的是Python Web项目,文件在Windows盘符(比如C:\Users...)下,然后通过/mnt/c访问,那性能会非常差,因为WSL 2跨文件系统访问有额外开销。正确做法是把项目代码放在Linux文件系统里,也就是/home/你的用户名/项目目录,然后通过VSCode的WSL连接去操作。这样编译速度、文件监听、git操作都会有明显提升。
4.2 字体推荐:接近macOS体验的选择
“wsl ubuntu写代码最推荐的字体接近macos的体验”这个热搜词我太熟了,说明大家除了功能,也开始关心颜值。在WSL的终端里写代码,终端字体直接影响眼睛舒适度。
Windows Terminal + WSL是标配,字体上我推荐这几个:
- JetBrains Mono:程序员友好,字母区分度高,圆角设计,长时间看不累;
- Cascadia Code:微软官方出品,Windows Terminal默认字体,支持连字;
- Sarasa Mono SC(更纱黑体):中英文混排首选,中文显示效果接近macOS的苹方,英文部分又是等宽字体,最适合WSL写代码的场景;
- SF Mono的替代方案:如果你就是喜欢macOS终端里SF Mono那种细长、清晰的感觉,可以找开源的SFMono替代包,或者直接用Menlo的镜像字体。
字体设置方法:打开Windows Terminal,按下Ctrl+逗号打开设置,在配置文件-默认值-外观里,把字体脸(font face)改成Sarasa Mono SC,字号建议12或14。设置完你会发现,WSL里的ls、git log、代码缩进,全部看起来清爽很多,跟macOS终端的差距瞬间缩小大半。
4.3 Docker Desktop与WSL 2集成
“docker desktop there was a problem with wsl”这个问题属于高频中的高频。Docker Desktop现在默认用WSL 2作为后端,如果WSL 2状态不对,Docker Desktop会直接报错。
先说正确姿势:装好WSL 2和Ubuntu后,再安装Docker Desktop,安装过程中勾选“Use WSL 2 based engine”。这样Docker Desktop会创建一个名为docker-desktop的专用发行版,你的Ubuntu里也能直接使用docker命令(前提是打开Docker Desktop设置里的“Enable integration with my default WSL distro”)。
报“there was a problem with wsl”的常见原因和对策:
- WSL内核版本太老,去微软官方下载最新版WSL更新包,装上重启;
- Windows功能“虚拟机平台”没有启用,去“启用或关闭Windows功能”里勾选;
- 发行版损坏,执行
wsl --shutdown,然后重新启动Docker Desktop; - Docker Desktop和Docker引擎版本不匹配,卸载后重装最新版。
如果你不想用Docker Desktop,也可以直接在WSL的Ubuntu里装Docker Engine。方法网上很多,但注意WSL 2需要systemd支持。新版WSL默认开启systemd,可以在/etc/wsl.conf里确认:
[boot] systemd=true然后在Ubuntu里正常安装docker.io或docker-ce,通过sudo service docker start启动守护进程。
4.4 CUDA、conda与PyCharm:把WSL当成正经开发环境
WSL 2早就不是玩具了,它支持NVIDIA GPU直通。在Windows上安装好NVIDIA显卡驱动(不用在WSL里再装驱动),然后在WSL里运行nvidia-smi,如果能显示显卡信息,说明GPU出来。
CUDA这个场景,WSL 2本质上是完整Linux内核,所以你在WSL里安装CUDA工具链和Linux桌面一样:
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装完后把CUDA路径加进.bashrc:
export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH深度学习框架(PyTorch、TensorFlow)都能在WSL 2里直接跑GPU训练,性能接近原生Linux。这也是为什么很多AI相关的工具链,比如MOSS-VL、DeepSeek Harness、Codex、dsh等,都能在WSL里顺畅运行。很多模型推理和微调工具要求Linux环境,又不想舍弃Windows,WSL就是最折中的方案。
conda环境同样没问题。去Anaconda官网下Linux版的Miniconda安装包,在WSL里用bash安装,然后正常创建conda环境。PyCharm也能直接识别WSL里的conda解释器:在PyCharm设置里,Project Interpreter → Add Interpreter → WSL,然后选择WSL里的conda环境路径(比如~/miniconda3/envs/项目名/bin/python)。这样你就能享受Windows下PyCharm的图形界面,同时用WSL里的conda环境跑脚本,不需要来回切换系统。
4.5 顺手一提:Redis、网络服务和日常运维
很多人跑WSL是为了本地开发时起Redis、MySQL、Nginx这些服务。Redis尤其典型,在WSL里装和启动都很省心:
sudo apt install -y redis-server sudo service redis-server start redis-cli ping看到PONG就说明服务起来了。这里有个细节:WSL 2里的服务默认监听的是WSL虚拟网卡的IP,Windows宿主机可以通过wsl hostname -I查到WSL的IP,然后用这个IP访问WSL里的服务。如果不想每次查IP,可以配置端口转发或者直接用WSL 2的镜像网络功能,新版Windows已经支持networkingMode=mirrored,在.wslconfig里设置一下就行,Windows localhost直接访问WSL服务,体验好很多。
5. 常见问题排查与卸载重装实录
这一节我把WSL使用过程中翻车最多的几个问题整理成速查表,顺便讲讲卸载重装的完整流程。
5.1 “too old”提示、403、镜像拉取失败的组合处理
很多老用户在运行wsl --update时遇到“已禁止(403)”之后,再启动WSL就报“your version of windows subsystem for linux (wsl) is too old. run the command wsl --update”,这种组合问题我处理过不止一次。
原因其实是同一个:WSL更新组件访问微软更新服务失败,导致内核停在一个很老的版本。解决办法有两个:
方案A,下载最新版WSL的msi更新包,手动安装。安装包可以从微软的GitHub Release页面下载,认准msi后缀,在Windows上双击安装,完成后运行wsl --version验证版本。
方案B,直接检查系统版本和Windows功能,排除功能缺失的情况。有时候不是WSL老,而是“虚拟机平台”功能没启用,报错文案相同,但本质不同。
装上新版WSL之后,403问题一般就消失了。如果还出现,可以重置WSL网络组件:管理员PowerShell执行wsl --shutdown,然后netsh winsock reset,重启电脑再试。
5.2 MATLAB识别不到WSL的解决思路
“matlab识别不到wsl”这个问题,通常出现在你希望在MATLAB里调用WSL命令的场景。MATLAB的system()函数或!操作符可以直接调用系统命令,但它在Windows下默认调用的命令解释器是cmd.exe,不会自动去找WSL里的bash。
解决方法是:在MATLAB里显式调用wsl.exe。比如,你想在WSL里执行ls,可以写:
[status, cmdout] = system('wsl ls -la');如果提示找不到wsl,检查一下WSL是否真的装好、wsl.exe是否在PATH里。一般装好WSL后,wsl.exe位于C:\Windows\System32\wsl.exe,应该默认在PATH。如果还是不行,把MATLAB工作目录切成Linux路径,或者直接指定发行版名:
[status, cmdout] = system('wsl -d Ubuntu ls -la');另外,新版MATLAB支持在Live Editor里直接运行Linux代码块,前提是你装了MATLAB的WSL支持包,这个可以在Add-On Explorer里搜“MATLAB Support for WSL”,装上后就能在MATLAB里直接选择WSL环境运行Linux命令,比手动拼system命令优雅得多。
5.3 WSL的卸载与清理
卸载WSL分两个层面:卸载发行版和卸载WSL功能本身。
卸载某个发行版,用wsl --unregister 发行版名。比如:
wsl --unregister Ubuntu注意,这个命令会删除该发行版的所有文件,包括rootfs和数据,不可恢复。如果你想保留镜像,先用wsl --export Ubuntu D:\backup\ubuntu.tar导出,再执行unregister。卸载完成之后,确认一下:
wsl --list应该看不到被卸载的发行版了。
彻底卸载WSL功能,在“启用或关闭Windows功能”里把“适用于Linux的Windows子系统”和“虚拟机平台”都取消勾选,重启电脑,WSL相关服务会被禁用。之后再删除C盘里残留的WSL数据目录(路径在C:\Users\你的用户名\AppData\Local\Packages下,搜“Ubuntu”或“WSL”相关的文件夹),整个WSL就从系统里清掉了。
我在实际重置时有个习惯:先卸载发行版,再wsl --shutdown,最后把.wslconfig文件也删掉(如果之前配过)。这样可以避免旧配置残留导致重装后异常。
5.4 .wslconfig:进阶玩法与存档点
.wslconfig文件是WSL 2的全局配置,放在Windows用户目录C:\Users\你的用户名.wslconfig,用来控制内存、CPU、网络模式等。我在配置多台机器时固定的最优参数是这样:
[wsl2] memory=8GB processors=4 swap=2GB networkingMode=mirrored localhostForwarding=truememory控制WSL最大内存,processors控制可用CPU核数,swap指定交换空间大小。networkingMode=mirrored是Windows 11 22H2以上才支持的镜像网络模式,它能让WSL直接共享Windows的网络接口,localhost可以双向访问,对于开发Web服务、跑机器人框架(比如ROS)都很有帮助。
.wslconfig改完不是立即生效,必须执行:
wsl --shutdown然后再启动WSL才会读取新配置。很多人在网上问“为什么我的.wslconfig没有效果”,九成是没执行shutdown,老实例还在跑,自然不读新配置。
让我最后分享一点实际体会
我用WSL这些年,最大的感受是它正在慢慢消解“Windows做开发环境不如Linux”这个老论调。以前我为了跑Linux工具链,要么装双系统来回切换,要么开着虚拟机吃到内存告警,现在打开Windows Terminal输一行wsl就能进入Ubuntu,VSCode、Docker、CUDA、conda全部打通,日常开发基本不需要离开Windows。
如果你刚开始接触WSL,我的建议是别贪多,先把基础装好,跑通一个真实项目,再慢慢研究.wslconfig、离线包、容器化这些东西。网络出问题的时候,记住“离线安装包”这个兜底方案就行,它是我在无数个403和超时面前保下来的经验。WSL的世界里,没有解决不了的安装问题,只有还没尝试的替代路径。