
最近又被朋友问到 Windows 下装 WSL 的事一上来就卡在wsl --install等了二十分钟没反应。这个场景我太熟了。从 WSL1 时代一路用过来这套子系统的安装从来没少过坑——不是版本不匹配就是内核组件太老再不然就是装到一半卡在进度条上让人以为是死机。这篇文章专门讲 WSL 安装这件事。不是把微软官方文档翻译一遍而是把我实际装过几十台机器之后沉淀下来的判断标准和兜底方案写清楚。适合第一次接触 WSL 的新手也适合那些装到一半被报错拦住的排错型用户。看完你至少能明白为什么你的机器会卡、为什么会报 too old、离线环境到底怎么装、装完以后第一件该做什么。1. 装之前先搞明白你的系统到底够不够格很多人装 WSL 失败的根源不是操作不对而是前置条件压根没满足。这一步其实花不了五分钟但能帮你避开后面一大半的坑。1.1 WSL 1 和 WSL 2 到底选哪个先别急着敲命令仔细看下自己需要的是哪个版本。WSL 2 现在是绝对的主流也是微软官方默认推荐但它和 WSL 1 在实现原理上完全是两码事。WSL 1 用的是 API 翻译层把 Linux 系统调用翻译成 Windows 系统调用相当于给 Linux 程序做了一层同声传译。好处是启动快、内存占用小坏处是翻译总有边界有些软件跑不了Docker 就更别想了。WSL 2 则是在 Hyper-V 虚拟化平台上跑一个完整的轻量级 Linux 内核可以理解成 Windows 背后藏了一个极简虚拟机但通过特殊机制让命令行体验几乎无感。系统调用兼容性直接拉满Docker 也能原生跑。维度WSL 1WSL 2实现方式API 翻译层轻量级虚拟机Linux 内核无独立内核完整内核系统调用兼容性有限完整跨 OS 文件访问稍快明显慢于本地Docker 支持不支持支持适用场景低配机器、简单脚本默认首选、开发环境表格里跨 OS 文件访问这点你得特别注意WSL 2 里访问/mnt/c下面的 Windows 文件I/O 性能损失很大。所以项目文件一定放 Linux 侧Windows 和 Linux 共享目录这种操作只适合传小文件。这既是性能经验也是后面避免踩坑的重要前提。1.2 系统版本和虚拟化的硬性要求WSL 2 依赖虚拟化所以第一步就是确认你机器的 BIOS 里开了虚拟化。按Win R输入cmd打开命令行执行systeminfo输出信息里找Hyper-V 要求这一段。四项里如果不是全部显示是说明虚拟化没开好得进 BIOS 开启 Intel VT-x 或 AMD SVM。很多电脑出厂默认关闭这是 WSL 装完重启后起不来的头号嫌疑犯。系统版本这边Windows 10 2004Build 19041及以上或者 Windows 11才能用最舒服的一条命令安装方式。更老的系统版本虽然也能手工装 WSL 1但意义不大了——你真需要的话直接升级 Windows 更靠谱。顺带提醒一句开启了 Hyper-V 平台之后VMware Workstation 和 VirtualBox 偶尔会报与 Hyper-V 不兼容需要去它们的设置里开启相应的虚拟化支持这个问题在近几个大版本里已经缓解很多但老版本用户还是要有点心理准备。2. 最顺的路径一条 wsl --install 装完整个流程如果你的系统版本满足要求那安装路径其实很简单管理员身份打开 PowerShell输一行命令重启完事。这个流程本身不复杂但每个细节都有它存在的理由。2.1 一次正确的安装命令长什么样wsl --install -d Ubuntu-22.04这条命令干了四件事启用 Windows 的虚拟机平台功能、启用 WSL 功能特性Microsoft-Windows-Subsystem-Linux、下载并安装 WSL 内核、安装你指定的 Linux 发行版镜像。如果你不带-d Ubuntu-22.04默认安装的发行版在不同 Windows 版本上可能不一样可能装上的是 Ubuntu 最新 LTS也可能是其他变体。所以我建议还是显式指定发行版避免装完不是自己想要的那个。这里有个非常容易被忽略的点必须以管理员身份运行。普通用户窗口执行这条命令大概率会报一个带一堆 0x80070005 的错误码其实不是你的命令有问题就是权限不够。2.2 重启这一步不是建议是必须命令执行完通常会看到提示让你重启电脑。这一步别跳过。WSL 2 的内核其实是一个独立的虚拟化平台组件它需要在内核启动早期完成挂载和初始化。不重启直接打开 Ubuntu十有八九会拿到一个错误或者进了系统但各种功能异常。重启之后开始菜单里会出现 Ubuntu 图标。第一次启动会让你创建用户和密码。这里有个细节账号密码和 Windows 登录账号可以不一样而且这个 Linux 账号默认有 sudo 权限直接可用。设置完用户名密码系统会提示你更新包一般建议先按默认流程走一遍apt update apt upgrade把基础系统更新到当前状态再开始折腾。装完之后执行wsl -l -v查看发行版列表和运行状态。如果有多个发行版也可以在这里看到它们各自的 WSL 版本号。确认是 VERSION 2就说明环境没问题了。注意第一次执行sudo命令时系统会提示输入密码这个密码就是你刚设置的 Linux 账号密码它跟 Windows 密码可以完全无关。3. wsl --install 太慢别等了换手工安装这条路wsl --install 太慢是网上被问爆的问题。我实测下来卡住其实分两种一种是网络差导致下载内核和发行版镜像的时间非常长另一种是真卡死进程挂着不动。不会判断的话很多人会傻等半小时然后心态炸裂。3.1 怎么判断是慢还是死先不要急着 Ctrl C。打开任务管理器切到性能标签页看网络占用。如果网络曲线一直在跳、数值不为零说明后台还在下载这时候等就完了。如果等了很久网络一动不动或者命令返回一个错误码那就要换方案。最常见的几个错误码是连接不上微软的下载服务器或者下载到一半连接被重置。这种情况在网络环境不稳定的时候特别常见。3.2 离线安装才是真正靠谱的兜底我先说结论手工下载安装包永远是比在线安装更稳定的方案。我自己在多次遇到在线安装卡死后就养成了直接离线安装的习惯。完整的手工安装流程是这样的从微软官网下载 WSL 内核更新包。在管理员 PowerShell 里启用虚拟化平台和 WSL 功能dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart安装刚下载的内核更新包。执行wsl --set-default-version 2把默认版本设为 WSL 2。这些都做完之后发行版的安装还有两条路。一条是打开 Microsoft Store搜索你想要的发行版比如 Ubuntu 22.04 LTS直接点安装。商店会管理好发行版的下载和注册装完和用wsl --install装出来的效果完全一样。另一条更适合离线环境或内网机器直接下载发行版的 appx 安装包。微软官网提供了所有发行版的下载链接格式是.appx或.appxbundle拷贝到目标机器上用管理员 PowerShell 执行Add-AppxPackage .\Ubuntu.appx装上之后同样可以从开始菜单首次启动并完成用户配置。内网环境没法连外网下载包时这就是最救命的路子。3.3 直接导入 rootfs 是最底层方案还有一些特殊场景比如公司内网机器连 Microsoft Store 都被禁了appx 包也下载不了那还有一个终极大法找一个能联网的机器下载发行版的 rootfs 压缩包比如 Ubuntu 的 rootfs tar 文件拷入内网机器然后wsl --import Ubuntu D:\WSL\Ubuntu .\ubuntu.tar--import命令会跳过完整的初始化流程直接把 rootfs 文件系统导入进来路径参数分别指定发行版名字、存放的 Windows 目录、rootfs 压缩包位置。这种方式装出来的系统不会提示你创建普通用户默认登录的是 root需要自己手动添加用户。虽然麻烦点但它是唯一不依赖任何网络连接和商店组件的安装途径实际工作中我用它救过不少次场。4. “Your version of WSL is too old”报错不是系统老是组件在偷懒这个报错的热度极高因为升级到新版 Windows 后很多人第一次在某论坛上下载 WSL 项目资料时会看到这么一行Your version of Windows Subsystem for Linux (WSL) is too old. Run the commandwsl --updateto ensure you are using the latest version.第一反应是我 Windows 太老吗其实不是。这属于微软在 WSL 组件拆分的过渡期埋下的坑。4.1 报错的真实来源Windows 里实际存在两份 WSL 相关组件一份是操作系统自带的系统内置版inbox 组件老版本 Windows 就是靠它工作另一份是后来微软为了快速迭代把 WSL 打包成 Microsoft Store 应用发布的商店版。一些新功能比如新版导出工具、GPU 计算支持、系统d 支持只在商店版里才有。当你在新版 Windows 系统中仍使用自带组件时就会被判定为版本过旧于是抛出这句话。本质上不是你的系统不能用而是微软希望你去装一个新的组件渠道。4.2 升级 WSL 组件的三种姿势第一种最直接管理员权限打开 PowerShell执行wsl --update这条命令会自动从微软的组件分发渠道拉最新版 WSL 并完成替换。升级完执行wsl --version能看到输出里带完整的版本号例如 2.0.4 或更高就说明商店版已经接管。第二种是去 Microsoft Store 搜索Windows Subsystem for Linux手动安装。这种方法本质上和wsl --update一样就是走商店的图形化流程适合不喜欢敲命令的人。第三种是如果市面上的最新版本都不满足需求可以去 GitHub 上微软的 WSL 仓库下载最新发布版安装包。这条路径适合想要提前感受新特性的人操作上也是下载、双击、重启 WSL 的傻瓜式流程。4.3 升级完为什么还要 wsl --shutdown升级完后很多人的 WSL 环境还留着旧的内核实例在跑。不重启子系统新内核不会自动加载。正确的验证姿势是wsl --shutdown wsl -l -v第一条命令会把所有正在运行的 WSL 实例停掉让旧内核彻底退出第二条命令查看发行版状态确保一切正常。之后再打开 Ubuntu旧版本的报错就会消失。我踩过的坑是升级完直接跑wsl --version看到版本号变了就以为完事了结果打开发行版还是提示 old 版本。后来才意识到不执行 shutdown 的话跑着的内核还是重启之前的那个内存镜像。5. 装完子系统的第一顿饭换源、乱码、字体系统装好、报错解决接下来就是真正进入日常使用的配置环节。这几个问题几乎是每个 WSL 新手都会碰到的。5.1 apt 换源是第一个加速动作默认的 Ubuntu 软件源指向国外服务器apt update的速度在很多时候感人。无论用什么镜像源方法都是一样的编辑/etc/apt/sources.list把下载源地址替换成国内镜像地址。以 Ubuntu 22.04 为例sources.list里的条目基本都是archive.ubuntu.com或security.ubuntu.com开头的地址。替换成国内镜像源的通用做法是把这些域名替换为镜像站域名并保留路径结构。主流镜像站都提供了自动生成配置的页面直接按系统版本复制即可。注意修改前先备份。sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak改错了还能一键恢复。替换完执行sudo apt update就能感受到速度差异之后装什么包都顺了。5.2 中文解压乱码的根治办法linux 解压文件乱码这个话题被问烂了。原因很简单很多 Windows 下打包的 zip 文件文件名用的是 GBK/CP936 编码而 Linux 的 unzip 默认按 UTF-8 解码结果显示成乱码。解决方案有两个一是用unzip -O CP936指定编码unzip -O CP936 文件名.zip二是干脆装unar这种自动检测编码的工具sudo apt install unar unar 文件名.zipunar会尝试自动识别压缩包内文件名的编码格式处理 GBK 编码比手动指定省心很多。实测下来GitHub 上各平台混传的压缩包它基本都能正确处理。终端里还可能出现系统提示信息乱码那是 locale 的问题。确保系统安装了中文语言包sudo apt install language-pack-zh-hans然后临时设置export LANGzh_CN.UTF-8或者写进~/.bashrc永久生效。5.3 字体推荐把终端调成接近 macOS 的体验WSL 本身不自带图形界面使用体验基本取决于终端。Windows Terminal 是首选配合一个合适的等宽字体代码阅读体验能接近 macOS 上的 iTerm2 Menlo。我对字体只有一个标准中文和英文等宽对齐。推荐用Sarasa Term SC更纱黑体它把英文等宽和中文字形整合在一起四个方向缩进都对得齐齐的不会出现中英文混排错位。另一款就是 JetBrains Mono专注代码场景但中文支持一般需要配合终端里的 fallback 字体设置。配置方法很简单把字体文件安装到 Windows 系统C:\Windows\Fonts或者右键为当前用户安装然后在 Windows Terminal 的设置里找到配置文件 → 外观 → 字体面选 Sarasa Term SC 即可。6. 把 WSL 用成开发主力机VSCode、Docker、CUDA 与实战工具WSL 装好只是入门能干活才是目的。下面这几个场景是我用得最多、也最容易被问到的。6.1 VSCode 连接 WSL 的正确姿势VSCode 加 Remote-WSL 扩展是官方推荐的开发模式。安装完扩展后在 WSL 终端里进入项目目录直接敲code .VSCode 会以连接到 WSL的模式打开左侧资源管理器显示的路径是\\wsl$\Ubuntu\home\xxx\project这类开头右上角有个绿色的WSL: Ubuntu标签说明已经连上了。这里有个关键细节项目目录放哪决定了编译性能。放在 Linux 侧/home/xxx/project下几十万文件的项目也跑得动放在/mnt/c/Users/xxx/project下由于跨系统 I/O 的机制编译时会明显变慢。所以我的原则是代码在 Linux 文件系统里Windows 侧只放前后端依赖的小文件。6.2 Docker Desktop 与 WSL 2 的无缝联动Docker Desktop 现在默认推荐使用 WSL 2 作为后端在它的设置里打开 Use the WSL 2 based engine 之后Windows 上的 Docker 和 WSL 里的 Docker 命令是同一套 daemon。更纯粹的做法是直接在 WSL 里安装 Docker Engine不装 Docker Desktopsudo apt install docker.io sudo systemctl start docker由于 WSL 2 支持 systemdDocker 服务可以当作真正的系统服务来管理。在 Windows 上跑 Docker 遇到过文件挂载性能差的人换到 WSL 2 里的原生 Linux 文件系统后体感会好很多。6.3 WSL 里安装 CUDA 的注意事项wsl 安装 cuda现在的复杂度比过去低了不少。要点就一条Windows 侧只需要装 NVIDIA 为 WSL 提供的显卡驱动CUDA Toolkit 装在 Linux 侧。具体步骤是这样的在 Windows 上安装 NVIDIA 驱动版本要支持 WSL建议用最新的 Game Ready 或 Studio 驱动。在 WSL 里执行nvidia-smi能看到 GPU 信息就说明驱动穿透正常。到 NVIDIA 官网下载 CUDA Toolkit 的 Linux x86_64 WSL-Ubuntu 版本按官方命令安装。设置环境变量export PATH/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH这一步的坑在于不少人把 Toolkit 装到了 Windows 侧结果在 Linux 里编译 PyTorch 时找不到nvcc。正确理解是驱动在 Windows工具链在 Linux两边职责要分清楚。6.4 两个实用工具Elasticsearch 与 binwalkwindows 启动 elasticsearch 这个热搜很有代表性。很多人在 Windows 上装 ES被vm.max_map_count和环境变量搞到崩溃。其实 WSL 里跑 ES 舒服得多装好 JDK、下载 ES 压缩包、解压就能启动。唯一要注意的是宿主机内存要够建议至少 4GB 可用内存。wsl 使用 binwalk也是常见需求。binwalk 是个固件分析工具在 WSL 里安装和使用都比原生 Windows 靠谱sudo apt install binwalk binwalk firmware.bin配合binwalk -Me firmware.bin可以自动解包递归提取固件内容。WSL 2 的完整内核让这类需要文件系统操作、符号链接处理的工具都能跑得很顺这就是相比 WSL 1 最大的优势。7. 发行版迁移、备份与重装把系统玩坏了也不慌装了 WSL 之后折腾环境往往停不下来。搞坏了怎么办C 盘空间不够怎么办这些问题的答案其实早就藏在wsl命令里。7.1 把系统跨盘迁移WSL 的发行版文件默认放在 C 盘的用户目录下一个装了很多开发环境的 Ubuntu虚拟磁盘文件轻松就能到二三十 GB。C 盘吃紧几乎是人人的痛。迁移办法wsl --shutdown wsl --export Ubuntu D:\backup\ubuntu-backup.tar wsl --unregister Ubuntu wsl --import Ubuntu D:\WSL\Ubuntu D:\backup\ubuntu-backup.tar这三条命令的语义很清晰先停机再导出全部文件到一个 tar 包然后注销旧发行版最后按新的存储位置导入。导入完成后发行版的所有账号、文件、配置都在相当于完整搬家。注意wsl --unregister会删除该发行版全部数据。确认导出成功且 tar 文件大小正常后再执行这一步。7.2 切换默认发行版与卸载清理wsl -s Ubuntu可以设置默认发行版wsl --unregister Ubuntu则彻底删除。装了多个发行版又不用了直接unregister最干净连 C 盘空间一并释放。虚拟磁盘文件本身还有一个只增不减的特性你删了文件空间不一定马上还给宿主机。如果需要压缩可以在wsl --shutdown后用 Windows 的diskpart工具对 vhdx 文件执行 compact 操作或者用新版本wsl --manage 发行版名 --set-sparse true开启稀疏 VHD让空间管理自动回收。7.3 一个我踩过的坑别把项目放在 /root 下最后这点是我自己的教训。刚开始用 WSL 时图省事一直在 root 账号下干活项目全都放在/root/dev里。后来有一次配置搞乱了想着重装系统最省事结果 unregister 之后项目全没了——tar 备份没有。git 推送本地仓库还没推远程。经验就是两条要么一开始就建普通用户并把项目放在/home/用户/下要么养成定期wsl --export的习惯。WSL 不是一个绝对安全的环境它本质上还是一个可以随时注销重建的子系统你的重要数据要有一个能在 Windows 侧访问到的备份通道才行。第二个习惯是从那之后养成的每次完成一个大阶段比如配好一套环境、完成一个模块就用wsl --export导出一份 tar 到另一块硬盘上。文件不大几十秒的事但关键时刻真能救命。说到底 WSL 再方便也是开发环境整个配置文件目录定期备份永远是正确的选择。