ARTICLE DETAIL

资讯详情

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

WSL2 完全指南:在 Windows 上搭建 Ubuntu 开发环境的最佳实践

WSL2 完全指南:在 Windows 上搭建 Ubuntu 开发环境的最佳实践 1. 为什么我建议你在 Windows 上直接开 Linux 子系统先说说我自己的经历。几年前我还在干运维的时候最烦的一件事就是在一台 Windows 工作机上同时处理 Linux 服务器的排查任务。传统做法无非三种装双系统、开虚拟机、再扛一台 Linux 物理机。双系统重启一次等半天虚拟机吃内存又吃 CPU物理机更不用说了桌面堆得跟机房一样。直到后来我真正把 WSLWindows Subsystem for LinuxWindows 的 Linux 子系统用起来才意识到之前那些折腾有多绕。WSL 是微软官方做的一个兼容层让你在 Windows 系统内部直接运行一个完整的 Linux 环境不需要虚拟机监视器也不需要重启切系统。最直观的体验是你在 Windows 的窗口里打开一个终端敲ls、grep、apt install跑的是真正的 Ubuntu 内核态程序WSL2 模式下但文件和 Windows 的资源管理器是能互相看到的。这种感觉有点像在 Windows 里养了一只“Linux 宠物”平时各过各的但你随时可以打开门喂食、串门、派活。如果你属于下面任何一类人这篇文章就是写给你的工作中要连 Linux 服务器做运维的工程师日常写 Python、Node.js、Go 但不想为了兼容性问题装整套虚拟机的开发者正在学 Linux 但不想搞坏主力电脑的学生甚至是你只想在本机一键跑个 Redis、MySQL、Elasticsearch 的普通程序员。装好 WSL Ubuntu 之后上面这些需求基本都能满足而且清理起来比虚拟机方便得多。我下面要讲的流程是我在 Windows 10 和 Windows 11 上都实测跑通过的包含从检查环境、开启功能、安装 Ubuntu到换软件源、配置中文输入法、调整系统资源的完整过程最后还会把你大概率会碰到的坑都列出来。跟着一步步做半小时内你就能拥有一个能日常使用的 Ubuntu 环境。2. 动手之前先把这些搞清楚版本、模式和基础概念2.1 WSL1 和 WSL2 到底有什么区别选哪个WSL 有两个大版本网上资料经常混着说但你把它们当成两种不同实现就很好理解。WSL1 是微软用系统调用翻译的方式把 Linux 程序发出来的请求转成 Windows 能理解的请求优点是不需要虚拟化、兼容老机器但缺点是文件操作很慢很多依赖内核特性的软件跑不了。WSL2 则是微软在 Windows 里内置了一个轻量级虚拟机里面跑的是真正的 Linux 内核所以兼容性大幅度提升像 Docker、FUSE、systemd 这些年头比较新的东西都能正常用。这也回答了“到底选哪个”的问题只要你的电脑支持虚拟化默认就选 WSL2。我在实际使用中测过WSL2 里编译 C 程序、跑 Node.js 服务速度跟原生 Linux 差距已经很小了。而且 WSL2 的动态内存回收做得不错不像传统虚拟机那样一开机就吃掉你好几个 G 的内存。你不需要手动指定用哪个版本新装系统默认就是 WSL2只有遇到老机器开不了虚拟化时才需要退回 WSL1 凑合。2.2 安装前必看的系统版本和硬件要求在跑安装命令之前先花两分钟确认环境能省掉后面一大堆报错。官方最低要求是 Windows 10 2004 或更高版本Windows 11 全系列都没问题。实际操作中我发现 Windows 10 版本越老越容易出现奇怪问题强烈建议你先在“设置 - 更新和安全 - Windows 更新”里把系统补丁打全再开始装 WSL。确认方法很简单按Win R输入winver弹出的窗口里会显示大版本号和内部版本号。比如我看到的是“Windows 10 企业版 22H2”那就可以放心装。如果你的版本低于 2004我建议别折腾旧命令了直接把系统更新到最新再来否则后面遇到“WSL 版本过旧”这类报错会搞得你很被动。硬件方面WSL2 依赖 CPU 虚拟化。一般来说 2015 年之后的 Intel 和 AMD 消费级 CPU 都支持你可以在任务管理器 - 性能 - CPU 里查看“虚拟化”这一项是否显示“已启用”。如果显示未启用需要进 BIOS/UEFI 把 Intel VT-x 或 AMD-V 打开笔记本用户需要注意有些机器出厂默认是关掉的。系统内存建议 8G 起步16G 会舒服很多因为只要 Windows 和 WSL 里的服务同时跑起来4G 内存真的会卡到你怀疑人生。2.3 一个容易被忽略的概念发行版WSL 不等于 Ubuntu它只是一个“容器框架”里面装什么 Linux 发行版由你决定。微软商店里能看到 Ubuntu、Debian、Kali Linux、openSUSE 等多个发行版你甚至可以同时装好几个互不干扰。这篇文章主要讲 Ubuntu因为它的软件包最全、资料最多、遇到问题拿搜索引擎一搜就有答案对新手最友好。如果你已经有 Docker 里跑 Ubuntu 或者云服务器用 CentOS 的经验没关系WSL 里装 Ubuntu 的思维和装云主机非常像你有一个 root 权限的 shell用apt装软件用 systemd 管理服务。学一次云服务器和本地环境都能复用这也是我推荐入门者选 Ubuntu 的原因。3. 完整安装实操从零开始让 Ubuntu 跑起来3.1 第一步用一条命令打开 WSL 功能并安装 Ubuntu确认好环境和硬件之后真正的安装其实可以浓缩成一条命令。以管理员身份打开 PowerShell 或 Windows Terminal右键开始菜单 - “终端(管理员)”输入下面这条命令并回车wsl --install这条命令会自动完成以下事情启用“适用于 Linux 的 Windows 子系统”功能、启用“虚拟机平台”功能、下载并安装当前 WSL 版本内核、默认安装 Ubuntu 发行版。整个过程你只需要等不用像老教程那样手动去“启用或关闭 Windows 功能”里勾一堆选项。如果执行完提示需要重启那就重启一次这是正常的因为要在 Windows 内核里挂载虚拟机相关组件。重启后可以再看一眼wsl --status如果显示“默认版本2”那就说明基础环境已经齐了。有一点我要特别提醒这条命令在极少数精简版系统上可能会因为缺少某些依赖而报错比如提示找不到“Windows 更新”服务。遇到这种情况不用慌先跑一次完整的系统更新再重试即可。另外如果你在公司电脑上操作且安全策略比较严格可能会出现权限不够的问题那就需要找 IT 管理员帮忙放行。3.2 第二步如果自动安装失败用手动方式兜底我测试过好几台机器wsl --install并不是百分百顺利的。最常见的失败是下载 Ubuntu 时进度条半天不动或者直接报“无法解析服务器的名称或地址”。如果你遇到这种问题可以改用两步走的手动方式。第一步手动启用两个 Windows 功能。在 PowerShell 管理员模式中执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完重启电脑。第二步去微软官方 WSL 下载页面手动下载 WSL 2 的内核更新包一个.msi文件双击安装然后去 Microsoft Store 搜 “Ubuntu”点获取安装。如果你不想用商店也可以从微软官网直接下载 Ubuntu 的.appx安装包下载后 PowerShell 里执行Add-AppxPackage .\Ubuntu.appx一样能装上。这种手动方式有个额外好处就是你可以自己决定具体是装 Ubuntu 22.04 还是 24.04而不是被默认版本绑死。我个人建议装 LTS 长期支持版至少能用五年不担心软件源失效。3.3 第三步首次启动设置 Linux 用户名和密码装好 Ubuntu 后开始菜单里会出现 Ubuntu 的图标点击打开或者直接在命令行里输入wsl回车。第一次启动会让你等一两分钟做初始化之后进入一个“Installing, this may take a few minutes...”的界面这是 Ubuntu 在帮你创建默认用户耐心等就行。然后你会看到两条提示Enter new UNIX username和New password。这里有一个新手必踩的坑用户名不能有大写字母也不建议和你的 Windows 用户名完全一样。我第一次安装时想偷懒直接用 Windows 用户名结果系统直接提示用户名不合法只好换了一个。密码输入时终端不会显示任何字符这不是键盘坏了而是 Linux 的安全设计盲打完回车就行。这两个信息一定要记住因为后面所有需要 sudo 权限的操作都会用到。忘记密码也不是世界末日可以在 Windows 侧执行wsl -u root直接以 root 身份进入系统再用passwd命令重置普通用户的密码。不过建议你把它写进密码管理器别考验记忆力。3.4 第四步换软件源否则 apt 会慢到让你怀疑人生Ubuntu 装好后第一件事很多人会直接sudo apt update然后看到输出卡在某个地方不动。这就是我常说的默认源在国外国内网络连接速度极不稳定。解决方案是换成国内镜像源这也是我实测提升体感最大的一步。先备份原始源列表然后编辑软件源文件sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo nano /etc/apt/sources.list把文件里的内容替换成你所在地区访问速度快的镜像源。以清华源为例Ubuntu 24.04 的源配置大概是这样的不同版本代号对应不同内容注意替换deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-security main restricted universe multiverse如果你不确定自己的 Ubuntu 版本代号在命令行里执行lsb_release -a就能看到。替换完后执行sudo apt update你会发现输出速度像坐上了高铁。这里我还要给一个建议源地址里如果有https不支持而报错可以改成http或者安装apt-transport-https包来解决。4. 把 Ubuntu 调教成日常顺手的状态4.1 安装必备开发工具和常用命令装完系统只算完成了 30%接下来需要把常用工具补齐。下面这组命令是我的标配安装列表可以直接复制执行sudo apt update sudo apt upgrade -y sudo apt install -y build-essential git curl wget zip unzip \ net-tools openssh-server vim htop tree ca-certificates apt-transport-https解释一下为什么装这些build-essential是 C/C 编译工具链几乎所有编译安装场景都要用git和curl不用解释现代开发的标配net-tools里带ifconfig有些人已经习惯用它查 IPopenssh-server让你可以从其他机器 SSH 进这个 WSL 环境htop比 top 好看也更好用。装完后你可以试试htop按F10退出界面里能直观看到 CPU 和内存使用这对后面排查性能问题非常有用。如果你在国内用 Git 拉代码经常超时可以顺手配一下代理环境变量或者改用镜像地址但这是另一个话题本文先不展开。我想强调的是WSL 里的 Ubuntu 就是一个正常的 Linux 系统你以前在云服务器上怎么装工具在这里就怎么装没有任何特殊限制。4.2 设置中文输入法在 WSL 里也能打中文热词里有“ubuntu中文输入法怎么设置”这个问题我当年也折腾了好一阵。首先明确一点WSL 本身没有图形桌面默认启动的是一个命令行外壳所以你不需要在 WSL 里安装输入法框架直接在 Windows 侧输入中文然后把文字粘贴进终端即可。但如果你非要给 WSL 配图形界面比如装了 VcXsrv 或 WSLg那才有安装中文字体和输入法的必要。对于大多数人来说我推荐更简单的方案用 Windows 自带的中文输入法在终端窗口内通过Ctrl Space或者Win 空格切换中英文。Windows Terminal 本身对中文渲染支持很好不会出现乱码。真正会乱码的场景只有一种终端编码不是 UTF-8。这时你在 Ubuntu 里执行sudo apt install -y locales sudo locale-gen zh_CN.UTF-8然后在/etc/environment里加一行LANGzh_CN.UTF-8重开终端即可解决。如果你确实需要在 WSL 里用图形界面那就得先确认你的 WSL 版本支持 WSLgWindows 11 或较新的 Windows 10 预览版然后按 Linux 桌面的标准流程装 fcitx5 或 ibus但说实话这种使用场景非常小众性能也一般。4.3 跨系统文件访问双向操作的两种方式WSL 和 Windows 之间的文件访问是本项目最大的亮点之一。你在 Ubuntu 命令行里可以直接访问 Windows 磁盘文件路径是/mnt/c/、/mnt/d/比如cd /mnt/c/Users/你的用户名/Desktop就能进入 Windows 桌面目录。反过来在 Windows 文件资源管理器的地址栏输入\\wsl$\Ubuntu就能打开 Ubuntu 自己的文件系统像操作普通文件夹一样操作 Linux 里的文件。这里藏着一个非常影响性能的细节Windows 文件/mnt/c和 Linux 原生文件系统/home/你的用户名的读写速度差距非常大。我实测复制同一份包含几千个小文件的代码目录在/mnt/c下可能要一分钟放到 Linux 侧文件系统几秒就完成。原因在于 WSL2 的跨文件系统访问要经过协议转换性能天然变差。所以我的实操建议是项目源码、数据库文件、依赖包都放在 Linux 文件系统里比如~/projects和 Windows 交互的文件比如要提交给同事的文档才放到/mnt/c。千万被因为贪图用资源管理器方便就把 Git 仓库整个放在\\wsl$映射之外的地方那样后续编译构建会慢得让你怀疑人生。4.4 通过 .wslconfig 限制内存和 CPU 占用WSL2 默认会吃掉你一半的系统内存作为上限这在 16G 内存的电脑上通常没问题但如果你同时在 Windows 侧跑浏览器、IDE、设计软件内存就容易吃紧。解决办法是在 Windows 用户目录下创建一个.wslconfig文件专门用来限制 WSL 的资源使用。在 Windows 的C:\Users\你的用户名\下新建文本文件命名为.wslconfig内容示例[wsl2] memory4GB processors4 swap2GB localhostForwardingtrue保存后在 PowerShell 里执行wsl --shutdown再重新进入 WSL配置就会生效。注意处理器数量不要超过你物理机的逻辑核心数可以通过任务管理器查看。这个配置文件是针对所有 WSL2 发行版生效的所以如果你后面又装了 Kali 或 Debian它也会遵守同样的限额。我用的比较极端的方案是给 WSL 只分配 3GB 内存日常跑 Docker 和编译小项目完全够用剩下的内存留给 Windows 端的 IDE 和浏览器。如果你发现 WSL 里的服务响应变慢可以先用htop看是不是内存被占满再回来调大.wslconfig里的数字。5. 常见问题与排查技巧实录5.1 wsl --install 太慢或卡住不动怎么办热词里“wsl --install 太慢”搜索量很高说明这是一道普遍关卡。造成慢的原因有两个一是微软服务器在国内的连接质量不稳定二是网络环境下某些下载请求被拦截。我实测有效的手段按顺序排列如下先检查网络微软服务器的连通性可以用命令测试如果不通换一个网络环境或换个时间段再试。如果网络没问题但仍然慢建议直接用手动安装方案启用 Windows 功能后去微软官网手动下载 WSL 内核更新包再从商店或官网下载 Ubuntu 的安装包。这两个步骤都属于静态文件下载和命令行的在线执行相比失败率会低很多还能配合下载工具做断点续传实测最省心。另外个别安全软件会把 WSL 的组件下载行为当作可疑操作拦截如果你电脑上装着比较激进的安全管家安装前先把相关拦截规则关掉或者暂时退出并进行观察。5.2 启动时提示 WSL 版本过旧too old怎么处理“Your version of Windows Subsystem for Linux (WSL) is too old”这个报错我见过很多次尤其在老电脑上。它的本意是系统里 WSL 组件的版本太低不满足某个发行版的启动要求。解决方式是去微软官方 WSL 页面下载最新的 WSL 内核更新包并安装然后执行wsl --update wsl --shutdown之后再重新进入系统报错基本就会消失。如果wsl --update因为网络卡住那仍然是网络问题手动下载.msi安装包是最可靠的路径。这类报错对新人来说很容易被吓到但其实它只是一个版本号问题动手升级一下就好不需要重装或者改配置。5.3 命令行窗口中文乱码和中文文件解压乱码中文乱码在 WSL 里有两个来源。第一个来源是终端编码设置Windows Terminal 默认用 UTF-8但如果你用的老款 conhost 窗口可能默认是 GBK。这时候可以执行chcp 65001切到 UTF-8或者在 Ubuntu 里安装中文字体后再看效果。第二个来源是压缩包本身用 Windows 编码压缩解压到 Linux 后文件名乱了。碰到zip包中文乱码的场景我推荐用unzip加参数或用7z解压。例如sudo apt install -y unzip p7zip-full unzip -O GBK 中文命名的文件.zip-O参数可以指定用 GBK 编码解析文件名这招对付从 Windows 那边拿来的老压缩包特别管用。如果你平时经常解压网上下载的资源建议直接把这个命令记到备忘录里早晚用得上。5.4 WSL 里的 SSH 服务连不上很多人在 WSL 里装了openssh-server然后从另一台电脑尝试 SSH 连接发现连不上。排查思路跟普通 Linux 服务器完全一样按以下顺序检查服务是否启动、端口是否监听、防火墙是否放行。启动服务用sudo service ssh start。查询端口监听用sudo ss -tlnp | grep 22如果不显示说明服务没起来。WSL2 的 IP 是动态的每次重启可能都会变所以如果是和同一台电脑上的 Windows 互连直接用localhost就行WSL2 默认会把端口转发到 Windows。跨设备连接的话先执行hostname -I拿当前 IP再用这个 IP 连接。另外 Windows 防火墙通常会拦截入站 SSH你需要手动放行 TCP 22 端口或改为使用 Windows 侧 OpenSSH Server 进行转发。如果你只是想在 Windows 侧方便地执行 Linux 命令根本不需要 SSH直接在 PowerShell 里wsl就进入了。SSH 的坑主要面向少数需要从外部接入的场景建议先想清楚自己的需求再折腾。5.5 Ubuntu 根目录空间不足和磁盘扩展WSL2 的磁盘是一个动态增长的虚拟磁盘VHDX默认安装在 C 盘。如果你经常拉 Docker 镜像、克隆大仓库C 盘空间很容易告急。网上不少老教程会教你用wsl --export和wsl --import把整个系统迁移到 D 盘这个方法我验证过是有效的但操作起来相对重量级。我更推荐在安装之初就注意项目文件存放位置把占空间的大目录放到/mnt/d如果你有 D 盘数据盘或者随时清理 Docker 缓存docker system prune -a。如果系统已经跑了一段时间C 盘空间吃紧那还是用迁移方案最彻底。基本步骤是在 PowerShell 里执行wsl --shutdown然后wsl --export Ubuntu d:\wsl\ubuntu-backup.tar再wsl --import Ubuntu d:\wsl\ubuntu d:\wsl\ubuntu-backup.tar --version 2。导入后你可能会发现默认用户变成了 root需要编辑/etc/wsl.conf指定[user]字段恢复普通用户。这个流程值得收藏早晚用得上。6. 与常用工具链打通VSCode 和 Docker 的配合玩法6.1 在 VSCode 中使用 WSL 做开发WSL 对开发者最友好的点之一就是和 VSCode 的无缝集成。你只需要在 VSCode 中安装官方扩展 “WSL”扩展名ms-vscode-remote.remote-wsl然后打开命令面板选择 “WSL: Reopen in WSL”整个 VSCode 窗口就会切换成远程开发模式代码、终端、调试器全部跑在 Ubuntu 环境里。看起来像远程到一台服务器本质上是本地进程之间的通信速度快、没有网络延迟。配置好之后你在 VSCode 的终端里直接敲 Linux 命令比如npm run dev、python manage.py和在 Windows 侧没有任何体验割裂。特别适合处理路径差异问题比如某个项目只在 Linux 下能构建或者依赖的某些原生模块在 Windows 上装不上。我见过不少同事因为项目里用了只能在 Linux 上运行的依赖被迫开虚拟机写代码现在一套 WSL2 VSCode 就搞定了。6.2 Docker Desktop 怎么配合 WSL2 使用Docker 是 WSL2 的最大受益者之一。Docker Desktop 安装时可以勾选 “Use the WSL 2 based engine”这样 Docker 引擎实际运行在 WSL 的轻量虚拟机里但你在 Windows PowerShell 里也能直接调用docker命令非常顺滑。而且 Docker Desktop 可以分别控制哪些 WSL 发行版启用 Docker 集成主流用法是给 Ubuntu 打开。这套方案对资源的控制比传统 Docker Toolbox 干净很多Windows 上跑 Docker 再也不用装什么 VirtualBox 了。我自己日常会在 WSL 里写好docker-compose.yml在 Ubuntu 侧执行然后 Windows 上只需要装一个 Docker Desktop 做引擎管理。数据库这类有状态服务注意把卷挂载到 Linux 文件系统路径比如/home/用户名/volumes/mysql避免性能损耗。实际上只要你 WSL 环境是正常的Windows 侧执行docker ps和 Linux 侧执行能看到完全一样的容器列表这就是官方集成带来的好处。6.3 把 Windows Terminal 设成默认使用 WSL如果你还没用过 Windows Terminal我建议立刻去微软商店免费安装。它比老式 conhost 窗口支持多标签页、富文本渲染和自定义快捷键。设置方式很简单在 Windows Terminal 的“设置 - 启动 - 默认配置文件”中选择 “Ubuntu”以后每次打开终端就直接进入 WSL 环境连手动敲wsl都省了。我会同时把 Ubuntu 的快捷方式固定在任务栏这样 Alt Tab 切换窗口时也能快速认出哪个是 WSL。如果你经常同时开 Linux 和 PowerShell 两个标签页还可以在设置里给 Ubuntu 配一个专属配色方案用颜色区分两个环境防止在错误的终端里执行命令。别小看这个细节我有一次在 PowerShell 里敲了一堆apt install结果全部报错后才发现自己进错了标签页。7. 写在最后几点掏心窝的体会如果你完全是第一次接触 Linux我建议你把它当成一个“可以随时重来的 Linux 练习场”。WSL 里的 Ubuntu 不像双系统或物理机那样有“搞坏了系统就不能开机”的心理压力你可以在里面随便运行命令、装软件、改配置坏了就用wsl --unregister重置重来。我自己用过一段时间 WSL 之后最明显的感受是学习成本被拉低了很多以前看 Linux 教程要准备独立环境现在打开终端就能跑一遍这种“即时反馈”对新手的帮助极大。作为已经踩过不少坑的人我觉得最值得记住的一条经验是文件放对位置。项目代码、数据库数据、依赖缓存都放 Linux 侧文件系统只有需要跟 Windows 交换的文件才走/mnt/c。如果你能从一开始就养成这个习惯后面遇到的很多性能问题、路径问题和权限问题都会少一大半。最后一个建议是WSL 不是用来替代生产服务器的它更像一个随身的 Linux 工具箱。和远程服务器交互用 SSH想在本地快速验证一个命令、跑一个服务、或者复现一个生产问题再用 WSL。两者配合好你的工作效率会提升非常明显。希望这套流程能帮你把 Windows 和 Linux 之间的隔阂彻底抹平早日把心思放到真正该解决的问题上。
返回列表