很多朋友问过我:想在 Windows 上正经用 Linux,但又不想装双系统、不想在虚拟机里折腾半天,有没有更省事的路子?我的答案始终是 WSL,也就是 Windows Subsystem for Linux。简单来说,它让你在 Windows 系统里直接跑一个 Ubuntu 子系统,不用重启切换系统,不用给虚拟机分配内存和磁盘,就能用上原汁原味的 bash、apt、gcc 这一整套 Linux 工具链。这篇指南我会从安装开始,一直讲到日常开发和踩坑排查,尽量把你能遇到的和暂时想不到的问题都过一遍。如果你是刚接触 Ubuntu 的新手,这篇能帮你少走弯路;如果你已经在用虚拟机,我也想把 WSL 的真实优缺点讲清楚,让你自己判断该不该换。
1. 为什么在 Windows 上折腾 Linux,我首选 WSL
1.1 WSL 1 和 WSL 2 到底差在哪
WSL 本身不是一个单一版本,它经历了从 WSL 1 到 WSL 2 的大改版。WSL 1 更像是一个“翻译层”,把 Linux 的系统调用转译成 Windows 的系统调用,好处是启动极快、文件共享方便,坏处是很多依赖 Linux 内核特性的东西跑不起来,比如 Docker 容器、某些内核模块,一用就废。WSL 2 则换了一套思路,它用真正的轻量级虚拟机跑一个完整 Linux 内核,兼容性大幅提升,Docker、CUDA、systemd 都能正常使用。
现在你只需要记住:绝大多数场景都默认使用 WSL 2。你可以在 PowerShell 里执行wsl --set-default-version 2把它设为默认版本,也可以针对某个发行版单独设置,比如wsl --set-version Ubuntu 2。从实际体验来看,WSL 2 的启动速度虽然比 WSL 1 慢一点点,但依然能在一两秒内打开终端,日常使用几乎感知不到差别。
为什么这个改动这么重要?因为很多人最早用 WSL 是为了写代码、跑脚本,后来发现想跑 Docker、想用 GPU 加速,WSL 1 完全没法用。WSL 2 把这一层限制打通了,它现在真正能作为日常开发环境来用,而不是一个“能跑 bash 的玩具”。
1.2 WSL 比虚拟机强在哪,弱在哪
先狠狠地夸一下 WSL 的优势。
第一,资源占用轻。虚拟机要完整启动一个桌面系统,内存至少分 4GB,CPU 占用也不低。WSL 2 背后虽然也是虚拟化,但 Windows 会动态管理内存,很多场景下空闲时我只分到几百 MB,对日常办公几乎没影响。
第二,文件互通是真的方便。虚拟机里要传个文件,还得装 VMware Tools 或者配置共享文件夹。WSL 可以在 Windows 资源管理器里直接输入\\wsl$\Ubuntu访问 Linux 文件系统,也可以在 Ubuntu 里通过/mnt/c/Users/你的用户名直接访问 Windows 盘符。实测下来,在 WSL 里用/mnt/c读写 Windows 文件会慢一些,尤其是大量小文件场景,正确做法是把项目放到 Linux 侧文件系统里,开发效率会明显提升。
第三,Windows Terminal 和 VS Code 对 WSL 的集成做得太成熟了。启动 Windows Terminal,下拉菜单里直接选 Ubuntu 标签页就进去了;VS Code 装一个 WSL 扩展,然后敲code .,它就能自动连接到 WSL 内部的开发环境,右下方显示“WSL: Ubuntu”,用的是 Linux 本地工具链,但界面完全在 Windows 上,体验很像远程开发。
再说说弱的地方。毕竟它不是一个完整桌面系统,如果你需要的是一套带桌面环境的 Linux 完整体验,或者需要跑一些依赖图形界面的 Linux 软件,WSLg 虽然能做一些,但性能和兼容性还是不如虚拟机。另外,有些特殊的磁盘管理、系统级调试工具,在虚拟化套娃环境下会碰到奇奇怪怪的问题。这时候我建议老老实实开 VMware 装一个 Ubuntu Desktop。
1.3 它到底适合谁、不适合谁
适合用 WSL 的人群非常明确:写代码、学 Linux 命令、搭服务端环境、跑数据脚本、折腾 Docker、研究嵌入式工具链,这些场景 WSL 都能稳定覆盖。尤其是一些本科生、刚入行的开发者,想在 Windows 笔记本上低成本学 Ubuntu,WSL 是最友好的入口。
不适合用 WSL 的人群也很清楚:如果你要跑完整桌面环境、要大量进行硬件相关的测试、要做嵌套虚拟化实验,或者就是单纯想要一个和服务器一致的环境,那还是用虚拟机吧。WSL 再像 Linux,它也不是物理机上的完整 Linux,这一点心里要有数。
2. 从零安装:Windows 上跑起 Ubuntu 的完整过程
2.1 动手前需要确认的系统条件
安装前先确认三件事。
第一,Windows 版本不能太老。WSL 2 需要 Windows 10 版本 2004 及以上,或者 Windows 11。Windows 11 对 WSL 的默认支持更好,但你如果还在用 Windows 10,只要系统更新到 21H2 以上,体验差别也不大。需要重点注意的是,如果你用的是 Windows Server,操作路径会稍微不同,但核心命令是一样的。
第二,CPU 虚拟化要在 BIOS 里打开。WSL 2 依赖虚拟化功能,绝大多数电脑出厂默认开启,但如果你装完发现“找不到虚拟化支持”或者安装后启动报错,先进 BIOS 找 Intel VT-x 或 AMD SVM 开关,打开后重启再试。
第三,如果你之前从来没安装过 WSL 组件,最好先更新一下 Windows 系统,避免后面冒出“WSL 内核版本太旧”的报错。更新是基础功,别嫌麻烦。
2.2 一条命令装好 WSL 和 Ubuntu
确认完条件,安装步骤其实很简单。用管理员身份打开 PowerShell 或 Windows Terminal,执行:
wsl --install这条命令会自动启用必要的 Windows 功能,下载 WSL 内核,然后默认安装 Ubuntu 发行版。安装完成后按提示重启电脑,重启后会自动弹出 Ubuntu 终端,让你设置新的用户名和密码。用户名会默认用小写,只建议用英文字母和数字,别用中文,也别含空格。
如果想指定 Ubuntu 版本,可以再加参数:
wsl --install -d Ubuntu-24.04查看当前可用发行版列表可以用:
wsl --list --online我第一次装的时候就是直接wsl --install,装的是默认 Ubuntu,够用了。要注意的是,这一步可能需要比较长时间,取决于你的网络状况和系统性能。装完以后在开始菜单里就能看到 Ubuntu 图标,点开就是终端。
2.3 安装太慢怎么办
这是新手最容易崩溃的环节。wsl --install卡在下载阶段、进度条不动、下载速度只有几十 KB/s,很多人的第一反应是网络问题,但其实不完全对。
先说最可能的瓶颈:Windows 从微软服务器下载 WSL 内核,和从应用商店下载发行版时,国内网络环境下不稳定是常态。这里有两个有效办法。
第一个办法是给 WSL 设置镜像站的发行版下载源。微软支持手动导入离线安装包,我们可以从国内高校镜像站下载 Ubuntu 的 appx 包,然后用 PowerShell 安装。大概流程是:找一个能访问的 Ubuntu WSL 镜像下载页,下载后缀为.appx或.appxbundle的文件,改名为 zip 解压或者直接右键安装,然后再用wsl --install就能很快完成。需要注意下载的包版本要匹配自己的 CPU 架构,x64 就是 x64。
第二个办法,也是我最常用的,是先把wsl --install中的系统组件安装完成,也就是只需要等待内核和功能启用,别管发行版下载是否卡住。重启以后,直接在 Microsoft Store 里搜索 Ubuntu,从商店页面安装发行版。商店的下载通道有时候更稳,实测很多卡在wsl --install的情况,转到商店安装很快就成功了。
还有一种常见迷雾:明明下载完成了,却在“正在安装”阶段长时间卡住。这多半是 Windows 虚拟化平台没完全启用。去“启用或关闭 Windows 功能”里手动勾选“虚拟机平台”和“适用于 Linux 的 Windows 子系统”,重启后再试。
2.4 想导入/导出备份发行版
WSL 用久了,环境配置得顺心顺手,想备份一份放到新电脑上?不要傻乎乎地复制整个文件系统,WSL 自带了一个干净的导出命令。
先关掉正在运行的发行版:
wsl --shutdown然后导出到 tar 文件:
wsl --export Ubuntu D:\backup\ubuntu.tar想导入到新机器:
wsl --import Ubuntu D:\wsl\ubuntu D:\backup\ubuntu.tar注意,如果使用--import导入的发行版,默认用户会变成 root,而且不会自动创建之前的默认用户。解决办法是打开导入后的发行版,在 root 下执行sudo usermod -u 你的原用户名之类操作前,先检查/etc/wsl.conf和/etc/passwd,确保用户和默认用户配置正确。我遇到几次这种问题,都是因为太着急,导入后直接开终端发现用户名不对,后来重新配了一遍用户权限才恢复。
3. 进入 Ubuntu 后的第一件事:环境初始化
3.1 换源与软件包更新
第一次进入 Ubuntu 终端,第一件事永远是更新软件包缓存。但直接跑sudo apt update之前,强烈建议先换软件源。默认源指向 Ubuntu 官方服务器,在国内网络下速度时快时慢,尤其是装大包的时候非常折磨人。
我用的是清华源或者阿里源。操作方法是备份原来的源列表:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo vim /etc/apt/sources.list把里面的地址改成对应 Ubuntu 版本的镜像地址。需要注意,新版 Ubuntu 24.04 使用 apt 的 deb822 格式,主配置位于/etc/apt/sources.list.d/ubuntu.sources,这时候改这个文件就行。换成国内源后执行:
sudo apt update sudo apt upgrade -y这一步基本能把系统迁移到较新的状态。我个人的习惯是升级完以后顺手装一批基础工具:build-essential、curl、wget、git、net-tools、vim。一句话:
sudo apt install -y build-essential curl wget git net-tools vim这套组合拳基本把日常开发需要的底座打好了。
3.2 创建自己的用户和密码
安装 WSL 时通常已经创建了默认用户,但如果你的 WSL 是通过--import导入的,默认用户可能是 root,或者你想要的只是一个分离的普通用户,可以这样创建:
sudo adduser 你的用户名按照提示设置密码、姓名等信息。然后把用户加入sudo组:
sudo usermod -aG sudo 你的用户名如果想把某个用户设为 WSL 的默认用户,编辑/etc/wsl.conf:
[user] default=你的用户名保存后回到 Windows 执行wsl --shutdown,再重新打开 Ubuntu,就会发现默认用户名变了。我踩过的坑是:加完sudo组后没有从当前终端退出重新登录,导致当前会话里的 sudo 权限没生效,所以执行完用户组修改后最好重开终端。
3.3 与 Windows 互通互访
WSL 里访问 Windows 文件很简单,Windows 的 C 盘在 WSL 中挂载在/mnt/c下。例如你想进入 Windows 下载目录:
cd /mnt/c/Users/你的用户名/Downloads反过来,在 Windows 文件资源管理器的地址栏输入:
\\wsl$\Ubuntu\home\你的用户名就能直接看到 Linux 侧的家目录。很多我用 VS Code 打开过的 Linux 项目,都会通过这种方式复制文件到 Windows 桌面上,反过来也成立。不过要记住:跨文件系统频繁读写会变慢,特别是 node_modules、某个大型 Git 仓库这种成千上万个小文件的场景,最好把项目放在 Linux 侧,比如/home/你的用户名/projects。
3.4 中文输入法和系统环境变量
很多人第一次在 WSL 里输入中文的时候懵了:明明系统是中文界面,终端里打不了中文。WSL 默认不带图形环境,所以输入法要自己装。我的建议是安装 fcitx5:
sudo apt install -y fcitx5 fcitx5-chinese-addons然后编辑环境变量,在~/.bashrc末尾加:
export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx如果你用 WSLg 跑图形界面程序,就能在图形窗口里呼出中文输入法。不过这里有个前提:如果你只是想在纯终端里输入中文,WSLg 版本较新时终端原生就支持中文输入,先试一下再说,太多人一上来就装输入法,结果发现纯终端根本不需要。
系统环境变量则集中在~/.bashrc或~/.profile。比如想加一个 PATH 路径:
export PATH="$HOME/bin:$PATH"改完执行source ~/.bashrc生效。我不建议直接改/etc/environment,容易影响系统行为,一旦改错,可能导致很多基础命令找不到,后面第 5 章专门讲怎么救。
3.5 常用开发工具链:GCC、JDK、Docker
Linux 环境里,GCC 几乎不用单独装,build-essential已经带了gcc、g++、make。验证一下:
gcc --versionJava 环境的话,我优先推荐 OpenJDK 17,和大多数现代项目兼容性最好:
sudo apt install -y openjdk-17-jdk如果你想装的工具比较多样,可以参考一张常见安装表:
| 工具 | 安装命令 | 说明 |
|---|---|---|
| GCC 工具链 | sudo apt install build-essential | 包含 gcc/g++/make 等 |
| Node.js | sudo apt install nodejs npm | 版本可能偏旧,建议用 nvm 装新版本 |
| Python 3 | sudo apt install python3 python3-pip | 系统自带 python3 |
| Git | sudo apt install git | 配合git config --global user.name |
| Docker | curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh | WSL2 里可以跑原生 Docker 引擎 |
在这里特别说一下 Docker。如果你用的是 WSL 2,完全可以直接在 Ubuntu 里安装 Docker 引擎,然后设置 WSL 的 systemd 支持,Docker 服务就能开机自动启动。但如果你图省事,在 Windows 上装 Docker Desktop 也行,它会在 WSL 里帮你创建专门的发行版。我个人的建议是:如果不依赖 Docker Desktop 的图形界面,直接在 WSL 里装 docker-ce 更干净,资源占用也更少。
4. 把 WSL 当日常开发环境来用
4.1 Windows Terminal + VS Code
我用 Windows Terminal 已经好几年了,真心觉得这是微软给开发者最好的礼物之一。Windows Terminal 能原生支持多个标签页、主题配色、快捷键,而且完美识别 WSL 发行版。安装方式有两种:从 Microsoft Store 搜索“Windows Terminal”安装,或者如果你已经升级到 Windows 11,它通常自带的终端就已经是 Windows Terminal。
打开 Windows Terminal,点标签栏旁边的下拉箭头,选 Ubuntu,就会直接进入 WSL。这时候我建议在.bashrc里顺手配一个几个常用的 alias:
alias ll='ls -alF' alias la='ls -A' alias l='ls -CF' alias ..='cd ..'VS Code 的集成更无脑。Window 端安装 VS Code,装一个叫“WSL”的扩展,然后打开 Ubuntu 终端,进入项目目录,执行:
code .它会自动协商端口、文件路径,把 VS Code 的 UI 显示在 Windows 上,底层所有 shell、编译、运行都在 WSL 内部。这比我自己装了各种远程开发插件后再配置跳板机要舒服得多,对初学者来说几乎没有学习成本。注意第一次执行code .时,VS Code 会下载一些 WSL 服务端组件,同样可能受网络影响较慢,耐心等一下或者检查一下网络即可。
4.2 跑图形程序:WSLg
早期在 WSL 里跑 GUI 程序很痛苦,要么装 X Server,要么用第三方工具转发,现在我基本不需要了。新版 WSL 内置 WSLg,命令行里直接跑带界面的程序,窗口会以原生窗口的形式弹出来。比如想用 Ubuntu 上的图形化文本编辑器:
sudo apt install gedit gedit执行后 Windows 桌面会弹出 gedit 窗口,和本地应用几乎无差。再比如想跑 Linux 版 GIMP 或 LibreOffice,也都行。WSLg 的兼容性已经相当不错,日常的图形工具完全够用。要注意的是,第一次启动图形程序可能稍慢,因为 WSL 需要初始化和图形环境通信,之后再启动就快了。
如果你用的是旧版本 WSL,跑图形程序时需要手动安装 VcXsrv 一类工具,但现在基本不需要了,升级 WSL 到最新版是最佳路径。
4.3 GPU 加速(CUDA/PyTorch)到底怎么配
WSL 2 一个很吸引人的特性是支持 GPU 加速,这让很多机器学习玩家能在 Windows 笔记本上搭建 PyTorch 环境而不用额外装双系统。前提是 Windows 端安装了最新的 NVIDIA 驱动,然后在 WSL 内部安装 CUDA Toolkit:
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安装完检查 nvidia-smi:
nvidia-smi能看到 GPU 信息就是安装成功。接着建 Python 虚拟环境:
python3 -m venv venv source venv/bin/activate pip install torch torchvision跑一个简单的 PyTorch 验证脚本:
import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))如果输出True,说明能正常调用 GPU。这里要提醒一句,WSL 里 CUDA 的安装包与原生 Linux 有一些差异,务必选择 WSL-Ubuntu 对应的仓库版本。很多人装完以后nvcc -V正常,但nvidia-smi报错,多半是驱动没同步到 WSL 里,Windows 端更新驱动后重启一下 WSL 即可。
AMD GPU 用户也有路径,需要安装 ROCm 相关组件,但配置更复杂,而且对 WSL 的支持还在完善中。如果你的显卡是 AMD 且目标是跑深度学习,我个人建议多查一下当前版本的官方文档,别照抄老教程。
4.4 系统和日志排查小技巧
WSL 到底是个混合体,排查问题要两头都看。在 Windows 侧打开 PowerShell 执行:
wsl --status wsl --version可以查看当前的状态和版本号。如果遇到 WSL 假死、网络异常、磁盘空间异常,先关掉:
wsl --shutdown再重新打开终端。很多诡异问题,一重启就好了。日常在 Ubuntu 侧排查问题时,常用的日志查看命令是:
sudo journalctl -xe dmesg不过我个人更依赖简单直接的排查顺序:先看磁盘是否满了,再查内存占用,最后看进程。例如:
df -h free -h ps aux | head -50这三个组合能解决我 70% 的疑难杂症。
5. 常见问题与避坑实录
5.1 wsl --update 版本过旧问题
“wsl needs updating. Your version of Windows Subsystem for Linux (WSL) is too old” 是我被问过最多的一条报错。看到这个,说明你的 WSL 内核太旧,而且系统没有自动更新。
解决方法很简单,在管理员 PowerShell 里执行:
wsl --update等它更新完成后重启。如果更新失败,可能是网络问题,也可以尝试在“启用或关闭 Windows 功能”里确认“虚拟机平台”选项已开启,有时候它虽然提示开着,但实际没生效。还有一种情况是 Windows Server 环境,需要手动开启虚拟机平台功能后,再执行更新命令。这个报错解决后,WSL 的配置和运行稳定性都会明显改善。
5.2 忘记 Ubuntu 密码/环境变量改崩了怎么办
忘记 Ubuntu 登录密码是最常见的问题之一。WSL 环境下由于默认用户拥有 sudo 权限,重置思路完全不同于物理机。万一你忘了某个用户的密码,首先在 PowerShell 里以 root 身份进入该系统:
wsl -u root或者直接修改配置文件。在 Windows 资源管理器的\\wsl$\Ubuntu\etc\wsl.conf里,加一段:
[user] default=root然后执行wsl --shutdown,重新打开 Ubuntu,就会以 root 身份登录,接下来执行:
passwd 之前的用户名重置完以后,别忘了把 wsl.conf 里的 default 改回来。
环境变量配置错误导致“所有命令都找不到了”则更恐怖,因为连sudo、ls都用不了。这时候不要慌,从 Windows 侧打开文件资源管理器,进入\\wsl$\Ubuntu\home\你的用户名,找到.bashrc,用记事本打开,删掉出错的那几行,再重新启动 WSL。问题就解决了。这类问题让我最大的教训是:改环境变量前一定备份,改完立即开一个新终端测试,别在当前终端里干等。
5.3 端口占用和启动失败
WSL 里的服务会占用某个端口,Windows 上另一个进程也占用同一端口时,会出现服务起不来或者请求被截胡的情况。这时候在 Windows 侧查看端口占用:
netstat -ano | findstr :8080找到占用端口对应的 PID,再用:
taskkill /PID 12345 /F或者干脆用wsl --shutdown释放 WSL 相关的端口占用。但要注意,如果你跑的是 Docker 里的服务,重启 WSL 会使 Docker 里的容器全部停掉。另一个常见坑是 Windows 防火墙会拦截 WSL 的入站请求,导致局域网内其他设备访问不到你在 WSL 里启动的服务。解决办法是给防火墙加规则,或者直接使用localhost测试,这种情况我在跑 Elasticsearch 时遇到过,多排查一步就能定位。
5.4 文件权限与路径转换误区
WSL 和 Windows 之间的文件权限经常让新人抓狂。明明在 Windows 里看到的文件没问题,到了 WSL 里却显示Permission denied;或者在 WSL 里创建的文件,在 Windows 记事本里打开变成LF换行格式。这些其实都是正常的,WSL 有自己的一套权限和换行规则。
在/mnt/c下,文件默认执行权限可能被 Windows 挂载选项限制,可以用:
sudo mount -t drvfs C: /mnt/c -o metadata重新挂载以启用 Unix 权限元数据,但通常不是首选方案。最省事的方法就是:涉及权限敏感的项目,不要把仓库放到/mnt/c下,直接放在 Linux 侧文件系统。路径转换方面,Windows 的路径和 Linux 路径互相换算,可以借助wslpath命令:
wslpath "C:\Users\你的用户名\projects"这个命令能把 Windows 路径转成/mnt/c/Users/你的用户名/projects,反过来也一样。以我多年的经验,跨系统文件交互能少则少,这种转换省下来的时间最后都会变成你吃灰的调试时间。
6. 进阶玩法与我的个人体会
6.1 在 WSL 里玩点有意思的
当基础环境稳定后,WSL 能扩展出很多有意思的用法。比如常见的安全分析工具 binwalk,一条命令就能装好:
sudo apt install binwalk这对做固件分析、文件系统提取的人来说非常方便。再比如环境打包、迁移,完全可以用wsl --export把整个 Ubuntu 环境备份到移动硬盘,换电脑时导入,开发环境无缝迁移。扩展磁盘空间也可以做到:默认 VHDX 虚拟磁盘文件可能会越用越大,想要扩容就要用 Windows 侧的diskpart或者 Hyper-V 管理工具修改 VHDX 大小,不过这个操作风险较高,建议先备份再说。
6.2 我实际用了几年 WSL 后的真实感受
如果非要让我说个公道话,WSL 是一个把“Windows 开发”和“Linux 工具链”粘合得很好的东西,但它不是万能的。我踩过最大的坑就是不愿意在 Windows 和 Linux 文件系统之间做取舍,导致项目放在/mnt/c下编译特别慢。后来我强制自己所有代码工程都放 Linux 侧,Windows 文件只做资源输入输出,体验直接上升一个档次。另一个体会是,WSL 的升级速度非常快,很多老教程已经过时了,遇到问题最先该做的就是wsl --update,然后认真读官方文档,而不是去复制十年前的文章。希望这篇指南能帮你少走一些弯路,把精力真正花在事上。