我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

Windows下安装Linux?WSL2从零到实战完整教程

Windows下安装Linux?WSL2从零到实战完整教程 最近在一个项目群里看到好几个兄弟问Windows 下面到底怎么装 Linux 才不折腾有人直接上了 VMware 虚拟机结果电脑风扇起飞有人去装双系统结果引导顺序搞乱了差点把 Windows 搞崩。我当时的回复只有一句先把 WSL2 装上再说。你搜到的“WLS2”大概率是 WSL2 的手误官方全称是 Windows Subsystem for Linux 2翻译过来就是 Windows 的 Linux 子系统二代。这货不是你想象中那么玄乎的虚拟机它本质上是 Windows 内置了一个轻量级虚拟化平台跑着真正的 Linux 内核却能和你 Windows 桌面无缝共享文件、剪贴板甚至是端口。这篇教程我就把我的完整安装过程、踩坑记录、性能调优方案全部放出来照着做基本不会翻车适合所有在 Windows 上跑开发环境、学 Linux 命令、搭服务器练习的兄弟。用 WSL2 的最大理由其实很朴素它够快、够省、够干净。先不说它是微软官方方案光说文件互访这一个点就比传统虚拟机舒服太多了。你在 Windows 桌面下载一个压缩包用 Linux 端的命令几秒钟就能解压Linux 里跑起来的 Web 服务Windows 浏览器直接用 localhost 打开。没有双系统切换的麻烦没有 Win 和 Linux 割裂的网络环境连 Docker 都能直接在 WSL2 后端上跑。我接下来会从为什么选它开始聊再把安装前后所有关键细节拆开讲让你不但会装还知道每一步到底在干什么。1. 为什么我在 Windows 下折腾 Linux最后选了 WSL21.1 我的三个真实使用场景先说个现实问题我平时的主力机器就是 Windows但工作内容绕不开 Linux。最典型的场景三个每个场景如果我用传统虚拟机都会很难受。第一个场景是写 Shell 脚本和练 Linux 命令。我经常要处理日志过滤、批量文件重命名、写一些 grep、awk、sed 的组合命令。在 Windows 自带的 cmd 和 PowerShell 下命令语法完全不同写了也没法直接扔到服务器上跑。第二个场景是跑 Docker。搞过容器化的兄弟都懂Docker Desktop 在 Windows 上如果不接 WSL2 后端跑起来卡得人心态爆炸尤其是 IO 密集型容器。第三个场景是搭服务器练习环境。我为了练 Nginx 配置、MySQL 部署和 Python 服务上线流程以前在 VMware 里开一台 Ubuntu每次开机要等三四分钟内存直接吃掉 3GB 以上笔记本风扇噪音巨大。换到 WSL2 之后这三个场景全部无缝迁移过来。启动 Ubuntu 终端只要一两秒内存占用比纯净桌面 Linux 小得多最重要是它不像传统虚拟机一样有个独立的桌面环境你根本感觉不到“虚拟”的边界存在。说白了WSL2 不是给你当桌面系统用的它是给你当“开发工具”用的这才是它最对味的使用姿势。1.2 WSL1 和 WSL2 到底差在哪WSL2 前面明明还有个 WSL1很多教程里都会提到“将版本设置为 2”但没说清楚为什么要用 2 而不是 1。这里我帮大家把底层逻辑理一遍。WSL1 走的是系统调用翻译层这个思路它不是虚拟化而是把 Linux 的系统调用翻译成 Windows 内核能认得的调用。好处是文件 IO 性能极强因为读写文件时可以直接操作 Windows 文件系统不经过虚拟化层。坏处是它的兼容性有天花板很多依赖内核特性的软件跑不了比如 Docker 就极度依赖 Linux 内核的 namespace 和 cgroup 等能力WSL1 基本没法正常工作。WSL2 则不同它换成了真正的轻量级虚拟机方案里面跑着一颗完整、微软官方维护的 Linux 内核。虽然它的磁盘 IO 在跨系统读写时没有 WSL1 那么猛但它换来了极其完整的 Linux 兼容性。现在新版 WSL2 在这几年迭代后磁盘性能已经提升了不少配合 Windows 11 上更好用的文件互访协议日常开发体验完全在线。一句话总结如果你只是写几个 Linux 命令WSL1 和 WSL2 都能做如果你想跑 Docker、编译 C 项目、跑一些依赖内核模块的服务那就老老实实用 WSL2。1.3 三个硬条件系统版本、BIOS 虚拟化、虚拟机平台功能安装 WSL2 之前建议先对照一下三样东西缺一个都可能在后面某个步骤莫名其妙报错。第一是系统版本。微软的官方要求是 Windows 10 2004 及以上版本Windows 11 当然全部原生支持。如果你还在用 Windows 10 1909 或者更老老办法是手动开启功能、装内核更新包。现在新版本系统最舒服的路径是执行一行命令让系统自己搞定。第二是 BIOS 里的虚拟化开关。WSL2 的底层是虚拟化技术所以 CPU 的硬件虚拟化必须开启。Intel 平台叫 VT-xAMD 平台叫 SVM不同主板 BIOS 菜单位置不一样一般在 Advanced、CPU Configuration 或者 Security 这类目录下面。很多哥们卡在安装时的 0x80370102 报错十有八九就是这里没开。第三是 Windows 的可选功能里要启用虚拟机平台。这个在后续安装步骤中可以通过命令行直接开启核心思路是让 Windows 放行 Hyper-V 架构中某些组件。有一点要说明WSL2 和旧版 Hyper-V 不完全是一回事但底层共享虚拟机监控器基础能力所以你平时不装 Hyper-V 工具也完全不影响 WSL2 工作。搞清楚这三个条件后面安装流程基本就是顺水推舟。2. 安装前先做对这几件事后面能少踩一半坑2.1 快速验证你的 CPU 虚拟化是否开启不想到 BIOS 里翻来翻去找设置的给你一个最简单的验证办法打开 Windows 的任务管理器切到“性能”标签页点击 CPU右下角就能看到“虚拟化已启用/已禁用”。如果显示“已禁用”你先别急着继续安装因为你后面大概率会撞上 0x80370102 这个报错到时候还是要回头进 BIOS。进 BIOS 的通用操作是重启电脑在开机画面按 Del 或 F2不同主板略有差异笔记本可能是 F10、F12进去后找 Intel Virtualization Technology 或 SVM Mode。这里有个小经验有些主板名字叫 Virtualization、VT-x、AMD-V 之类本质上都是同一个东西。开启后保存退出重启再用任务管理器确认一遍。如果你这台电脑是公司或学校统一管理的BIOS 里可能被锁了虚拟化选项这种就别硬杠要么找管理员开权限要么老老实实用云服务器练手。我在给同事装的时候就遇到过一台联想办公机 BIOS 锁死的情况排查了半天最后发现根本没权限改。2.2 用一条命令进入正确安装流程现代 Windows 上最舒服的安装方式是用管理员身份的 PowerShell 或命令提示符执行这一条命令wsl --install -d Ubuntu这条命令做了很多事自动启用 WSL 功能、自动启用虚拟机平台、自动下载安装最新 WSL 内核、自动下载并安装 Ubuntu 发行版。如果你只是执行wsl --install不加参数默认装的发行版通常是 Ubuntu但显式写上-d Ubuntu更加明确也方便你将来在命令行里识别正在操作的是哪个系统。如果电脑提示“WSL 正在安装可能需要重启”就说明功能组件还在启用中。这时候重启一次系统然后再开终端继续。等到重启完成后系统已经默认把 Ubuntu 下载到了开始菜单里你点开发行版图标就能开始配置用户名密码。这个过程在 Windows 11 上体验特别顺滑基本不需要任何手动下载 ISO 或调整分区之类的操作。注意执行这条命令需要管理员权限。如果是在普通权限的终端里执行系统会提示你“请启用适用于 Linux 的 Windows 子系统可选功能”那你右键当前终端选择“以管理员身份运行”再执行一次即可。2.3 老版本 Windows 的备选安装方式如果你电脑系统版本比较老比如 Windows 10 1909 或者更早wsl --install可能不会自动完成所有步骤因为微软在 2020 年之后才把安装流程整合进这条命令里。这时候要采用手动三步走。三步走的第一步是用管理员 PowerShell 启用 WSL 功能Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux第二步是启用虚拟机平台Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform第三步是去微软官网下载“适用于 x64 计算机的 WSL2 Linux 内核更新包”安装完后重启。之后再打开 Microsoft Store 搜索 Ubuntu 并下载安装。其实这几件事拼起来就是新版wsl --install自动帮你做的事情。这里多说一句如果你公司电脑有严格的软件安装审批制度Store 装不了微软还提供离线安装方式。你可以在 PowerShell 里执行Invoke-WebRequest或直接在浏览器下载 Ubuntu 的 .appx 安装包然后用Add-AppxPackage命令装进去。不过这种方法只建议在极少数场景下折腾能走 Store 还是走 Store 最省心。3. 从下载到进入系统的完整实操流程3.1 初始化 Ubuntu 并创建你的第一个 Linux 用户安装完成后你会在开始菜单看到 Ubuntu 的图标。第一次打开它会弹出一个终端窗口提示 “Installing, this may take a few minutes” 然后自动执行初始化这一步是在解压 Ubuntu 根文件系统。它的等待时间受磁盘速度和网络影响一般在两到五分钟之间如果超过十分钟没动静大概率是网络下载卡住了关掉窗口重新打开通常就好了。成功进入 Ubuntu 命令行后系统会要求两个关键输入新的用户名和密码。Linux 这里和 Windows 有一个比较大的思维差异你创建的用户虽然默认带 sudo 权限但它不是那个全能的 root 账号。Linux 日常操作建议都用这个普通用户只有安装软件、修改系统文件时才通过 sudo 提权。你创建的用户名会出现在终端提示符里比如yournameDESKTOP-XXXX:~$这样。密码输入时屏幕不会显示任何字符这是 Linux 终端的安全特性不是键盘坏了我第一次上手时也吓了一跳以为输入没响应。输完直接回车就行。这个密码之后 sudo 的时候会频繁用到建议设成一个你记得住、不易猜的。3.2 确认你已经在用 WSL2 而不是 WSL1安装完成后有一步很关键确认当前发行版跑的到底是 WSL1 还是 WSL2。有时候因为系统默认版本没设置或者旧版本升级上来的体系结构残留你装好的 Ubuntu 可能还在用 WSL1 的内核翻译模式。虽然大多数操作没感知但一旦你执行某些依赖 Linux 内核特性的命令就会得到各种莫名其妙的报错。验证方法很简单在你 Windows 的 PowerShell 或者 cmd 里执行wsl -l -v输出大概是这样的表格NAME STATE VERSION * Ubuntu Running 2VERSION 那一列如果是 2恭喜你跑在 WSL2 上。如果显示 1只需要执行这条命令把它转换过来wsl --set-version Ubuntu 2这个转换过程会重新生成 Linux 虚拟磁盘耗时可能稍微长一点耐心等一下。如果你有多套发行版也可以用同样的命令把每一套都切成 WSL2。3.3 把默认版本锁死为 WSL2新版本 Windows 每次全新安装 WSL 后默认版本就是 2但有些旧环境升级上来后默认版本仍然是 1。为了以后不会再手滑装上 WSL1 的发行版我建议你手动设置一次默认版本wsl --set-default-version 2这条命令的作用是以后你安装任何新的发行版系统都会自动按 WSL2 来初始化不需要每次转换。这也是我在安装完 Ubuntu 之后最想先执行的一条命令不然将来同事拿你电脑装个 Debian可能就偷偷跑在 WSL1 上。设置成功后如果你想看看 Windows 侧怎么看这套 Linux 环境可以执行wsl -l -o查看所有可在线安装的发行版列表里面有 Ubuntu、Debian、kali-linux、openSUSE 等选项。玩腻了 Ubuntu 的兄弟可以按需多装一套多发行版互不冲突完全是独立的文件系统空间。3.4 换用国内镜像源apt update 速度的救星Ubuntu 装好的第一天我最不推荐你先去装各种花里胡哨的软件而是先把软件源换掉。Ubuntu 官方源在国外裸跑sudo apt update时那个网络速度真的很让人着急一个更新列表能卡上几分钟中途失败更是家常便饭。国内比较常用的源是阿里云和清华源这里给出一个我在 Ubuntu 22.04/24.04 上都验证过的方式。第一步先备份原始源配置sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak第二步编辑源列表你可以用 nano 或 vimsudo nano /etc/apt/sources.list把里面的地址替换成阿里云镜像Ubuntu 22.04 以后默认用的是新的 deb822 格式文件可能在 /etc/apt/sources.list.d/ 目录下。如果你和我一样用 Ubuntu 24.04更推荐直接修改 /etc/apt/sources.list.d/ubuntu.sources。替换完核心源之后执行sudo apt update sudo apt upgrade -y这样之后装任何软件包速度都能跑到你的带宽上限。我换完源之后apt update 从几分钟降到几秒钟这个体验差距实在太大了属于装完必做。4. 新系统装完必做的几件事4.1 先装这几个基础包进到 Ubuntu 命令行的第一印象是干净像刚出厂的毛坯房——非常多的基础工具都没装全包括网络排查工具、文本编辑器、版本控制工具等。我的建议是按下面这张清单装基本覆盖日常开发百分之九十的需求sudo apt install -y build-essential git curl wget zip unzip net-tools dnsutils software-properties-common解释一下为什么是这几个包build-essential 包含了 gcc、g、make 等一系列编译工具以后你在 Linux 下源码编译软件几乎必须它们git 就不用多说了代码管理和同步全靠它curl 和 wget 是下载和接口请求必备排查网络问题也要靠它们net-tools 提供 ifconfig、netstat 等命令虽然现代系统更推荐 ip 命令但很多老教程里依旧用的旧命令dnsutils 提供 nslookup 和 dig排查 DNS 问题必须用。装完之后顺手验证一下git --version curl --version另外多说一句很多新同学以为 Ubuntu 自带 zip 解压工具但实际上默认只带了压缩和解压 tar 的基础能力。zip 和 unzip 不装的话你拿到的 Windows 压缩包在 Linux 里解压可能报错 “command not found”所以装包这步建议别省略。这里我顺便整理了一份高频 Linux 命令速查方便刚上手的兄弟没事敲一敲命令作用使用场景grep文本搜索过滤查日志、找配置项awk列处理和格式化输出处理表格型文本sed流式编辑替换批量替换文件内容find文件查找按名字找文件chmod修改文件权限给脚本加执行权限df / du查看磁盘占用排查空间不足ps / top查看进程看谁占了 CPUsystemctl管理系统服务启停 Nginx/MySQL4.2 Windows 和 Linux 之间怎么互访文件WSL2 最让我离不开的功能就是 Windows 和 Linux 文件系统之间的双向访问。先说 Windows 访问 Linux 里的文件在 Windows 文件管理器地址栏直接输入\\wsl$\Ubuntu回车就能像网络共享一样看到 Ubuntu 的整个根文件系统。你也可以把\\wsl$\Ubuntu\home\你的用户名固定到快速访问里日常传文件非常方便。反过来在 Linux 里访问 Windows 桌面、文档等目录也有固定路径一般在/mnt/c/Users/你的Windows用户名/Desktop。比如你从 Windows 下载了一个软件包放在桌面Linux 端直接拷贝cp /mnt/c/Users/你的Windows用户名/Desktop/package.tar.gz ~/这里要提醒一个常见性能认知在/mnt/c下读写 Windows 文件IO 速度明显慢于在 Linux 原生文件系统比如 /home、/root下的操作。原因是中间隔了一层 9P 协议或 drvfs 文件映射。所以我的习惯是永远把项目代码放在 Linux 内置文件系统里然后通过 Windows 资源管理器访问 Linux 侧而不是反着来。比如你想用 VSCode 打开项目就直接在 WSL 终端里项目目录执行code .Windows 侧会自动弹出窗口。4.3 在 WSL2 里跑 Docker 的正确姿势WSL2 的杀手级应用就是 Docker这也是我坚持用 WSL2 而不是 WSL1 的重要原因。装 Docker 的正确姿势有两种一种是安装 Docker Desktop需要在 Windows 侧装然后设置里把 WSL2 backend 打开这样 Docker 命令可以直接在 WSL 内部使用另一种是只装 Docker EngineLinux 端适合不喜欢 Docker Desktop 额外界面的用户。我个人推荐后者因为它更轻量、更贴近真实服务器上 Docker 的使用方式。具体命令如下sudo apt install -y docker.io docker-compose sudo systemctl enable docker sudo systemctl start docker sudo usermod -aG docker $USER最后一条 usermod 是把自己的用户加入 docker 组目的是免 sudo 执行 docker 命令。执行完记得重新打开终端或者执行newgrp docker让组权限立即生效。验证是否成功docker run hello-world跑通之后你可以把 Nginx、MySQL、Redis 这些服务全部容器化WSL2 里的资源占用控制其实挺严格不会一启动就爆内存。这也是为什么我建议普通开发者在 Windows 上装 Docker 优先选择 WSL2 后端而不是传统 Hyper-V 虚拟机。有一点额外提醒如果你在 WSL2 里直接跑 Docker Engine 而不是通过 Docker Desktop某些 Windows 防火墙环境可能限制端口。遇到这种情况时一般加一条 Windows 侧端口转发就能解决我放后面排查章节细说。5. 性能调优与常见问题排查实录5.1 用 .wslconfig 限制内存和 CPU 占用WSL2 的默认资源配置逻辑很直白启动时它会视情况占用 Windows 总物理内存的一定比例。但这个默认策略有时太激进比如你 Windows 要开一堆办公软件同时 WSL2 里跑着编译任务内存瞬间就被抢完电脑直接卡得鼠标都飘。解决办法是在 Windows 用户目录下创建一个.wslconfig文件用来配置全局 WSL2 资源上限。文件路径在你的C:\Users\你的Windows用户名\.wslconfig用记事本打开不存在则新建。一个我常用的配置[wsl2] memory6GB processors4 swap2GB localhostForwardingtrue解释几个关键参数memory 是 WSL2 虚拟机能拿到的最大内存processors 是逻辑处理器上限swap 指定虚拟内存在 Windows 页面文件上的保留大小localhostForwarding 控制 WSL2 里启动的服务能否通过 Windows 的 localhost 访问默认 true一般不用动。改完配置后要让设置生效需要执行wsl --shutdown然后重新打开 WSL 终端。如果不执行 shutdown旧配置会一直生效改了半天却没效果这也是大家最容易踩的坑。另外想说一句memory 值不要设得比你实际内存还高比如 16GB 内存的机器设 12GB 没问题8GB 内存的机器建议设 4GB 左右留一些给 Windows 桌面和浏览器。5.2 网络连接问题的三个排查方向WSL2 的网络默认是 NAT 模式也就是它在 Windows 后面建立了一个虚拟网段Windows 相当于网关。这个设计带来一个好用的默认行为从 Windows 直接 localhost 访问 WSL2 服务默认就是通的例如在 WSL 里启动 NginxWindows 浏览器打开http://localhost:80即可。但反过来从 WSL2 里访问 Windows 侧的服务情况稍复杂。三个最常遇到的问题我给理一下。第一个问题“curl 外网请求失败”。这种情况先检查 DNS 配置看 /etc/resolv.conf 里的 nameserver 是否是 Windows 分配的那个地址。如果 DNS 指向出了问题可以手动编辑 /etc/resolv.conf 填入nameserver 8.8.8.8或国内公共 DNS不过要小心这个文件可能被 WSL 重置。第二个问题局域网其他设备访问不了 WSL2 里的服务。这种要分 Windows 侧最常见做法是在 Windows 上做端口代理例如把宿主机 8080 转发到 WSL2 的 8080netsh interface portproxy add v4tov4 listenport8080 listenaddress0.0.0.0 connectport8080 connectaddressWSL2的IP先查 WSL2 的 IPhostname -I然后在 Windows 防火墙里放行对应端口。第三个问题是新版 WSL 支持镜像网络模式在 .wslconfig 里加一行networkingModemirrored可以让 WSL2 直接复用 Windows 的网卡接口从根本解决很多端口和网络互通问题适合需要让同一局域网设备直接访问 WSL 服务的情况。5.3 磁盘不够了迁移 VHD 和压缩磁盘镜像WSL2 的文件系统存放在一个 VHD 虚拟磁盘文件里默认路径在C:\Users\你的Windows用户名\AppData\Local\Packages\...\LocalState\ext4.vhdx。这个文件默认放在 C 盘如果你的项目里拉了很多 Docker 镜像它体积会涨得飞快可能某一天打开系统发现 C 盘红了。最直接的解决办法是把 VHD 文件迁移到其他磁盘。迁移流程先关闭 WSL 再操作一定别跳过wsl --shutdown然后打开文件资源管理器找到 ext4.vhdx把它剪切到你想要的目标盘比如D:\WSL\Ubuntu\ext4.vhdx。要注意的是现在新版 WSL 其实提供了wsl --manage相关命令去管理虚拟磁盘建议优先尝试wsl --manage Ubuntu --move D:\WSL\Ubuntu\ext4.vhdx这个命令比手动剪切再修改注册表安全得多。迁移完成后重启 WSL检查一下原来的文件是否还在。如果还想进一步压缩磁盘体积可以执行压缩命令把虚拟机内部删掉的空余空间回收给 Windowswsl --manage Ubuntu --compact执行中可能需要关闭 WSL 终端。压缩之后 C 盘空间会有明显释放尤其是你在 Linux 里删过几个大文件或者清过 Docker 镜像的情况效果非常可观。5.4 安装过程中的典型报错速查表我自己安装和帮别人安装 WSL2 时遇到过不少报错很多都在论坛里反复出现。整理成一个速查表方便大家对照解决。报错信息原因解决办法0x80370102BIOS 虚拟化未开或未完全生效进 BIOS 开启 VT-x/SVM确认后重启0x80070003虚拟机平台功能未正确启用重新执行 Enable-WindowsOptionalFeature 并重启0x800701bcWSL 内核更新包缺失或过旧运行wsl --update或手动安装内核更新包“WSL 服务未运行”WSLService 服务被禁用服务管理器里启动 LxssManager / WSLServiceUbuntu 打开后一直黑屏/卡初始化网络下载发行版失败或镜像损坏关闭终端重新打开或 Store 中卸载重装localhost 点击无法访问服务监听的地址不是 0.0.0.0在 Linux 里启动服务时用 0.0.0.0 监听最后补一个和报错无关但很常见的疑问Windows 杀软或安全策略会拦截 WSL 吗如果你用的是 Windows Defender基本不影响如果是第三方安全软件或公司管控软件偶尔会出现 WSL 服务启动失败。先尝试wsl --shutdown后重开一次终端如果依然失败把 WSL 相关目录及进程加到信任区。如果公司环境封禁了 WSL 服务组件那可能只能用 VM 方案了。写到这儿WSL2 的安装、配置、优化和排错都过了一遍。我自己从 Windows 7 时代玩虚拟机开始到后来转向 WSL1 再切到 WSL2最大的体会是别把它当成“给 Windows 塞一台虚拟机”而是要当成“Windows 和 Linux 之间的一个高速通道”。刚开始用的时候可能会在文件路径、网络配置上有点不适应但等你把项目放在 Linux 文件系统、日常用 Windows 桌面访问就会越来越顺手。按我个人经验装完系统后第一件事一定先换镜像源第二件事建好 .wslconfig第三件事把 Docker 跑起来。这三件事做完这台 Windows 上的 Linux 开发环境就基本能当主力用了。希望这篇教程能帮你少走一点我当初走过的弯路装好之后多折腾折腾WSL2 的潜力绝对比你想的大。
返回列表