Windows11 里藏着一个很多人装了系统两年都没打开过的功能叫 WSL全称 Windows Subsystem for Linux也就是 Windows 下的 Linux 子系统。它允许你在不分区、不装虚拟机软件的前提下直接跑起一个几乎原生的 Ubuntu命令行、包管理、开发工具链一应俱全。我自己从 WSL1 时代一路用到 WSL2中间踩过的坑能写满一整页纸装到一半卡住、发行版导入失败、中文显示成方块、SSH 连不上、CMake 版本太老编不过项目。这篇就把从零开始到能用顺手这条路径完整走一遍不管你是刚听说 WSL 的新手还是以前装过但没配好的半新不旧党都能照着复现。1. 动手之前先想清楚WSL 到底是什么值不值得用很多人一上来就问命令怎么敲结果装完发现跟自己预期不符又回头重装。我的习惯是先花五分钟把选型想明白后面能省掉一堆返工。1.1 WSL、虚拟机、双系统这三条路到底差在哪在 Windows11 上跑 Linux主流的就三条路装虚拟机VMware、VirtualBox、装双系统、用 WSL。三者的差别不在“能不能跑”而在资源占用、文件互通和图形界面的取舍上。虚拟机是完整模拟一台电脑隔离性最好但内存、磁盘、CPU 都要切一块出去开机慢、占资源宿主机和虚拟机之间传文件还得靠共享文件夹或者网络。双系统是彻底把机器分一半给 Linux性能最接近裸机但每次切换要重启Windows 和 Linux 两边的文件互相访问很别扭。WSL 走的是另一条路子它直接把 Linux 内核跑在 Windows 的虚拟化层上启动是秒级的内存按需占用而不是一次性划走一大块最关键的是文件系统直接互挂——你在 Ubuntu 里敲cd /mnt/c/Users/你的用户名就能直接进到 Windows 的 C 盘。这种体验对做开发、写脚本、跑编译的人来说太舒服了不用来回切换机器也不用担心虚拟机磁盘越来越胖。代价是它不是完整的 Linux某些涉及内核模块、内核动态加载、设备直通的操作做不了比如你自己写内核模块加载.ko文件、折腾驱动这类事情WSL 给不了你。所以选择逻辑很清晰日常开发、跑 Python/Node/Go、学习 Linux 命令、用 Git、写 Shell 脚本、做数据处理WSL 是首选需要完整内核环境、要玩底层、要做系统级实验虚拟机或双系统更合适。我自己的机器上三者都装但 90% 的时间都是待在 WSL 里。1.2 WSL1 和 WSL2 的区别以及为什么别再用 WSL1现在的 WSL 默认装的就是 WSL2但你还是会在网上看到有人讨论 WSL1。简单说WSL1 是翻译层它把 Linux 的系统调用实时翻译成 Windows 的系统调用好处是文件系统性能好、启动快、内存占用小坏处是兼容性差很多需要真实内核的东西跑不起来。WSL2 则是基于轻量级虚拟化跑的是一个真实的 Linux 内核兼容性直接拉满Docker、CUDA、各种需要内核特性的工具都能用。WSL2 的短板在过去是跨系统文件访问慢比如你在/mnt/c下面跑npm install速度能慢到你怀疑人生。但这个问题有明确的解法——把项目放在 Linux 自己的文件系统里也就是~/下面别放在 Windows 盘里。搞明白这一点WSL2 基本没有明显劣势。判断自己当前用的是哪个版本一条命令就行wsl -l -v输出里VERSION那列会标出 1 还是 2。如果某个发行版还是 1可以用wsl --set-version Ubuntu 2把它转成 2需要重启该发行版生效。我一般装完第一件事就是确认版本因为后面装 Docker、装 CUDA 都默认按 WSL2 来配。2. 装之前的环境自检清单别等报错才回头查WSL 装不上十有八九不是命令敲错了而是环境前提没满足。这一步花几分钟检查能避免后面反复折腾。2.1 Windows11 版本与虚拟化开关WSL2 依赖硬件虚拟化。两个地方要确认一是 BIOS 里的虚拟化Intel VT-x / AMD-V开了没有绝大多数品牌机出厂是开着的但有些笔记本默认关二是 Windows 功能里的“虚拟机平台”和“适用于 Linux 的 Windows 子系统”这两个可选组件有没有启用。新版本的 Windows11 用一条wsl --install通常会自动帮你把这两个组件开好但老版本或者被精简过的系统镜像可能不行。检查虚拟化是否开启可以在任务管理器 → 性能 → CPU 里看右下角有没有“虚拟化已启用”。如果没有重启进 BIOS 找Intel Virtualization Technology或SVM Mode打开。另外有一个容易被忽略的点某些系统安全设置里的“内存完整性”会占用虚拟化能力在个别机器上会让 WSL 报“无法启动虚拟机”之类的错误。如果遇到可以到“Windows 安全中心 → 设备安全性 → 内核隔离”里看一下内存完整性的状态自己做取舍这部分属于系统级配置改之前建议先记录原状态。2.2 磁盘空间、内存和网络这三样别抠WSL2 的发行版本质是一个虚拟磁盘文件ext4.vhdx它默认会随着使用慢慢长大。刚开始装完可能就几百 MB但你装完编译器、装完 CUDA、跑几个大项目之后涨到十几二十个 G 很正常。所以系统盘至少留出 20~30 GB 的余量不然用着用着就红了。内存方面WSL2 默认最多能用宿主机一半的内存。如果你是 16 GB 内存WSL 大概能用 8 GB跑一般的开发足够。要是做机器学习、编译大型项目觉得不够可以自己在用户目录下建一个.wslconfig文件来调整上限这个后面第 5 节会讲。网络方面WSL2 是一个独立的虚拟网卡环境它的 IP 和宿主机不一样这一点直接决定了后面 SSH 怎么连、端口怎么访问先有个印象。3. 用一条命令把 Ubuntu 装进 Windows11前置条件检查完真正安装其实很快。但“快”和“顺利”是两码事这一步的坑主要集中在下载速度和网络环境上。3.1 wsl --install 自动安装的完整流程在 Windows11 上最省事的方式就是打开 PowerShell建议用管理员身份避免权限不足然后敲wsl --install这条命令会依次做几件事启用需要的 Windows 可选组件、下载并安装 WSL2 内核、下载一个默认发行版通常是 Ubuntu 的最新 LTS、最后提示你重启。重启之后Ubuntu 会自己弹出一个窗口让你设置用户名和密码。这里有个新手常犯的错用户名不要用中文也不要带空格用小写英文密码输入时屏幕上不会显示任何字符这是正常的不是你键盘坏了。如果你不想装默认版本想指定某个发行版可以先用wsl -l -o列出所有可安装的发行版然后wsl --install -d Ubuntu-22.04指定版本号的好处是可控尤其是你的项目依赖某个特定 Ubuntu 版本的时候。我自己的做法是固定装一个 LTS 版本因为 LTS 的支持周期长软件源也最全。3.2 当 wsl --install 卡住或者太慢怎么办这个几乎是所有国内用户都会遇到的第一个大坑。wsl --install从下载到配置全程走网络一旦网络环境不理想就会长时间停在某个进度上或者干脆报超时。解决办法有几个层次我从最省事的说起。第一先确认是不是单纯慢。打开任务管理器看网络占用如果还在下载就耐心等有时候发行版包有几百 MB慢是正常的。第二给下载加个“换源”思路——WSL 相关的组件下载较新版本支持--web-download参数强制从网络下载而不是走系统集成通道某些情况下反而更顺。第三如果自动安装反复失败就别死磕了直接走手动安装也就是下一节要讲的离线包路线这是最可控、最不怕网络折腾的办法。提示wsl --install报“正在安装适用于 Linux 的 Windows 子系统”之后长时间无响应时先别急着强杀进程可以另开一个窗口用wsl --status看状态直接判断它到底是在跑还是卡死了。3.3 离线包手动导入最不怕网络折腾的做法手动安装的核心思路是你自己拿到一个 Ubuntu 的 WSL 发行版包然后用wsl --import把它导进去。包通常是一个.tar或者.tar.gz文件Ubuntu 官方发布渠道、国内高校和企业的开源镜像站上一般都能找到。拿到包之后操作分三步。第一步建一个目录专门存这个发行版比如D:\wsl\ubuntu。第二步导入wsl --import Ubuntu D:\wsl\ubuntu D:\download\ubuntu.tar --version 2这里的参数含义是Ubuntu是你要给这个发行版起的名字后续用wsl -d Ubuntu启动D:\wsl\ubuntu是安装位置后面是包路径--version 2指定用 WSL2。导入完成之后wsl -l -v就能看到它了。手动导入有个和自动安装不一样的地方默认进的是 root 用户没有让你设密码的环节。这时候需要自己建普通用户、设默认用户具体在第 4 节讲。手动导入的最大好处是包下载可以断点续传、可以用任何你顺手的方式拿到不受wsl --install那条链路的限制而且安装位置完全由你控制直接放在数据盘上系统盘压力小。4. 装完之后必须做的几件事不然等于白装发行版装好只是开始真正决定好不好用的是接下来的配置。这部分是很多人跳过的也是后面各种“莫名其妙”报错的根源。4.1 创建普通用户并把默认用户设对自动安装的流程会引导你建用户但手动导入的不会。假设你现在是以 root 身份进系统的先建一个普通用户adduser yourname usermod -aG sudo yourname第一行创建用户并设置密码第二行把这个用户加进 sudo 组让它能执行管理员操作。接下来让它成为默认登录用户有两种做法。简单的做法是在 PowerShell 里执行ubuntu config --default-user yourname发行版名字要换成你自己的。更稳一点、也更推荐的做法的改配置文件在 WSL 里编辑/etc/wsl.conf[user] defaultyourname保存之后在 PowerShell 里wsl --shutdown关掉再重进默认用户就生效了。改wsl.conf的好处是它和发行版绑定你换终端、换 Shell 都不会失效比命令行参数可靠。注意一直用 root 跑日常操作是个坏习惯很多工具会因为权限过高而出问题而且一旦误操作比如rm -rf没有二次确认后果很难收拾。第一天就把普通用户配好。4.2 换镜像源、更新系统、装基础工具链刚装好的 Ubuntuapt默认指向的是境外源更新起来慢。换成国内开源镜像站能快很多。以 Ubuntu 22.04 为例先备份原配置sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s|http://archive.ubuntu.com|https://mirrors.aliyun.com|g /etc/apt/sources.list sudo sed -i s|http://security.ubuntu.com|https://mirrors.aliyun.com|g /etc/apt/sources.list sudo apt update sudo apt upgrade -y这段的逻辑很直白先把原文件备份再用sed把官方域名批量替换成镜像站域名最后更新索引并升级。换源之后更新速度通常能从几分钟缩到几十秒。这里提一句每次大版本升级比如 22.04 升 24.04之后源文件格式可能会变如果apt update报错多半是源配置和系统版本对不上回到官方源排查一下就行。接下来把常用的工具装一装这些几乎是开发标配sudo apt install -y build-essential git curl wget vim unzip zip \ python3-pip net-tools htop treebuild-essential里包含 gcc、g、make 这些编译工具缺了它很多源码包根本装不上net-tools提供ifconfig这类老命令虽然现在推荐用ip命令但很多教程还在用tree用来直观地看目录结构排查问题时很好用。这些包一次装齐后面少很多“命令找不到”的困惑。4.3 中文显示、输入法和文件乱码处理WSL 里默认的 locale 是英文导致中文文件名、中文日志在终端里显示成方块或者解压中文压缩包时出现乱码。先装语言包sudo apt install -y language-pack-zh-hans sudo locale-gen zh_CN.UTF-8然后编辑/etc/default/locale把LANG设成zh_CN.UTF-8。不过我的建议是日常还是保持en_US.UTF-8因为很多命令行工具在纯英文环境下报错信息更清晰、更容易搜到解决方案只在需要处理中文的时候临时切。这就涉及到经常被问的一个问题解压文件乱码。Windows 上的 zip 压缩包常用 GBK 编码而 Linux 的unzip默认按 UTF-8 解中文文件名就花了。解决办法有几种最省心的是用unarsudo apt install -y unar unar 文件名.zipunar会自动识别编码。如果非用unzip不可可以手动指定编码unzip -O cp936 文件名.zip。至于中文输入法WSL 现在有 WSLg 支持图形界面可以装fcitx5配合中文输入法但配置起来有点绕如果你只是想打字其实直接在 Windows 端打字然后粘贴到终端里更快我大多数时候就是这么干的。5. 让 WSL 真正好用文件互通、远程开发和编译环境配置做完了接下来就是把它用顺手。这个阶段的核心是打通 Windows 和 Ubuntu 之间的边界让两边的工具各司其职。5.1 Windows 和 Ubuntu 双向访问文件的正确姿势WSL 挂载了 Windows 的盘路径是/mnt/c、/mnt/d这种。反过来Windows 访问 Ubuntu 的文件可以在资源管理器地址栏输入\\wsl$\Ubuntu\home\yourname直接进去也可以直接用\\wsl$看所有发行版。这个互通性很爽但有个性能陷阱前面提过跨系统的文件读写尤其是大量小文件操作慢得离谱。所以我的原则是源代码、项目、node_modules、虚拟环境这些放在 Ubuntu 自己的文件系统里也就是/home/yourname/下面只在需要的时候用/mnt/c去拿一些 Windows 侧的素材文件。判断标准很简单——凡是需要频繁读写、频繁编译的一律放 Linux 侧。这条经验是我在/mnt/c下跑前端项目npm install转了十分钟才总结出来的放 Linux 侧同样的项目两分钟搞定。5.2 用 VS Code 远程连接 WSL开发体验直接起飞在 Windows 上用 VS Code 写 WSL 里的代码要装一个叫 WSL 的官方扩展。装好之后在 WSL 终端里进到项目目录敲code .VS Code 会自动以“远程-WSL”模式打开这个目录此时编辑器左下角会显示WSL: Ubuntu。这种模式下终端、调试器、扩展全部运行在 Linux 侧但界面还是 Windows 的等于把两边的优势都占了。Python、Go、C 的各种插件都能正常工作环境变量、解释器路径全按 Linux 来不会再出现“本地装了一个包远程找不到”这种事。有个小细节值得说远程模式下VS Code 的扩展分“本地扩展”和“WSL 扩展”有些扩展需要在 WSL 侧重新装一遍。装的时候认准扩展页面上的“Install in WSL”按钮别看见一个装一个不然会出现同一功能装了两份但只有一份生效的困惑。5.3 GPU、CUDA 和编译环境的几个坑做机器学习的朋友会关心 WSL 里能不能用 CUDA。答案是能但顺序不能错NVIDIA 驱动装在 Windows 侧WSL 里不要重复装驱动只装 CUDA Toolkit 和 cuDNN 就行。在 WSL 终端里nvidia-smi能出结果就说明打通了。如果nvidia-smi报找不到命令先确认 Windows 侧驱动是最新的、支持 WSL 的版本再检查是不是不小心在 Linux 侧装了驱动包那会把环境搞得一团糟。编译环境方面apt自带的 CMake 版本通常比较老有些新项目要求 3.20 以上apt里可能只有 3.16。查版本用cmake --version。要装新版可以下预编译的二进制包直接解压到/opt然后软链到/usr/local/bin具体版本号去官方发布页看最新的不要照抄某个固定版本因为版本迭代很快。这个思路和装其他工具是一样的包管理器版本不够新的时候用官方二进制包 手动放路径是最干净的做法。6. 踩坑记录常见报错和备份迁移用了几年下来反复出现的就那么几类问题。我把它们整理成表格遇到的时候对号入座比一条条搜要快。6.1 高频报错速查表报错或现象常见原因处理办法wsl --install长时间停在某一步网络下载不畅改用离线包wsl --import手动导入启动时提示 WSL 版本过旧要求运行某命令WSL 内核组件需要更新在 PowerShell 里执行wsl --update启动报虚拟机相关错误虚拟化未开或内存完整性冲突检查 BIOS 虚拟化、系统内核隔离设置报错提到“正在解析……请稍后”卡住配置文件异常或默认用户没设对检查wsl.conf必要时wsl --shutdown重来Ubuntu 里ssh localhost连不上sshd 没启动或没装sudo apt install openssh-server后启动服务从 Windows 连 WSL 里的服务连不上WSL 和宿主机 IP 不同用localhost转发或查ip addr拿真实 IP中文文件名显示成方块locale 未配中文装language-pack-zh-hans并配置 locale解压 zip 后中文乱码编码是 GBK用unar或unzip -O cp936apt update报源格式错误源配置与系统版本不匹配核对系统版本恢复官方源或换对应版本源关于版本过旧那个提示顺带说一句WSL 的组件和发行版是分开更新的发行版本身是 Ubuntu内核和 WSL 运行时是微软那边维护的。所以遇到“版本过旧”不是重装 Ubuntu而是在 Windows 侧执行wsl --update更新运行时更新完wsl --shutdown再进就正常了。再补充一个 SSH 的细节。WSL2 的网络是独立虚拟网卡它的 IP 每次重启可能会变所以如果你要固定从别的机器连进来要么在每个开机脚本里动态取 IP要么直接用 Windows 侧的localhost做端口转发把请求转发到 WSL。很多“昨天还能连今天连不上”的问题都是 IP 变了导致的。6.2 备份、导出、迁移与重装WSL 用久了会越来越胖或者你想换台机器这时候备份和迁移能力就很重要。核心就两个命令wsl --export Ubuntu D:\backup\ubuntu-backup.tar wsl --import Ubuntu-new D:\wsl\ubuntu-new D:\backup\ubuntu-backup.tar --version 2--export把整个发行版打包成一个 tar 文件包含你装的所有软件、配置、用户数据等于一个快照。--import把它导回来或者导到新机器上。这个组合有几个非常实用的场景换电脑时直接导出再导入环境原样搬过去发行版被折腾坏了导回去秒级恢复想把系统盘上的发行版迁到数据盘先导出、注销旧的、再导入到新位置。注销旧发行版用wsl --unregister Ubuntu这里要格外小心这个命令会直接删掉发行版和里面的所有数据执行前一定要先--export备份。我见过有人手一抖把几个月的工作环境一次清空欲哭无泪所以养成习惯动--unregister之前先导出。迁移到新位置时导入之后默认用户会重置成 root所以记得重新配一遍wsl.conf里的默认用户。另外导出的 tar 文件体积可能不小几十 GB 都有可以考虑先清理一下apt缓存sudo apt clean和临时文件再导出能省不少空间。7. 我个人的使用体会用到现在WSL 已经成了我日常工作的主力环境。回头看那些踩过的坑其实集中在三个时间点安装阶段的网络问题、配置阶段的中文和用户问题、使用阶段的跨系统文件和网络问题。把这三块提前处理好后面基本就是享受了。我现在的习惯是装完系统第一件事做环境自检第二件事换源装工具链第三件事配好默认用户和 locale这三步做完一个干净可用的 Ubuntu 就立起来了。最后分享一个我自己一直在用的技巧给常用的启动和关闭动作做成快捷方式或者别名比如在 PowerShell 里定义function wslstop { wsl --shutdown }关环境一条命令。WSL 用久了会常驻内存不关的话会一直吃资源定期wsl --shutdown关掉需要的时候再进机器会清爽很多。这套流程跟下来你会发现 Windows11 上装 Ubuntu 这件事真的没有想象中复杂前提是别在环境前提和网络这两步偷懒。