WSL2离线安装实战:从Windows功能到发行版部署的完整指南
WSL2 算是 Windows 上跑 Linux 最顺手的方案了没有虚拟机的开销也不需要双系统来回切换。但真正动手装的时候环境往往没想象中那么理想。我在企业内网环境接过不少离线安装 WSL2 的请求——开发机不连外网或者终端机器在隔离网段微软商店根本打不开更别说在线拉 Ubuntu 镜像了。这篇文章就把我踩过的坑、试过的招都梳理一遍从启用 Windows 功能、拿到离线安装包、装好后的网络和存储调优到最常见的报错排查整个流程串起来讲清楚。适合需要在断网、半断网或者受管控 Windows 环境里部署 WSL2 的运维和开发者参考。1. 先理清思路WSL2 离线安装到底在装什么很多人一上来就找安装包结果装到一半发现缺这个缺那个其实就是没搞明白 WSL2 的组成结构。离线安装最忌讳的就是东拼西凑先把整体框架讲清楚后面每一步才有依据。1.1 为什么 WSL2 值得离线折腾WSL2 和第一代 WSL 最大的区别是换成了真正的 Linux 内核。WSL1 靠的是 Windows 内核的翻译层模拟 Linux 系统调用兼容性看着还行但碰到 Docker、CUDA 这类对系统调用特别敏感的东西就露馅了。WSL2 干脆用虚拟化技术跑一个完整的轻量级虚拟机里面就是原汁原味的 Linux 内核所以绝大多数 Linux 软件都能直接跑不会再有“明明在 Linux 环境里却装什么都要编译半天”的尴尬。离线环境恰恰更需要 WSL2。我之前接手过一个研发网项目开发机全部在内网隔离区没有外网权限但团队又想把开发环境统一到 Linux 上。双系统不现实虚拟机又太重最后方案就是离线装好 WSL2再把依赖的软件包一次性拷进去。这个套路跑通之后几十台机器全部复用同一个镜像效率比在线一台台配置高得多。1.2 离线安装 WSL2 的三大部分WSL2 的安装不是下载一个文件就完事的它实际上由三个独立但必须组合的部分组成第一部分是 Windows 功能层。WSL2 依赖两个 Windows 功能“适用于 Linux 的 Windows 子系统”和“虚拟机平台”。前者是 WSL 的基础功能后者是 WSL2 跑虚拟机的支撑。这两个功能没启用后面装什么都是白搭。在离线机器上这两个功能可以通过 DISM 命令离线启用不依赖外网。第二部分是 WSL 运行时本身。包括 wsl.exe 命令行工具和 WSL2 使用的 Linux 内核。微软在较新的 WSL 版本里把运行时拆成了独立组件可以通过 MSI 或 ZIP 包离线升级。这就是为什么有时候报错“WSL 内核版本太旧”时直接在联网机器上下个内核安装包拷过去就能解决。第三部分是 Linux 发行版。也就是你实际使用的 Ubuntu、Debian、Kali 等系统镜像在 Windows 上表现为 .appx 或 .msixbundle 格式的安装包。这部分对离线安装来说是最容易出问题的因为很多人以为只能从微软商店下载其实微软提供了官方的离线直链后面我会详细说。搞清楚这三个层次之后离线安装的思路就清晰了先启用 Windows 功能再准备 WSL 运行时最后安装发行版镜像。一步都不能跳也不能只装其中一部分就跑去开终端。2. 环境准备硬件和 Windows 功能层这个环节最容易翻车但也是步骤最固定的。按顺序走基本十分钟内能搞定。2.1 先确认机器能不能跑虚拟化WSL2 必须在虚拟化开启的情况下才能运行。我最怕遇到的情况就是用户装了半天最后卡在“无法启动因为此计算机上未启用虚拟化”的报错上。其实这个报错在安装前就能提前发现。最简单的确认方法打开 Windows 自带的“任务管理器”切到“性能”选项卡点击“CPU”看右下角“虚拟化”这一行。显示“已启用”说明硬件虚拟化功能正常显示“已禁用”就需要进 BIOS/UEFI 设置里开启一般是找 Intel Virtualization TechnologyVT-x或 AMD SVM Mode 这类选项不同主板叫法不太一样改完保存重启就行。还有一个需要注意的场景是虚拟机里跑 Windows 再装 WSL2。这种情况下虚拟化是否可用取决于宿主机是否开启了“嵌套虚拟化”。以 Hyper-V 为例需要在宿主机上对对应虚拟机执行Set-VMProcessor -VMName 你的虚拟机名字 -ExposeVirtualizationExtensions $true这条 PowerShell 命令然后再重启虚拟机。VMware 和 VirtualBox 里也有类似的嵌套虚拟化选项不打开的话里面就算显示支持也跑不了 WSL2。2.2 通过 DISM 开启两个关键功能确认虚拟化没问题之后接下来就是启用 WSL2 依赖的 Windows 功能。图形界面操作路径是“控制面板 - 程序和功能 - 启用或关闭 Windows 功能”然后勾选“适用于 Linux 的 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是暂时不重启两个功能一起启用完再统一重启省得来回折腾。如果之前机器上从来没开过 Hyper-V 或虚拟机平台执行完第一条命令可能会提示“操作成功完成但重启计算机之前这些更改不会生效”这是正常的说明功能已经加入系统等重启就会真正激活。另外如果你的 Windows 版本比较老比如 Windows 10 1903 或更早DISM 命令可能不认识VirtualMachinePlatform这个功能名那就得先更新系统或者直接升级到 1909 以上的版本。微软官方要求是 Windows 10 2004 及以上版本才比较好地支持 WSL2我实际测试下来1909 勉强能用但问题比较多能升级就升级。全部执行完之后重启电脑。这一步别省我之前偷懒不重启直接往下装结果 WSL 提示功能不可用白白排查了一个多小时。3. 离线拿到发行版安装包Ubuntu 的几种姿势Windows 功能启用并重启之后就到了最核心的环节——离线安装 Linux 发行版。这个环节水最深也是大家问得最多的。3.1 官方离线下发页面的用法微软其实提供了一个专门的手动安装页面不需要打开微软商店直接就能下载各发行版的离线安装包。在联网的电脑上访问微软官方文档中 WSL 的手动安装说明里面列出了 Ubuntu、openSUSE、Kali 等几个发行版的直链点击下载得到的就是.appx或.msixbundle后缀的文件。这个页面解决了一大半问题因为很多人以为离线安装就得去别人机器上抠文件其实官方一直在维护这个备用渠道。要注意的是页面里的链接会随着版本更新变化下载时看一眼文件名里的版本号优先选最新的 LTS 版本比如 Ubuntu 22.04。我一般习惯直接把文件重命名成容易记住的名字比如Ubuntu.appx后续命令写起来省事。下载好之后把这个 appx 文件拷贝到离线机器上放在一个纯英文路径下比如D:\wsl\packages\。路径里别带中文后面命令行操作会少很多麻烦。3.2 Add-AppxPackage 安装与依赖问题拿到安装包后安装命令非常简单。在离线机器上管理员身份打开 PowerShell进入安装包所在目录执行Add-AppxPackage .\Ubuntu.appx顺利的话等进度条跑完就装好了。但离线的机器往往没那么顺利最常见的报错是提示缺少“Windows 应用程序运行时”之类的依赖尤其是Microsoft.VCLibs这个框架包。这个包在联网机器上会自动从商店拉取离线环境就得手动准备。解决办法是提前在联网机器上下载对应架构的 VCLibs 包同样拷过来先执行Add-AppxPackage .\Microsoft.VCLibs.x64.14.00.Desktop.appx之后再装 Ubuntu 就不会报依赖缺失了。这个细节特别容易忽略我第一次离线装的时候就卡在这一步当时还以为是 Windows 版本太老导致的排查了半天才发现是缺依赖。另外如果你拿到的是.msixbundle后缀的包直接 Add 可能会提示无法安装。网上有个技巧是把它改名成.zip解压后从里面找到真正的.appx文件再安装。这个方法我实测过可行。3.3 不依赖商店的另类姿势免安装解压法除了正式的安装方式还有一种非常适合批量部署的免安装姿势——直接从已经装好 WSL2 的机器上拷贝发行版的完整目录。具体做法是找到那台机器上 Ubuntu 的安装目录一般位于%LOCALAPPDATA%\Packages\下面文件夹名字类似CanonicalGroupLimited.Ubuntu22.04LTS_xxx把这个文件夹整个拷到目标机器的相同位置。然后再把开始菜单里的启动入口Ubuntu.exe手动创建个快捷方式或者直接进入目录运行ubuntu.exe完成初始化和默认用户设置。这种方式的好处是不需要执行 Add-AppxPackage也不用处理 VCLibs 依赖因为运行时文件全是现成的。但前提是两台机器的 Windows 版本和 WSL 运行时版本不能差太远否则可能出现内核模块不匹配的兼容问题。我一般只在批量部署同版本 Windows 的机器时用这招省去每台机器下载安装包的麻烦。4. 装完第一件事网络与存储调优发行版装好第一次启动会让你设置用户名和密码这一步完成后 WSL2 就能正常使用了。但还没到松口气的时候离线环境里有两个问题几乎必定会碰到网络不通和磁盘跑满。这两个问题不解决WSL2 用起来会非常难受。4.1 用 .wslconfig 限制内存和 CPUWSL2 默认会吃掉物理内存的一半左右作为虚拟机内存这个设计在配置高的机器上无所谓但 8GB 内存的老机器就有点吃不消了。解决办法是在 Windows 用户目录下创建一个.wslconfig文件专门用来限制 WSL2 的资源占用。用记事本新建文件填入以下内容保存到C:\Users\你的用户名\.wslconfig[wsl2] memory4GB processors4 swap2GB参数含义很简单memory是最大内存processors是最大 CPU 核数swap是交换分区大小。没有这个文件时WSL2 采用默认策略——内存取物理内存的 50% 或 8GB 中的较小值CPU 则基本不限制。对于只想跑开发环境的场景限制在 4GB 内存、4 核基本够用还能给 Windows 留足资源。修改完.wslconfig之后需要执行wsl --shutdown让所有发行版停止运行再重新进入 WSL 才能生效。这个文件只对 WSL2 有效WSL1 不受它管理。4.2 把发行版迁移到非系统盘WSL2 的发行版默认安装在 C 盘而且虚拟磁盘文件ext4.vhdx会随着使用越来越大装几个 Linux 软件、跑几次编译十几 GB 就出去了。C 盘空间紧张的话建议装完立刻迁移到其他磁盘。迁移最稳妥的方式是用 WSL 自带的导出导入功能。假设当前发行版叫Ubuntu先执行wsl --export Ubuntu D:\wsl\backup\ubuntu.tar这个过程会把整个文件系统打包成一个 tar 文件大小取决于当前使用情况。导出完成后注销原来的发行版wsl --unregister Ubuntu注意--unregister会删除这个发行版的所有数据和配置所以一定要确保上一步导出成功。然后重新导入到新位置wsl --import Ubuntu D:\wsl\distro\ubuntu D:\wsl\backup\ubuntu.tar --version 2第二个参数是新发行版的安装目录第三个参数是刚才导出的 tar 文件路径。--version 2是明确指定用 WSL2。导入完成后进去 WSL可能会发现默认用户变成了 root这是因为导出导入过程中的用户配置没有自动带上。解决方法是在导入后的 WSL 里编辑/etc/wsl.conf加入[user] default你的用户名保存后执行wsl --shutdown再重进就会恢复原来的普通用户环境了。4.3 网络模式选择NAT 还是镜像WSL2 默认采用 NAT 网络模式相当于 Windows 主机给 WSL2 分配了一个内部 IP。这种模式下WSL 里访问外网没问题但从局域网其他机器访问 WSL 里的服务就特别麻烦因为它的 IP 不在局域网网段。比如我在 WSL 里跑了个 Web 服务想拿手机测试默认设置下基本没戏。解决方法是改用镜像网络模式。在.wslconfig文件的[wsl2]节点下加入一行networkingModemirrored镜像模式下WSL2 会直接共享 Windows 主机的网络接口和 IP局域网里的设备能直接访问 WSL 里跑的服务WSL 里也能访问 Windows 局域网里的其他设备网络就通了。这个模式需要 WSL 版本在 2.0 以上如果之前没有手动升级过 WSL可以先在联网机器上把 WSL 最新的 MSI 包下载下来离线安装再启用镜像模式。还要提一嘴 DNS 问题。NAT 模式下偶尔会遇到“能 ping 通 IP但域名解析失败”的情况这是 WSL 的 DNS 配置和 Windows 不一致导致的。在 WSL 里查看/etc/resolv.conf如果里面的 nameserver 还停留在老的内网地址可以手动改成 Windows 主机的 DNS 地址或者干脆启用镜像模式让网络配置彻底统一。5. 离线环境下的常见报错与排查速查这一节是实用性最强的部分。我按真实验到过的频率把问题排了个序每个问题都给出排查路径和解决手段。5.1 “虚拟化未启用”的三种可能性开头提过的WslRegisterDistribution failed with error: 0x80370114也就是“请确保计算机固件设置中虚拟机平台已启用”这类报错我总结下来只有三种原因第一种是 BIOS 里真的没开虚拟化而且任务管理器里也明确显示“已禁用”。这个只能进 BIOS 设置没有别的办法。第二种是开了 Hyper-V但没启用“虚拟机平台”这个 Windows 功能。排查方式是执行systeminfo命令看 Hyper-V 要求那一栏里四项要求是否都显示“已检测到”。如果“虚拟机监控程序”那项显示“已检测到”但“虚拟机平台”相关的功能缺失就用前面提到的 DISM 命令把VirtualMachinePlatform补上。第三种是在虚拟机里跑 WSL2宿主机没开嵌套虚拟化。这种情况任务管理器里显示的虚拟化状态可能是“已启用”但 WSL2 还是起不来原因就是虚拟机没有把硬件虚拟化指令透传给内部系统。解决方法是回到宿主机虚拟机管理软件开启嵌套虚拟化选项然后重启虚拟机。5.2 发行版安装失败或启动即崩Add-AppxPackage装完 Ubuntu 后第一次启动时提示“占位程序包错误”或者直接弹窗说找不到应用这个问题很常见。排查顺序是先运行Get-AppxPackage *Ubuntu*查看软件包状态如果是“Staged”而不是“Installed”说明安装没走完。手动再执行一次Add-AppxPackage试试不行就先把所有 Ubuntu 相关包卸载干净再重装。另一种情况是启动 Ubuntu 时窗口闪一下就消失没有任何报错。这种大概率是 WSL 运行时版本和发行版不兼容或者 WSL 内核文件损坏。处理方法是先wsl --shutdown再wsl --update如果离线环境没有外网就手动安装最新版的 WSL MSI 包。5.3 WSL 内网络能通但 DNS 解析慢这个现象很烦在 WSL 里执行ping 223.5.5.5正常但ping google.com就要卡好几秒。原因是 WSL2 默认会把 Windows 的 DNS 配置同步到虚拟网卡上但离线内网环境里 Windows 主机的 DNS 可能指向的是某些特殊地址WSL 里的解析就走歪了。最简单的解决方法是编辑/etc/wsl.conf在[network]节点下设置generateResolvConf false然后手动写死/etc/resolv.conf里的 nameserver改成 Windows 主机的实际 DNS 地址或者内网 DNS。改完执行wsl --shutdown重进就生效了。5.4 WSL 本身版本太旧离线怎么升级很多功能比如镜像网络模式、systemd 支持都需要新版 WSL 运行时。离线机器执行wsl --update会一直卡住因为没法访问在线源。解决办法是在联网机器上访问 WSL 的官方 GitHub Release 页面下载.msi安装包或者便携版.zip包拷到离线机器后执行msiexec /i wsl.x.x.x.x64.msi静默安装即可。如果下载的是.zip便携版可以解压后把整个文件夹拷到C:\Program Files\WSL然后把这个路径加入系统 PATH 环境变量执行wsl --version确认版本号已经是新的。6. 离线装完 WSL2 之后怎么办开发环境延伸很多人装完 WSL2 以为万事大吉结果一进系统发现 apt、pip、npm 全都用不了因为默认源都在外网。离线环境里跑通开发环境才是这整套部署真正落地的关键。6.1 从离线软件仓库拿依赖包离线环境下 Linux 软件安装有两个思路。一个是提前在联网机器上把需要的.deb包全部下载好拷进去之后用dpkg -i挨个装或者用apt install ./*.deb批量装。另一个思路是配置一个内网源把 Ubuntu 软件仓库同步到内网服务器然后把/etc/apt/sources.list里的地址全部改成内网镜像地址。对于小规模部署我一般用第一种思路简单直接。在联网机器上可以先apt update然后apt download 包名下载单个包依赖多的话用apt-get install --download-only先把所有依赖都缓存下来一起拷进去。这样在离线机器上只需要一条指令就能装完一堆包。Python 环境也是类似玩法。在联网机器上用pip download -r requirements.txt -d D:\pypackages把依赖包和所有传递依赖都下成 wheel 文件拷进 WSL 后执行pip install --no-index --find-links/path/to/pypackages -r requirements.txt整个过程零网络依赖。Node 项目用npm pack或者私有 npm registry 的方式处理思路都一样。6.2 在 WSL2 里跑 GUI 程序和桌面环境离线环境有时候还需要图形界面。WSL2 本身支持 WSLg也就是 Windows 11 或较新 WSL 版本上直接运行图形界面程序把显示输出到 Windows 桌面。但离线环境下我遇到的情况是 WSLg 偶尔起不来尤其是基础系统镜像和 WSL 运行时版本对不上时。替代方案是用 X Server 转发或者直接安装 xvfb 做虚拟显示。下载xvfb的 deb 包离线安装后跑测试脚本时用xvfb-run加--auto-servernum参数把图形程序塞进虚拟显示该出截图出截图该跑测试跑测试不需要真实桌面环境。这套方案在服务器类 WSL2 环境里很实用。6.3 用 systemd 托管常驻服务新版 WSL2 默认支持 systemd离线安装也不受影响。启用方法是在 WSL 内编辑/etc/wsl.conf[boot] systemdtrue保存后执行wsl --shutdown重进运行systemctl list-units就能看到系统服务列表了。接下来不管是systemctl enable ssh还是systemctl start docker都和真实 Linux 服务器行为一致。这里要注意一个细节docker 这种需要内核模块支持的服务在 WSL2 里不是开箱即用的。离线安装 docker 需要额外的步骤而且如果公司内网有自定义内核模块或安全策略还得额外配置。WSL2 的内核由 Windows 侧管理不像真实 Linux 那样随便加载自定义内核模块所以跑 docker 是没问题但碰到底层网络和存储驱动定制就比较折腾。7. 个人经验总结离线安装 WSL2 这件事说难不难但确实容易在细节上栽跟头。我自己的体会是整个流程里最容易被低估的是准备工作虚拟化是否开启、Windows 功能是否启用、依赖包是否齐全这三件事没确认好后面全是无效劳动。建议做一张检查表每台机器按表逐项确认能省掉至少一半的排查时间。另外想提醒一点离线环境下的安装包和配置文件一定要统一管理。我习惯在联网机器上建一个固定的“离线源目录”按“Windows功能说明文档 / WSL运行时MSI / 发行版appx / 开发工具依赖包”四个子目录归档版本号写清楚在文件名里。这样不光自己方便交接给同事的时候也能快速上手。毕竟离线部署这种东西一旦版本不匹配排查起来比在线环境痛苦得多。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →