拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Windows 10 家庭中文版从零启用 WSL 2 全流程

Windows 10 家庭中文版从零启用 WSL 2 全流程

1. 家庭中文版用户想用 WSL 2,到底卡在哪里

先说说我自己的情况。单位发的笔记本预装的是Windows 10 家庭中文版,平时做开发、跑脚本、搭点小服务,命令行环境一直不太顺手。早几年用 Cygwin 和 Git Bash 凑合,后来转 WSL,体验提升一大截。等到WSL 2出来,文件系统性能、完整的 Linux 内核、Docker 支持都香了不少,结果在家庭版上折腾的时候,一路全是坑。网上大部分教程默认你是专业版或者企业版,写得云淡风轻:打开"启用或关闭 Windows 功能",勾两个框,重启,完事。可家庭版用户打开那个面板一看,Hyper-V 那一项压根不存在,很多人当场就懵了。

这篇文章就是把我踩过的坑、试过的路子,一次性讲清楚。目标很明确:在 Windows 10 家庭中文版上,从零把 WSL 2 跑起来,包括启用功能、装内核、装发行版、配置内存和存储,以及后面遇到各种报错怎么救。适合的人群是:用家庭版笔记本做开发的程序员、需要 Linux 命令行跑数据的学生、想在自己电脑上搭个 nginx + PHP 本地环境的运维和前端,以及所有被"家庭版不支持"这句话劝退过的人。需要说明的是,家庭版确实缺一些东西,但缺的不是 WSL 2 本身,而是给人看的那个 Hyper-V 管理界面。搞清楚这一点,后面就顺了。

我先把结论摆出来:Windows 10 家庭版完全可以跑 WSL 2,前提是系统版本够新、CPU 虚拟化开着、并且用命令行去启用那两个可选功能,而不是指望图形界面里的复选框。下面我按实际操作顺序拆开讲。

2. 动手之前,先做四项体检

很多人一上来就敲命令,结果报一堆莫名其妙的错误。我后来养成的习惯是:先体检,再动手。这四步花不了十分钟,能省掉后面两小时的抓瞎。

2.1 系统版本和内部版本号

WSL 2 对系统版本有硬性要求,这个绕不过去。按下Win + R,输入winver回车,会弹出版本信息窗口。真正要看的是括号里的内部版本号,不是外面那个"版本 22H2"。

内部版本号WSL 2 支持情况操作建议
18362 以下(如 17134、17763)不支持先升级系统,否则无解
18362 / 18363(1903 / 1909)支持,但部分功能受限可以装,建议尽快升级到 2004 以上
19041 及以上(2004 / 20H2 / 21H1 / 21H2 / 22H2)完整支持直接用,最省心

我在一台老机器上遇到过 1909 的镜像,装完发行版之后wsl --set-version一直提示内核组件需要更新,升级到 22H2 之后一次通过。所以如果你还在 1903 或者 1909,优先考虑把系统补丁打全,别硬刚。

2.2 确认 CPU 虚拟化已经打开

WSL 2 底层跑的是一个轻量级虚拟机,所以 CPU 的虚拟化指令集必须开着。检测方法特别简单:Ctrl + Shift + Esc打开任务管理器,切到"性能"标签,点左边最下面的"CPU",看右下角有没有"虚拟化:已启用"这一行。

如果显示"已禁用",那就得进 BIOS/UEFI 里找。Intel 平台的名字一般叫Intel Virtualization Technology、VT-x、Vanderpool;AMD 平台一般叫SVM Mode、AMD-V。名字五花八门,各家主板厂商都不一样,笔记本通常是开机按F2或F10,联想有些机型需要按Fn + F2或者用侧面的 Novo 小孔。这一步没有捷径,只能自己翻 BIOS 菜单。改完保存退出,回到系统里再确认一次。

注意:部分品牌整机出厂时把虚拟化选项藏得比较深,或者干脆屏蔽掉。如果 BIOS 里翻遍了都找不到,可以先更新一次 BIOS 固件再说。

2.3 关掉可能打架的虚拟化软件

这一条特别容易被忽略。WSL 2 要用 Windows 的虚拟机平台,如果你的机器上同时装了 VMware Workstation、VirtualBox、安卓模拟器这类软件,它们可能已经抢占了虚拟化资源,导致 WSL 2 起不来。典型症状是启动发行版时报0x80370102。

我的做法是:先临时退出或者卸载这些软件,把 WSL 2 装好、验证能正常跑,再一个个装回来测试兼容性。较新版本的 VMware 和 VirtualBox 对这种共存已经处理得不错,但老版本确实会互相挤。另外 Windows 安全中心里的"内核隔离 - 内存完整性"在某些机器上也会干扰,如果前面步骤都对却依然报错,可以临时关掉它试一次。

2.4 检查系统组件有没有损坏

如果之前系统出过问题,或者装过一些来路不明的"优化工具",系统组件可能已经不完整,DISM 命令执行到一半会失败。保险起见先跑两条修复命令。以管理员身份打开 PowerShell 或者命令提示符:

sfc /scannow DISM /Online /Cleanup-Image /RestoreHealth

第一条扫描并修复系统文件,第二条修复系统映像。两条都跑完再重启,把地基打平。我在一台反复蓝屏过的机器上就是靠这两条命令救回来的,否则后面的功能启用步骤怎么点都是失败。

3. 用 DISM 命令启用两个核心功能

准备工作做完,进入正题。家庭版和专业版在这一步的差别最大,也是最多人翻车的地方。

3.1 图形界面在家庭版里为什么经常走不通

专业版用户走的是这条路径:控制面板 → 程序和功能 → 启用或关闭 Windows 功能,然后在列表里勾选"适用于 Linux 的 Windows 子系统"和"虚拟机平台"。但家庭版的这个列表里,往往看不到"虚拟机平台"这一项,甚至有些版本连"适用于 Linux 的 Windows 子系统"都显示不全。不是功能不存在,而是图形界面把它藏起来了。

所以家庭版的正路是:绕过图形界面,直接用 DISM 命令行启用。DISM 是系统自带的部署映像服务和管理工具,权限足够,不管界面显不显示,它都能把功能打开。

3.2 两条命令逐字拆解

以管理员身份打开 PowerShell 或命令提示符,依次执行下面两条:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

参数的含义值得说一下,理解了才不会瞎敲:

  • /online:作用于当前正在运行的操作系统,而不是某个离线镜像。
  • /enable-feature:启用功能,对应还有/disable-feature。
  • /featurename:xxx:功能在系统内部的正式名称。第一个是 Linux 子系统支持,第二个是虚拟机平台,WSL 2 真正依赖的是第二个,第一个是运行 WSL 的基础。
  • /all:如果这个功能有父级依赖,一并启用。实测加上更省事。
  • /norestart:先别急着重启,等两条命令都跑完再说。

每条命令执行完,最后会输出"操作成功完成"。如果提示"找不到功能名称",说明你的系统版本太老,那个功能确实不存在,回到第 2 章升级系统。

3.3 重启和状态复核

两条都成功之后,必须重启,这一点没有讨价还价的余地。重启完再做一次复核,确认功能真的开了:

dism.exe /online /get-featureinfo /featurename:VirtualMachinePlatform

输出里的"状态"应该是"已启用"。也可以用 PowerShell 的Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform来看。我一般还会顺手看一眼服务状态,之前遇到过功能启用了但服务没起来的情况,重启一次就好了。

4. 装内核更新包,把默认版本切到 2

功能启用只是拿到了"入场券",WSL 2 需要一个独立的 Linux 内核组件,这个组件不在系统镜像里,得单独装。这是家庭版用户最容易漏掉的一步。

4.1 内核更新包到底是个什么东西

WSL 1 和 WSL 2 的架构完全不同。WSL 1 是微软自己写的一套系统调用翻译层,把 Linux 的系统调用实时翻译成 Windows 的调用,兼容性一般,但轻量。WSL 2 干脆换了个思路:跑一个真正的 Linux 内核,放在一个经过高度优化的轻量虚拟机上。这个内核以.msi安装包的形式单独分发,体积不大,几步就装完。

正因为它是独立组件,所以不会随 Windows 更新自动装上去(较新的系统会通过微软商店版的 WSL 分发,但 Windows 10 老版本仍以 MSI 为主)。搜索"WSL2 Linux 内核更新包"就能找到微软官方下载页,选x64那个版本;ARM64 设备的选 ARM64 版本。不确定自己是什么架构,任务管理器 → 性能 → CPU,看"体系结构"一行。

4.2 安装顺序不能乱

正确的顺序是:先启用功能 → 重启 → 再装内核包。如果顺序搞反,内核包装的时候会提示缺少依赖。双击.msi,一路下一步,装完不用重启。

装完验证一下,在命令行输入:

wsl --status

能正常输出默认发行版、默认版本、内核版本这些信息,就说明内核生效了。如果提示wsl不是内部或外部命令,那说明第一个功能(Linux 子系统)没启用成功,回去查第 3 章。

4.3 设定默认版本并验证

这一步是分水岭。执行:

wsl --set-default-version 2

如果内核包没装,这条命令会明确报错,提示你需要更新内核组件——看到这个报错反而说明你找对地方了,去装内核包就行。设置成功的输出是一行提示,告诉你新安装的发行版会默认使用 WSL 2。

这里有个细节值得提前说:--set-default-version只影响之后新装的发行版,对已经装好的旧发行版无效。如果你之前装过 WSL 1 的发行版,需要单独升级:

wsl --list --verbose wsl --set-version Ubuntu 2

第一条列出所有已安装的发行版,注意看VERSION那一列;第二条把指定的那个转成 WSL 2。转换过程本质上是一次容器导出加导入,耗时可能比较久,中间别断电,Ubuntu 里装的软件包会原样保留,但建议先备份重要数据。

5. 装 Linux 发行版的三种路子

前四步走完,剩下就是装系统本身了。为什么要装个 Linux 发行版?因为 WSL 只是一个兼容层,真正让你敲ls、grep、apt的那些工具,都在发行版里面。家庭版用户在这一步有三条路可选,各有适用场景。

5.1 走 Microsoft Store 安装

最省事的方式。打开 Microsoft Store,搜索 Ubuntu、Debian、Kali 之类的关键词,点安装。装完在开始菜单里会出现一个入口,第一次点开需要等它解压,然后设置用户名和密码。

家庭中文版可能遇到商店不可用或者登录异常的情况,这时候别死磕,直接走 5.2 或 5.3。另外要注意,商店里装的发行版默认跟随你在第 4.3 步设置的默认版本,所以顺序千万别搞反,不然装出来还是 WSL 1。

5.2 用 wsl --install 一条命令搞定

系统版本在 2004 以上的话,可以用:

wsl --install -d Ubuntu

-d后面跟发行版代号。这条命令会自动完成"启用功能 + 下载内核 + 安装发行版"的全过程,对新手最友好。不过有个坑:它内部其实还是要走系统功能启用流程,如果前面用 DISM 已经把功能开好了,它会跳过并直接装;如果系统版本偏老,这条命令可能压根不认识--install参数,会提示你把--install当发行版名字对待。看到这种报错别慌,说明你的wsl版本太旧,走 5.3。

另外可以用wsl --list --online先看看有哪些可选的发行版,这个列表来自官方源,比在商店里瞎逛快得多。

5.3 手动下载 appx 包离线安装

这是我用得最多的一种,专门对付商店打不开、或者需要批量部署的场景。流程是:下载对应发行版的.appx安装包,改后缀为.zip,解压到某个目录,然后双击里面的ubuntu.exe之类的可执行文件。

有两个坑必须提醒:

  • 解压路径不能包含中文和空格。以前版本的安装程序对路径处理有 bug,路径里带着中文文件夹名,启动时会直接闪退,什么错误都不给你。我一般放在D:\WSL\Ubuntu这种纯英文路径下。
  • 第一次运行前不要挪动文件夹。安装程序会把当前目录作为系统根目录注册,装完之后再移动会导致发行版找不到。

用这种方式装完后,还是要执行一次wsl --set-default-version 2确认版本,再用wsl --list --verbose复核。

6. 装完之后必须做的几项调优

发行版能进去了,不等于好用了。默认配置下有几个地方一定会让你难受,尤其是内存占用和磁盘位置。

6.1 换软件源和装基础工具

刚装好的 Ubuntu,apt update慢得让人想砸键盘。换成国内的镜像源会快很多,编辑/etc/apt/sources.list,把里面的域名换成镜像站点即可,改之前先备份一份原文件:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential git curl vim net-tools

build-essential里含 gcc、g++、make,几乎是必备;net-tools提供ifconfig这些老工具,调试网络很顺手。这一套下来大概几分钟,之后的开发体验会顺畅很多。要搭本地 Web 环境的话,sudo apt install nginx php-fpm就能把 nginx + PHP 跑起来,比在 Windows 上装一整套省事太多了。

6.2 用 .wslconfig 限制内存和 CPU

这是我认为最有价值的一项配置。WSL 2 默认会按比例吃掉宿主机内存,我 16G 的笔记本上,编译个大项目能吃掉七八个 G,Windows 那边直接卡成幻灯片。解决办法是在用户目录下建一个配置文件:C:\Users\你的用户名\.wslconfig,注意文件名前面有个点。

[wsl2] memory=4GB processors=2 swap=2GB localhostForwarding=true

memory限制最大内存,processors限制 CPU 核心数,swap设交换分区大小。改完必须执行wsl --shutdown完全关闭,再重新进入才生效——光关窗口是不行的,后台的虚拟机进程还在跑。这个参数没有标准答案,我一般按"宿主内存的 1/4 到 1/3"来给,跑编译和容器的时候再临时调大。

6.3 发行版内部的 wsl.conf

.wslconfig管的是 WSL 2 这个虚拟机整体,wsl.conf管的是单个发行版内部的行为,位置在/etc/wsl.conf。几个常用配置:

[user] default=yourname [interop] enabled=true appendWindowsPath=true [boot] systemd=true

第一项设默认登录用户,尤其是用wsl --import迁移过来的发行版,默认会变成 root 登录,一定要在这里改回来。第二项控制能不能在 Linux 里直接调用 Windows 的 exe,比如notepad.exe、explorer.exe,默认开启挺好用。第三项是启用 systemd,让发行版里的服务管理方式和原生 Linux 一致,这个需要比较新的 WSL 版本支持,启用后用systemctl管 nginx、mysql 会很方便。

6.4 把发行版挪到非系统盘

C 盘空间紧张是很多人的痛点,WSL 的虚拟磁盘文件动辄几个 G 甚至几十个 G。迁移的思路是"导出 → 注销 → 导入":

wsl --shutdown wsl --export Ubuntu D:\wsl-backup\ubuntu.tar wsl --unregister Ubuntu wsl --import Ubuntu D:\wsl\ubuntu D:\wsl-backup\ubuntu.tar --version 2

--unregister会删掉原来的发行版,执行前一定要确认 tar 包导出成功,可以用dir看看文件大小对不对。导入完成后,别忘了回到 6.3 节把默认用户改回来,否则你会发现自己变成了 root,之前配的环境变量和别名全都不见了。我踩过这个坑,还以为是配置文件丢了。

顺带一提,如果你需要在 WSL 里访问 Windows 侧的 USB 设备(比如烧录开发板、接调试器),可以了解一下 USB/IP 这套方案对应的 Windows 端转发工具,它能把宿主机的 USB 设备映射进 WSL 2,原理和网络共享设备类似,配置稍微有点绕但能用。

7. 常见问题排查速查表

WSL 2 的报错信息大多很抽象,全是十六进制代码。我把遇到过的整理成一张表,遇到问题先对号入座。

错误代码 / 现象根本原因解决办法
0x8007019e没有启用"适用于 Linux 的 Windows 子系统"回到第 3 章,用 DISM 启用后重启
0x800701bc没装 WSL 2 内核更新包下载安装内核包,再执行wsl --set-default-version 2
0x80370102CPU 虚拟化未开启,或被其他虚拟化软件占用进 BIOS 开启 VT-x / SVM,临时卸载 VMware、VirtualBox
WslRegisterDistribution failed发行版解压在中文路径,或安装包损坏换成纯英文无空格路径,重新解压
wsl命令不存在子系统功能未启用,或系统版本过低检查版本号,重新执行 DISM 启用命令
能进系统但没网DNS 解析异常,或宿主机网络配置冲突查看/etc/resolv.conf,必要时手动指定 DNS 并设置生成策略
时间差了好几个小时WSL 与宿主机时钟同步失败执行wsl --shutdown后重进,或在发行版内执行sudo hwclock -s
修改 .wslconfig 无效只关了窗口,虚拟机没真正停止执行wsl --shutdown,确认wsl -l -v显示已停止

7.1 网络不通的排查顺序

网络问题最磨人。我的排查顺序是固定的:先ping一个公网地址,如果不通,看/etc/resolv.conf里的 DNS 有没有内容;如果文件是空的或者指向了一个奇怪的地址,可以临时手动写一个公共 DNS 进去测试。

cat /etc/resolv.conf sudo sh -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'

如果这样能通,说明是自动生成的配置有问题,可以在.wslconfig或wsl.conf里关掉自动生成,改成固定配置。另外如果你所在的网络环境对出站流量有严格限制,某些端口被挡住也会表现为"能解析但连不上",这时候可以换成 HTTP 端口试试区别对待。

7.2 磁盘空间和权限的小坑

WSL 2 的虚拟磁盘文件是动态增长的,删掉文件之后宿主机上的那个 vhdx 不会自动缩小。跑久了会发现它膨胀到几十个 G。压缩方法是先wsl --shutdown,然后用diskpart挂载 vhdx,执行compact vdisk。这个过程有点繁琐,我一般半年做一次。

还有一个常见问题:在 Windows 里访问 Linux 文件,用\\wsl$\Ubuntu\home\...这个路径,速度尚可;但反过来,在 Linux 里操作/mnt/c/...下的文件会非常慢,因为跨了文件系统。所以我的原则是:项目代码放在 Linux 侧的 home 目录里,需要给 Windows 工具用时再复制出去,别长期在挂载点上做编译。

7.3 几个实操心得

  • 别迷信"一键脚本"。网上有些号称自动配置 WSL 的脚本会顺手改一堆系统设置,出问题后很难回滚。老老实实敲 DISM 命令,每一步的结果你都能看到。
  • 善用wsl --shutdown这个万能钥匙。很多诡异问题——内存不释放、配置不生效、网络抽风、发行版卡死——第一反应都是 shutdown 再重进,能解决八成。
  • 版本信息随手记。wsl --version、wsl -l -v、winver这三个输出,在求助的时候一并贴出来,比描述半天"我装不上"有用得多。
  • 重要数据不要只放在 WSL 里。虚拟磁盘是单文件,一旦损坏,整个发行版很难救。定期wsl --export导出一份 tar 存到别的盘,这是我吃过亏之后雷打不动的习惯。
  • 家庭版不要装 Hyper-V。有人为了装 WSL 2,硬去找 Hyper-V 的安装方法,甚至用一些来路不明的"解锁脚本",把系统搞崩。其实 WSL 2 只需要虚拟机平台这一项,Hyper-V 完全不需要,千万别画蛇添足。

这套流程我在三台家庭中文版的机器上走过,最早那台是 1909,现在是 22H2,从第一次折腾到熟练大概花了一个周末。真正麻烦的从来不是命令本身,而是不知道哪一步该跳过、哪一步不能跳过。按着顺序来,遇到报错先查表再动手,基本不会有走不通的情况。

返回列表