ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WSL完全指南:Windows上高效运行Ubuntu开发环境

WSL完全指南:Windows上高效运行Ubuntu开发环境 很多朋友问过我想在 Windows 上正经用 Linux但又不想装双系统、不想在虚拟机里折腾半天有没有更省事的路子我的答案始终是 WSL也就是 Windows Subsystem for Linux。简单来说它让你在 Windows 系统里直接跑一个 Ubuntu 子系统不用重启切换系统不用给虚拟机分配内存和磁盘就能用上原汁原味的 bash、apt、gcc 这一整套 Linux 工具链。这篇指南我会从安装开始一直讲到日常开发和踩坑排查尽量把你能遇到的和暂时想不到的问题都过一遍。如果你是刚接触 Ubuntu 的新手这篇能帮你少走弯路如果你已经在用虚拟机我也想把 WSL 的真实优缺点讲清楚让你自己判断该不该换。1. 为什么在 Windows 上折腾 Linux我首选 WSL1.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 的优势。第一资源占用轻。虚拟机要完整启动一个桌面系统内存至少分 4GBCPU 占用也不低。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 笔记本上低成本学 UbuntuWSL 是最友好的入口。不适合用 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 默认不带图形环境所以输入法要自己装。我的建议是安装 fcitx5sudo apt install -y fcitx5 fcitx5-chinese-addons然后编辑环境变量在~/.bashrc末尾加export GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERSimfcitx如果你用 WSLg 跑图形界面程序就能在图形窗口里呼出中文输入法。不过这里有个前提如果你只是想在纯终端里输入中文WSLg 版本较新时终端原生就支持中文输入先试一下再说太多人一上来就装输入法结果发现纯终端根本不需要。系统环境变量则集中在~/.bashrc或~/.profile。比如想加一个 PATH 路径export PATH$HOME/bin:$PATH改完执行source ~/.bashrc生效。我不建议直接改/etc/environment容易影响系统行为一旦改错可能导致很多基础命令找不到后面第 5 章专门讲怎么救。3.5 常用开发工具链GCC、JDK、DockerLinux 环境里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.jssudo apt install nodejs npm版本可能偏旧建议用 nvm 装新版本Python 3sudo apt install python3 python3-pip系统自带 python3Gitsudo apt install git配合git config --global user.nameDockercurl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.shWSL2 里可以跑原生 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里顺手配一个几个常用的 aliasalias llls -alF alias lals -A alias lls -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 Toolkitwget 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-sminvidia-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] defaultroot然后执行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然后认真读官方文档而不是去复制十年前的文章。希望这篇指南能帮你少走一些弯路把精力真正花在事上。
返回列表