WSL2 安装 Ubuntu 22.04 完整教程:从环境检查到磁盘迁移

发布时间:2026/10/1 17:44:36
WSL2 安装 Ubuntu 22.04 完整教程:从环境检查到磁盘迁移 折腾过 Linux 的人应该都有类似经历手头一台 Windows 10 电脑却要跑 Linux 下的工具链装双系统嫌切换麻烦开个虚拟机又卡得连拖动窗口都掉帧。我前两年就因为频繁在 Windows 和 Ubuntu 之间来回重启实在忍无可忍才认认真真把 WSLWindows Subsystem for Linux这套方案捡起来研究。WSL 说白了就是让 Windows 直接跑一个真正的 Linux 发行版不用额外装虚拟机也省掉了双系统重启的折腾。这篇文章记录的是我在 Windows 10 下启用 WSL 并安装 Ubuntu 22.04 的完整过程从系统检查、功能开启、内核更新到 Ubuntu 22.04 安装、初始化、软件源配置、磁盘迁移再到我踩过的各种报错。适合谁看准备在 Windows 上搭建 Linux 开发环境的学生、前端/后端/运维工程师以及想在 WSL 里跑深度学习但不想放弃 Windows 桌面的朋友。1. 动手前先搞清三件事系统版本、虚拟化和 WSL 版本选择1.1 你的 Windows 10 版本够不够用WSL 2 对 Windows 10 有版本要求这是很多新手一上来就栽跟头的地方。WSL 1 早在 2016 年就随着 Win10 1607 推出了但 WSL 2 因为需要虚拟机平台支持起步门槛是 Windows 10 版本 2004内部版本号 19041或者更高。如果你用的是比较老的 LTSC 或者长期没更新的版本那就得先系统更新再折腾 WSL。最快的检查方式是键盘按 Win R输入 winver回车后会弹出一个关于 Windows 的小窗口里面会写清楚版本号和内部版本号。我见过有人拿 1909 的机器硬着头皮跑 WSL 2结果各种内核报错折腾半天最后还是先升级了系统。虽然 1903/1909 部分版本也能手动支持 WSL 2但体验远不如 2004 之后的流程顺畅我建议直接一步到位升到 Windows 10 22H2官方支持周期也长一些。还有一点容易被忽略WSL 2 依赖硬件虚拟化能力Intel VT-x 或 AMD-V不是所有 CPU 都默认打开了这个开关。你可以在任务管理器的性能标签页里看 CPU 那一栏是否有虚拟化已启用的字样。如果显示已禁用就得进 BIOS 找 Intel Virtualization Technology / SVM Mode 之类的选项把它打开这一步不做后面 100% 会报错。1.2 检查虚拟化是否可用上面说的虚拟化开关是 WSL 2 的硬性条件。因为 WSL 2 本质上是微软把 Hyper-V 的轻量化虚拟机技术拿过来给 Linux 子系统用底层的 VM 组件一旦发现硬件虚拟化没开就会直接罢工。如果你不想进 BIOS也可以先用命令看一眼当前系统状态。管理员身份打开命令提示符或 PowerShell执行 systeminfo拉到靠后的位置会有一行Hyper-V 要求里面有四个项目VM 监视器模式扩展、虚拟化固件中已启用虚拟化、二级地址转换、数据执行保护。只要这四个里有一个显示否基本可以断定是 BIOS 层面没开或者是旧 CPU 不支持就得开机进 BIOS 处理了。我踩过一次比较隐蔽的坑电脑是 AMD 平台BIOS 里叫 SVM Mode默认就是禁用状态。Intel 平台叫 VT-x 或者 VT-d名字五花八门。所以建议动手前先系统性地把这一项确认好否则后面所有安装步骤看着都没问题但一启动 Ubuntu 就报 0x80370114非常磨人。1.3 WSL 1 和 WSL 2选哪个更合适WSL 1 和 WSL 2 到底差在哪简单说WSL 1 是把 Linux 系统调用翻译成 Windows 内核调用的一层翻译器没有完整的 Linux 内核所以启动快、文件性能好但兼容性差很多 Linux 软件跑不起来。WSL 2 则是一个真正的轻量级虚拟机里面运行着完整的 Linux 内核兼容性大幅提升Docker、PyTorch、CUDA 这些常年不兼容 Windows 的东西都能跑。代价是 WSL 2 会占用更多内存而且跨文件系统的读写性能要比 WSL 1 慢不少。如果你只是想在 Windows 里敲几个 Linux 命令、编译点小程序WSL 1 也行但如果要跑 Docker、做后端开发、装机器学习框架WSL 2 几乎是必选。我的建议很直接没有特殊理由统一选 WSL 2 就行。微软把 WSL 2 设置成默认版本已经很久了后续生态也基本围绕 WSL 2 展开。2. 一步步行 I启用 WSL 功能与更新内核2.1 以管理员身份打开 PowerShell接下来是实际操作环节。WSL 需要给 Windows 修改系统功能所以终端必须用管理员身份运行。我的习惯是直接在开始菜单搜索PowerShell右键选择以管理员身份运行顺手把终端标到任务栏上后面重启完还要用。这里有个细节系统里可能有 Windows PowerShell 和 Windows Terminal 两套东西。你只需要确保打开窗口的标题栏显示管理员字样即可。后面的操作在命令提示符里也一样但 PowerShell 对命令的兼容性更好统一在 PowerShell 里跑比较省心。2.2 启用两个关键 Windows 功能启用 WSL 需要打开两个系统功能一个是“适用于 Linux 的 Windows 子系统”另一个是“虚拟机平台”。你也可以走图形界面控制面板 - 程序和功能 - 启用或关闭 Windows 功能勾选这两个选项后重启。但既然是写给爱敲命令的人看的我直接用 dism 命令解决。在管理员 PowerShell 里按顺序执行下面两条命令dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart/norestart 参数的意思是不立即重启两条命令都跑完以后再手动重启。如果只开了其中一个就急着安装后面启动发行版时很容易碰到未启用虚拟机平台的错误。另外如果系统更新策略比较特殊也可以去控制面板勾选功能效果一样没有谁更好一说。重启完成之后可以先验证一下功能有没有生效。打开 PowerShell 执行wsl --status或wsl --version如果提示的是适用于 Linux 的 Windows 子系统没有已安装的分发版这类信息说明 WSL 本身已经就绪只差装发行版了。如果提示没有这个命令功能可能没有正常启用重新执行一次 dism 命令再重启。2.3 安装 WSL2 内核更新包这一步是许多新手会忽略的。WSL 2 和 WSL 1 不一样它需要一个额外的内核更新包这个包不会因为启用了功能就自动出现。微软官方提供名为 wsl_update_x64.msi 的安装文件去官网搜索 WSL2 Linux 内核更新包下载对应版本x64 机器就下 x64后双击安装即可。安装过程非常快本质就是把一个 Linux 内核放到 Windows 的固定位置。装完之后建议再执行一次wsl --set-default-version 2把默认的 WSL 版本锁定在 2。这个命令输出的提示我们选择 2。这个命令坑点也很多如果你只装了 WSL 1却在某一步执行了--set-default-version 2随后安装的发行版默认全跑 WSL 2但如果发行版已经装好想从 WSL 1 切换到 WSL 2需要单独用wsl --set-version 发行版名 2来转换。这个过程会重新生成一个 WSL 2 虚拟机耗时比想象中长而且会占用额外的磁盘空间。2.4 设置默认 WSL 版本执行wsl --set-default-version 2后系统会记住以后新装的发行版都默认使用 WSL 2。这一步强烈建议做因为默认情况下部分 Windows 10 版本可能把 WSL 1 作为默认加载模式装完才发现跑的环境不对又要手动转版本纯属给自己找麻烦。设置完成后可以顺手跑一下wsl --list --verbose或者wsl -l -v查看发行版状态和版本。虽然此时列表还是空的但至少要确保命令不报错。如果wsl --set-default-version 2报错说需要虚拟机平台说明第二步功能没启用全回炉重造。3. 安装 Ubuntu 22.04 并完成首启动配置3.1 从 Microsoft Store 安装完成前面的准备工作后安装 Ubuntu 22.04 就简单了。最省事的方式是通过微软商店安装打开 Microsoft Store搜索 Ubuntu 22.04找到由 Canonical 发布的那个应用安装即可。商店里会同时出现 Ubuntu 22.04.2 LTS 或 Ubuntu 22.04.3 LTS 之类的版本选最新小版本没问题它们都属于 22.04 LTS 系列。如果你不喜欢商店或者商店本身打不开还有命令安装的方式。在管理员 PowerShell 里执行wsl --install -d Ubuntu-22.04这条命令会自动完成下载和安装。注意wsl --install这个子命令在较新的 Windows 10 上才支持如果你的系统版本较旧就老实走微软商店路线。安装结束后会在开始菜单里出现一个 Ubuntu 22.04.xx LTS 的图标第一次点击启动它会进入初始化流程。这个初始化比想象中慢因为要解压整个根文件系统期间终端会显示一行 Installing, this may take a few minutes...耐心等就行不用反复点别的按钮。3.2 首次启动创建用户名和密码初始化完成后Ubuntu 会提示你创建一个 UNIX 用户名和密码。这里有个很多人的认知误区Linux 的传统是不推荐直接用 root 用户日常操作Ubuntu 默认也禁用了 root 登录所以这里创建的是普通用户但这个用户默认在 sudo 组里可以随时随地提权。用户名建议用小写字母不要带空格和特殊符号比如 john、dev 这种。密码输入时屏幕不会有任何反馈这是正常的不要以为自己键盘失灵了。设置完成后可以立刻验证一下先执行sudo whoami输入密码后应该输出 root再执行pwd确认当前目录是自己的 home 目录。这套流程跑通说明 Ubuntu 22.04 已经能正常工作了。我第一次装完就习惯性地先跑了apt update结果发现 /etc/apt/sources.list.d/ubuntu.sources 是 22.04 的新格式源文件跟以前老的 sources.list 不一样。这个细节我放在后面专门讲先别急。3.3 初始化更新软件包列表和安装基础工具Ubuntu 刚装完的面貌非常素没有 GCC、没有 Make、没有 Git甚至没有 curl。这是因为 Ubuntu 默认镜像只带最基础的系统工具一切开发环境都需要自己装。首启动后我建议立刻执行sudo apt update sudo apt upgrade -yapt update 负责拉取软件源索引apt upgrade 会把系统已有的软件包升级到当前源里的最新版本。第一次执行耗时一般比较久取决于网络速度。升级完成后顺手安装一批开发基础包sudo apt install -y build-essential git curl wget net-tools htop unzip zipbuild-essential 里包含 gcc、g、make 等编译工具链net-tools 提供 ifconfig 等命令htop 用于查看进程和内存占用。这套组合是我在 WSL 环境里折腾过很多次后固定下来的基础包后续无论做 C/C 开发、Python 环境、还是容器相关的事情都用得上。到这里一个能用的 Ubuntu 22.04 已经有了。但距离顺手还差得远接下来才是把 WSL 调教成日常开发环境的关键部分。4. 把 Ubuntu 22.04 调教成日用开发环境4.1 换软件源一条命令的事但要小心新格式Ubuntu 默认的软件源服务器在境外国内访问速度往往不稳定。这不是什么秘密也不需要额外解释反正我用默认源执行 apt update 时经常卡在几百 KB 每秒的速度换成境内镜像源之后直接跑满带宽体验立竿见影。这里要特别提醒Ubuntu 22.04 默认的软件源配置格式和以前不一样了。老版本的 Ubuntu 把源写在/etc/apt/sources.list里22.04 默认使用新的 deb822 格式源文件改成了/etc/apt/sources.list.d/ubuntu.sources。很多人照着网上教程直接sed -i替换/etc/apt/sources.list执行完一点反应都没有就是因为改错文件了。在动源之前先备份sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak然后执行替换镜像地址。我用的是阿里云镜像源命令如下sudo sed -i s//archive.ubuntu.com//mirrors.aliyun.comg; s//security.ubuntu.com//mirrors.aliyun.comg /etc/apt/sources.list.d/ubuntu.sources保留一份备份文件是多年 Linux 操作养成的习惯改坏了随时能还原成本极低。替换完执行sudo apt update只要没有报错基本就成功了。4.2 安装开发工具链shell、编辑器与服务基础工具装完以后还有一个高频操作是把默认的 bash 换成 zsh配合 Oh My Zsh 使用。这个属于个人偏好但坦白说用顺手以后很难回到原始 bash。安装命令也不复杂sudo apt install -y zsh sh -c $(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)如果安装 zsh 的脚本网络不理想也可以先装好 zsh手动配一个简单的 .zshrc再慢慢加插件。我个人实际使用中并没有在这上面花太多心思默认的 zsh 主题加几条 alias 就够了。真正提升效率的反而是 VSCode 的集成方式下面单独说。此外如果你做 Web 开发或运维MySQL、Redis、Nginx 这些服务在 WSL 里跑起来异常顺畅比在 Windows 上装原生版省心太多。比如安装 MySQL 8.0直接sudo apt install -y mysql-server sudo service mysql startWSL 2 下 Ubuntu 22.04 的 systemd 默认是关闭的这也是一个容易困惑的点后面会专门提一句怎么开启。总之任何 Linux 上的开发工具链在 WSL 里基本能原样跑。4.3 集成 VSCode在 WSL 里敲代码的丝滑体验在 Windows 上装 VSCode再在 WSL 终端里执行code .VSCode 会自动打开并连接 WSL 环境。这个功能依赖微软官方的 WSL 扩展Remote - WSL。装好扩展之后你在 VSCode 的集成终端里输入命令、运行调试器、访问 Linux 文件系统感觉就像在 Linux 本机上开发没有任何隔阂。这套方案比在 WSL 里装 Linux 版 VSCode 更合理因为 VSCode 的图形界面跑在 Windows 侧渲染性能更好而你的代码、解释器、Git、编译器等全部在 WSL 侧跟团队协同时候的 Linux 环境完全一致。对比一下之前我在 Windows 上写 Python 脚本因为 Windows 和 Linux 的路径分隔符、依赖库版本经常不一致代码跑到服务器上各种炸。切到 VSCode WSL 之后本地环境约等于线上环境这类问题基本消失了。如果你需要做 Web 全栈或者云原生还可以在这个环境里直接跑 Docker。Docker Desktop 支持 WSL 2 后端安装后 WSL 里的 docker 命令直接可用容器跑的也是真正的 Linux 内核。4.4 图形程序怎么跑Windows 10 的方案WSL 的优势不局限在命令行。如果你在 Ubuntu 里写代码用到了图形界面比如 OpenCV 的 GUI、Matplotlib 的绘图窗口在 Windows 11 上开箱即用 WSLg但在 Windows 10 上WSLg 并不默认可用需要借助 X Server 软件来转发图形显示。Windows 10 下比较常见的做法是安装 VcXsrv 或 X410。安装 VcXsrv 后启动再在 WSL 里设置 DISPLAY 环境变量图形程序就能弹到 Windows 桌面上。这个方案我不想写太细因为不同版本的 WSL 和 Windows 组合DISPLAY 的 IP 地址设置会有点差异而且配置失败率不低。如果你主要是做后端开发或者训练脚本图形界面需求不强可以先不折腾这块等确实需要 GUI 时再针对性解决。5. 磁盘与资源配置把 WSL 2 装到 D 盘5.1 为什么默认装在 C 盘会让你崩溃WSL 2 发行版的根文件系统默认存放在 C 盘的用户目录下具体路径大概是C:\Users\你的用户名\AppData\Local\Packages\...。这个设计对大多数人没问题但对那些 C 盘本来就紧张的人来说问题立刻暴露。WSL 2 的虚拟磁盘文件ext4.vhdx会随着系统使用不断膨胀。一开始只有几个 GB等你装了 Python 环境、Node、Docker 镜像、CUDA 工具链之后二三十 GB 轻轻松松。我见过最夸张的情况是有人 C 盘只剩几 GB跑个 apt upgrade 直接磁盘写满整个发行版处于半瘫痪状态。所以如果 C 盘空间比较紧张强烈建议从一开始就把发行版迁到 D 盘C 盘富余的朋友也可以先跳过这段等用出感情了再迁也行。5.2 把发行版迁移到 D 盘的完整流程迁移 WSL 2 发行版到 D 盘官方推荐的是导出 注销 导入三部曲。整个过程不复杂但千万注意注销发行版会删除当前发行版的所有数据务必先导出备份。第一步在 PowerShell 导出当前发行版为一个 tar 文件wsl --export Ubuntu-22.04 D:\WSL\backup\ubuntu-22.04.tar记下来这个 tar 文件路径它是整个发行版的完整快照。第二步注销原来的发行版wsl --unregister Ubuntu-22.04注销完成后原来 C 盘里的虚拟磁盘就会被删除空间立刻释放回来。第三步在 D 盘新建一个目录并把 tar 文件重新导入进去mkdir D:\WSL\Ubuntu2204 wsl --import Ubuntu-22.04 D:\WSL\Ubuntu2204 D:\WSL\backup\ubuntu-22.04.tar --version 2导入完成后通过wsl -l -v可以看到 Ubuntu-22.04 还叫这个名字但它的物理文件已经在 D 盘了。到这里一步就遇到了一个经典问题导入后的默认用户变成了 root而不是你原来创建的那个普通用户。解决办法是在 WSL 里编辑/etc/wsl.conf[user] default你的用户名把你的用户名替换成实际用户名保存后执行wsl --shutdown重启 WSL再进入就是普通用户了。如果你嫌自己记不住用户名也可以用wsl -d Ubuntu-22.04 -u 你的用户名先进入用户环境再把 wsl.conf 改好。5.3 用 .wslconfig 限制内存和 CPUWSL 2 默认会占用 Windows 大量的内存和 CPU 资源毕竟它本质是一个虚拟机。默认配置下WSL 2 最多可以占用本机总内存的 50% 或 8GB取较小值这个比例对很多人来说太大了。尤其你只是在 WSL 里写写脚本Windows 后台还跑着浏览器、IDEA、微信资源很容易被吃掉一大半。解决办法是在 Windows 用户目录下新建一个.wslconfig文件写入资源限制配置。文件的完整路径是C:\Users\你的用户名\.wslconfig记事本打开输入[wsl2] memory4GB processors4 swap2GB localhostForwardingtrue这里 memory 限制 WSL 2 最大内存processors 限制 CPU 核数swap 是交换分区大小localhostForwarding 保持默认 true 即可它保证 Windows 浏览器直接访问 WSL 里的服务端口。改完配置后必须执行一次wsl --shutdown让配置生效。这个文件是全局配置对所有 WSL 2 发行版生效。我推荐先按 4GB 内存、4 核来设置后期如果跑深度学习或大项目再放宽。内存限制不意味着 WSL 里的程序不能超过 4GB而是超过后会开始用 swap相当于一个缓冲不会把 Windows 本体卡死。6. 高频报错与排障实录6.1 启动报错 0x8007019eWSL2 内核没装这个错误我印象极深因为它出现在看起来一切正常但就是进不去系统的时候。具体表现是启动 Ubuntu 时弹出一段英文错误后面跟着 0x8007019e。这个错误码的含义非常明确WSL 2 内核更新包没有安装。解决办法也很直接回到前面 2.3 节提到的去微软官网下载 wsl_update_x64.msi 并安装重启 WSL 后问题就消失了。如果你忘了自己的系统是 x64 还是 ARM64可以先在 PowerShell 里跑$env:PROCESSOR_ARCHITECTURE确认一下别下载错了架构。6.2 报错 wsl/installdistro/service/registerdistro/createvm/hcs 类错误底层组件问题网上经常看到这类路径比较长的错误核心围绕 createvm、hcs 这些关键词。它通常说明 Windows 的虚拟化底层服务Hyper-V Host Compute Service出了问题或者虚拟化功能没有完整开启。排查步骤如下先在 PowerShell管理员里执行net stop vmcompute然后net start vmcompute重启这个服务。如果还是报错检查自己是否真的启用了虚拟机平台功能BIOS 里的虚拟化开关是否打开。还有一个容易忽略的点是在 Windows 10 上启用 WSL 2 需要 Hyper-V 相关组件但部分品牌机的内核隔离或基于虚拟化的安全VBS策略会和 WSL 2 冲突可以尝试关闭 Windows 安全中心里的内核隔离功能再试。如果问题仍然存在执行两段修复命令sfc /scannow DISM.exe /Online /Cleanup-Image /RestoreHealthsfc /scannow扫描系统文件完整性DISM 修复系统映像组件。这两条命令在 Windows 遇到各种疑难杂症时都很值得优先执行虽然耗时可能十几分钟但真能解决不少隐藏问题。6.3 系统更新错误 0x8000ffff 与组件存储损坏0x8000ffff 代表的含义比较宽泛常见于 Windows Update 或应用商店相关操作。我第一次遇到是在商店里搜索安装 Ubuntu 时商店一直弹错误提示就是 0x8000ffff。当时我以为是商店挂了后来发现商店组件状态有问题。解决办法是执行wsreset.exe重置商店缓存再用管理员 PowerShell 跑sfc /scannow和 DISM 修复。如果这些都救不了还可以尝试把 Windows 更新组件相关服务重启一遍。说实话这种错误在 Windows 10 上偶尔会遇到心态放平先按通用修复流程走大概率能解决。6.4 apt 命令权限与 sudoers 问题Ubuntu 里用 apt 安装软件必须加上 sudo 前缀否则会提示权限不足。这个是好习惯也是安全设计的一部分。但也有一种情况你用了 WSL 发行版导入的方式默认用户变成了 root之后执行sudo反而提示user is not in the sudoers file因为 root 用户不需要 sudo。解决办法是用发行版的 Windows 可执行文件设置默认用户例如在 PowerShell 中执行ubuntu2204.exe config --default-user 你的用户名或者通过 WSL 命令以 root 身份进入修改/etc/sudoers或在/etc/sudoers.d/下新建文件把用户加进 sudo 组。我自己推荐后者因为更接近 Linux 原生操作习惯。6.5 误删或注销后重新注册发行版如果你在迁移过程中不小心执行了wsl --unregister那系统提示的磁盘空间已释放不是开玩笑的C 盘里的整个发行版都会被清掉。如果你没有提前导出备份这个操作没法撤销唯一的安慰是用户自己的个人文件在/mnt/c那边可以保留但 Linux 环境里的配置、已安装软件、数据库内容全部丢失。所以迁移 D 盘的完整流程里我反复强调导出备份这一步。如果你还保留了 tar 备份重新导入即可恢复原本的环境如果没有只能重新走一遍商店安装流程。我个人的习惯是每次大版本升级、迁移、清理前都先wsl --export一份存到 D 盘备份目录文件名带日期比如ubuntu-22.04-2024-xx-xx.tar。这个习惯救过我至少两次成本才几十秒收益却很大。最后再分享一点实操心得用 WSL 2 这段时间我最大的感受是它终于把 Windows 和 Linux 两套生态的割裂感消解得差不多了。日常开发里我不用再为Windows 上没有 Linux 命令而抓狂也不用为了一个 binwalk 工具就去装虚拟机。包管理、文件系统、终端体验这些细节WSL 2 都已经能提供足够好的替代方案。如果你准备往下走我建议继续研究三个方面第一个是 systemd 的启用WSL 2 较新版本已经支持在/etc/wsl.conf里配置systemdtrue让服务管理逻辑跟原生 Ubuntu 完全一致第二个是 Docker 的后端集成Docker Desktop 搭配 WSL 2 后容器化开发会顺畅很多第三个是机器学习方向NVIDIA 显卡配合 WSL 2 跑 CUDA 已经有很成熟的方案Windows 下做深度学习训练不再像过去那么折腾了。WSL 这套东西看着简单实际上踩着坑跑通以后工作效率的提升是实实在在的。