)
【2026 更新可用】WSL2安装配置全流程(踩坑指南)——机器学习不得不用的WSL虚拟机版本选择安装路径网络配置1 说明文章转载自https://www.cnblogs.com/Comets9224/p/20233634截至2026/10/02wsl推出3.0.1.0新的wsl设置软件可以使用多数需要编辑.wslconfig的部分均可以使用设置软件进行更改。2 内容简介本文主要会针对以下几个问题可能是ai不会主动告诉你的新手要自己踩过坑才知道的问题。装什么版本怎么考虑。路径装在哪怎么装。网络怎么配怎么和windows主机之间联网让wsl内能正常上网。安装后怎么配置怎么分配资源。3 安装流程整个安装流程我会按先决定装什么版本 → 再决定装在哪 → 最后动手装的顺序来讲。新手最容易踩坑的地方恰恰就在前两步版本和路径。很多人直接一条wsl --install 回车下去看似一步到位其实把后面所有的坑都埋下了。3.1 为什么选 Ubuntu 22.04而不是默认的最新版你可能会问既然有更新的 24.04为什么我偏要装一个旧的 22.04这不是保守而是踩过坑之后的选择。LTS 长期支持省心。 22.04代号 Jammy是 LTSLong Term Support版本官方标准支持到 2027 年、扩展安全维护到 2032 年。LTS 的意思是它在几年内都不会有大改动软件源稳定你不用担心哪天apt 更新把环境搞崩。机器学习 / GPU 生态最成熟。 这是最关键的一点。NVIDIA 的 CUDA、cuDNN以及 PyTorch、TensorFlow、PennyLane 这些库官方测试和预编译的二进制包绝大多数都是以主流 LTS 为基准的。22.04 正处在足够新、又被所有框架充分适配的甜区。避免我亲身踩过的驱动 / 库版本坑。 我自己最早图新直接上了当时的最新版 Ubuntu结果遇到两类问题一是显卡驱动 / CUDA 与系统不匹配WSL 里nvidia-smi 能出来、但框架就是调不动 GPU二是很多预编译的 wheel 依赖较旧的 glibc系统太新反而装不上或一跑就崩。换回 22.04 后这些问题基本消失。新不等于好。 对开发环境来说稳定可复现远比版本号大重要。等到某个框架明确推荐你升级时再升才是稳妥的节奏。3.2 如果不手动指定直接wsl --install 会怎样很多教程包括 AI 给你的回答上来就让你敲wsl --install这条命令确实能用但它默默替你做了两个决定而这两个决定对后面都不友好 - 它会给你装当前默认的最新发行版。 不带-d 参数时WSL 会拉取它认为的默认 Ubuntu通常就是最新版。于是你前面好不容易想清楚的要装 22.04被这一条命令直接覆盖成了最新版——也就把 3.1 里说的驱动 / 库不兼容的风险全带了进来。 - 它会把系统装在 C 盘。 默认安装位置在C:\Users\用户名\AppData\Local\Packages\ 下面。WSL2 的整个 Linux 系统是一个不断长大的虚拟磁盘文件ext4.vhdx装几个框架、下几个数据集几十 GB 很轻松。C 盘本来就紧张被它越吃越多而且事后想搬到 D 盘还得 export/import 折腾一遍。 所以正确做法是版本要自己指定路径也要自己指定一步到位装到 D 盘。下面就是完整流程。 ### 3.3 安装前的准备启用 WSL 功能 如果你是第一次用 WSL先确认 Windows 的两个功能已经打开 - 适用于 Linux 的 Windows 子系统Windows Subsystem for Linux - 虚拟机平台Virtual Machine Platform 可以在「控制面板 → 程序 → 启用或关闭 Windows 功能」里勾选也可以直接在管理员 PowerShell 里执行 powershell # 检查 WSL 状态 wsl --status # 若尚未启用安装 WSL 内核组件注意这里只装组件下一步再指定发行版 wsl --install --no-distribution # 更新到最新内核 wsl --update # 把默认版本设为 WSL 2性能更好机器学习必需 wsl --set-default-version 2这里用--no-distribution是关键它只安装 WSL 本身、不顺手给你装最新版 Ubuntu把装哪个发行版的决定权留在你自己手里。装完后 CMD 里敲wsl --help能正常出现帮助信息就说明组件就绪了。⚠️ 如果你机器上装了 Docker DesktopDocker 的 WSL2 后端依赖docker-desktop、docker-desktop-data这两个隐藏发行版以及 WSL 内核组件。后面任何卸载 / 清理操作都不要动它们只动你自己装的发行版。3.4 把 Ubuntu 22.04 装到 D 盘推荐直接导入 rootfs这是我最推荐的方式——不经过 C 盘、直接装到 D 盘干净利落。3.4.1 步骤 1下载 Ubuntu 22.04 的根文件系统下载地址https://cloud-images.ubuntu.com/wsl/jammy/current/下载其中的ubuntu-jammy-wsl-amd64-ubuntu22.04lts.rootfs.tar.gz官方偶尔会微调文件名以目录里实际的 .tar.gz 文件为准把它存到一个临时目录例如D:\temp\3.4.2 步骤 2在 D 盘创建安装目录这个目录用来存放发行版实际的虚拟硬盘文件ext4.vhdx。在 PowerShell 里mkdir D:\WSL\Ubuntu2204目录名可以自己改比如D:\WSL\MyUbuntuML但要记住后面命令里要保持一致。3.4.3 步骤 3用wsl --import导入到 D 盘wsl--import ubuntu2204 D:\WSL\Ubuntu2204 D:\temp\ubuntu-jammy-wsl-amd64-ubuntu22.04lts.rootfs.tar.gz--version 2三个参数依次是ubuntu2204发行版名称自己起wsl -l -v里显示的就是它。注意 WSL 名称区分大小写后面所有命令都要和这里完全一致。D:\WSL\Ubuntu2204步骤 2 创建的安装目录系统就装在这。D:\temp\…rootfs.tar.gz步骤 1 下载的文件完整路径。--version 2强制用 WSL 2机器学习场景下必须。命令会解压并创建虚拟硬盘需要几分钟等命令提示符重新出现即完成。3.4.4 步骤 4创建普通用户、启用 systemd、设为默认用户用--import导入的发行版默认登录用户是 root这点和wsl --install -d自动提示建用户不同我们需要手动建一个普通用户。先以 root 进入wsl-d ubuntu2204进去后提示符是root…#依次执行# 创建用户把 zhang 换成你想要的用户名按提示设密码其余信息可一路回车adduser zhang# 把用户加入 sudo 组使其能执行管理员命令usermod-aGsudozhang# 编辑 WSL 配置文件sudonano/etc/wsl.conf在wsl.conf(/etc/wsl.conf 是 Linux 文件系统里的) 里写入[boot] systemdtrue [user] defaultzhangsystemdtrue开机启用 systemd很多服务依赖它。defaultzhang把默认登录用户设成 zhang以后进来就不再是 root。nano 保存退出Ctrl O→ 回车 →Ctrl X。然后exit退回 PowerShell。让配置生效必须彻底重启 WSLwsl--shutdown wsl-d ubuntu2204如果一切正常这次进来提示符会变成zhang…:~$也不再有 systemd 报错。3.4.5 步骤 5设为默认发行版 收尾# 以后直接敲 wsl 就能进自己装的 22.04不用每次 -dwsl--set-defaultubuntu2204确认一切正常后可以删掉D:\temp\里下载的那个 .tar.gz释放空间。3.4.6 步骤 6可选让 WSL 默认进 Linux 家目录刚装好时wsl 进去默认停在 Windows 路径/mnt/c/…容易误操作 Windows 文件。/etc/wsl.conf不支持设默认目录简单的办法是改用户的~/.bashrcnano~/.bashrc在文件最后一行加上cd~保存后exit再wsl --shutdown重启即可。这样每次进来都直接在/home/zhang。强烈建议把代码、数据集、Python 环境都放在/home/用户名/这种 Linux 原生路径下不要放/mnt/c、/mnt/d。一是性能好得多二是避免在 Windows 文件系统上大量操作带来的误删风险。⚠️ 安全提醒——sudo和rm -rf是真能把你电脑搞坏的。 WSL 里通过/mnt/c、/mnt/d能直接读写你的 Windows 文件这意味着一条写错的删除命令删的可能就是 C 盘的真实数据。两点务必记牢①rm -rf没有回收站、删了不可恢复敲之前一定先pwd看清当前在哪、删的是什么② 凡是涉及/mnt/...路径的删除 / 移动再三确认目标再回车。不确定的命令先不要带sudo。3.5 另一种思路先装再迁移备选如果你已经用wsl --install -d Ubuntu-22.04把系统装到了 C 盘也不用重来可以导出—注销—导入搬到 D 盘# 1. 导出当前系统为镜像wsl--export Ubuntu-22.04 D:\temp\ubuntu-22.04-backup.tar# 2. 注销 C 盘上的旧实例wsl--unregister Ubuntu-22.04# 3. 在 D 盘建目录mkdir D:\WSL\Ubuntu2204# 4. 导入到 D 盘wsl--import Ubuntu-22.04 D:\WSL\Ubuntu2204 D:\temp\ubuntu-22.04-backup.tar--version 2# 5. 验证wsl-l-v这套 export / import 同样是备份和迁移的通用方法平时给系统做快照备份也是它。导出的镜像包含完整系统用户账户、所有软件包、/home 下的项目文件、各种配置恢复后和原来一模一样。3.6 如果已经装错了彻底卸载从头再来如果你是看到这篇文章之前已经手快敲了wsl --install把最新版装进了 C 盘别慌看你的情况二选一只是位置不对、版本还能接受 → 直接用上面 3.5 的 export / import 把它搬到 D 盘就行不用重装。版本也不对装成了最新版想推倒重来 → 把这个发行版彻底卸载干净再回 3.4 重新装 22.04。下面是干净卸载的步骤。第 1 步注销并删除你自己的发行版# 先看清楚都装了哪些wsl-l-v# 全部关闭wsl--shutdown# 注销并删除换成你实际的发行版名比如 Ubuntuwsl--unregister Ubuntu⚠️wsl --unregister会连同该发行版里的所有文件一起抹掉不可恢复。如果里面有还没备份的东西先用 3.5 的wsl --export导出镜像再删。第 2 步装了 Docker Desktop 的话别误伤它的组件如果你机器上有 Docker Desktop它的 WSL2 后端依赖下面这些一个都别动两个隐藏发行版docker-desktop、docker-desktop-datawsl -l -v里能看到不要 unregister 它们适用于 Linux 的 Windows 子系统和虚拟机平台这两个 Windows 功能 → 不要用dism /disable-feature去禁用控制面板里的WSL 内核更新包 → 不要卸载第 1 步做完后再wsl -l -v正常应该只剩docker-desktop和docker-desktop-data两个。第 3 步清理残留文件可选如果你之前是从微软商店 /wsl --install装的发行版注销后可能在这里留有残留目录路径C:\Users\用户名\AppData\Local\Packages\AppData 默认隐藏要先在资源管理器里勾上显示隐藏的项目找以CanonicalGroupLimited.UbuntuonWindows_…开头的文件夹确认没用了再删⚠️ 不要删任何Microsoft.WSL_…开头或和 Docker 相关的文件夹注意用wsl --import装到 D 盘的发行版不在这个 Packages 目录里文件就在你指定的D:\WSL\...unregister 后直接删那个目录即可。上面这步主要针对从商店 /wsl --install装的情况。第 4 步重启电脑让改动彻底生效。之后回到 3.3 / 3.4干干净净重装一个 22.04 到 D 盘即可。到这里一个版本正确22.04、位置正确D 盘、用户配置妥当的 WSL 就装好了。接下来第 4 部分讲网络怎么让 WSL 通过 Windows 上的代理正常上网第 5 部分讲资源分配怎么限制内存别让它吃满。4 网络配置系统装好后第一个拦路虎往往是网络——尤其是你需要从 GitHub、PyPI、HuggingFace 拉东西又要走 Windows 上的代理 之类时。我在这一步上耗的时间比安装本身还多。这一部分把为什么连不上和怎么一步到位配好讲清楚。4.1 先搞懂问题WSL2 默认的 NAT 模式WSL2 默认用的是 NAT网络地址转换模式。这意味着WSL 会被分到一个独立的虚拟 IP类似172.x.x.x它和 Windows 主机不在同一个网络里中间隔着一层虚拟交换机。关键后果WSL 里的127.0.0.1不是 Windows 的127.0.0.1。你的 监听在 Windows 的127.0.0.1:7890而 WSL 里访问127.0.0.1指的是它自己根本碰不到 。于是新手最常见的现象就来了在 WSL 里curl https://github.com直接 Connection refused 或超时明明 Windows 上网好好的。NAT 模式下要连主机代理得先查出主机 IP、再手动把代理指过去又繁琐又不稳定主机 IP 还会变。所以我不推荐在 NAT 模式里硬怼而是直接换模式。过去有种老办法是取消 的 LAN 勾选 开 TUN 模式接管流量这套现在已经不推荐了配置麻烦还容易和系统代理冲突。下面用更干净的镜像模式。4.2 解决方案把网络改成 mirrored 镜像模式新版 WSL2 提供了 镜像网络模式mirrored。开启后WSL 直接镜像使用 Windows 的网络栈最大的好处是WSL 里的127.0.0.1就等于 Windows 的127.0.0.1。这样 WSL 直接用127.0.0.1:7890就能命中 不用再折腾主机 IP。配置写在 Windows 主机的全局配置文件.wslconfig里注意是 Windows 那个带点的.wslconfig不是 WSL 里的/etc/wsl.conf打开路径C:\Users\你的Windows用户名\新建或编辑一个名为.wslconfig的纯文本文件无扩展名写入[wsl2] networkingModemirrored保存后在 PowerShell 里彻底重启 WSL 让它生效wsl--shutdown这边直接用全局模式Global即可不需要开 TUN也不需要去动允许局域网连接。镜像模式下走127.0.0.1这条路最省心。进阶推荐让 Windows 系统代理自动同步进 WSL。 如果你嫌后面手动设代理变量麻烦可以在同一个.wslconfig里多加几行开启 autoProxy——它会把 Windows 的系统代理设置自动注入到 WSL省去手动 export 的步骤[wsl2] networkingModemirrored dnsTunnelingtrue firewalltrue autoProxytrueautoProxytrue自动把 Windows 系统代理同步给 WSL开了它很多时候就不必再手动设代理变量了。dnsTunnelingtrue用隧道方式处理 DNS镜像模式下解析更稳少踩 DNS 解析失败的坑。firewalltrue让 Windows 防火墙规则对 WSL 生效更安全。改完同样要wsl --shutdown重启生效。开启 autoProxy 后进 WSL 先用下面 4.5 的env | grep -i proxy看一眼变量是否已自动注入如果已经有了4.3、4.4 的手动设置就可以跳过。要是某些场景下没自动注入或你想精确控制端口再回头用 4.3 / 4.4 的手动方案兜底。4.3 在 WSL 里设置代理环境变量手动方案网络模式通了还要告诉 WSL 里的程序curl、wget、pip、git 等“让流量经过”。进入 WSL 后执行exporthttp_proxyhttp://127.0.0.1:7890exporthttps_proxyhttp://127.0.0.1:7890exportall_proxyhttp://127.0.0.1:7890# 同时设置大写变量有些程序只认大写exportHTTP_PROXY$http_proxyexportHTTPS_PROXY$https_proxyexportALL_PROXY$all_proxy# no_proxy 里只放本地地址避免本地回环也被塞进代理exportno_proxylocalhost,127.0.0.1,192.168.0.0/16,172.16.0.0/12exportNO_PROXY$no_proxy几个容易踩的点端口对应你 的实际端口HTTP 代理常见是7890如果你要用 SOCKS5通常是7891写成all_proxysocks5://127.0.0.1:7891。no_proxy不要乱塞10.*。WSL 默认的 no_proxy 有时会带上10.*反而把该走代理的流量给放行直连了导致诡异的连不上。只保留本地地址段最稳。4.4 持久化 一键开关脚本推荐每次开终端都手敲太累把它写进~/.bashrc。但直接写死代理有个大坑一旦你关掉 127.0.0.1:7890没人监听了WSL 里所有程序还在傻乎乎往这个死端口发请求——结果连国内网站都上不去因为流量被导向一个已关闭的代理。所以最佳实践不是写死而是做成两个可随时切换的函数。编辑~/.bashrcnano~/.bashrc在文件末尾加上# 开代理set_proxy(){exporthttp_proxyhttp://127.0.0.1:7890exporthttps_proxyhttp://127.0.0.1:7890exportall_proxyhttp://127.0.0.1:7890exportHTTP_PROXY$http_proxyexportHTTPS_PROXY$https_proxyexportALL_PROXY$all_proxyexportno_proxylocalhost,127.0.0.1,192.168.0.0/16,172.16.0.0/12exportNO_PROXY$no_proxyechoProxy enabled.}# 关代理unset_proxy(){unsethttp_proxy https_proxy all_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY no_proxy NO_PROXYechoProxy disabled.}保存退出后source ~/.bashrc生效。以后开了 就敲set_proxy关了 就敲unset_proxy国内国外随意切换不会再出现关了代理反而全网断的尴尬。4.5 验证与排错配好后先确认环境变量到底有没有生效——这是排查网络问题的第一步env|grep-iproxy有输出如http_proxyhttp://127.0.0.1:7890说明代理已设置没有任何输出说明当前是直连状态。然后测连通性curl-Ihttps://github.com# 配置生效后正常应返回 HTTP/2 200 之类的状态码curl-Ihttps://www.google.com# 换个站点再测一次能正常返回状态码即代理生效按这个顺序排错env | grep -i proxy看变量对不对——拼错端口、漏了大写变量都很常见。确认 真的在跑、端口对。在 Windows 的 PowerShell 里netstat -aon | findstr :7890看看 7890 有没有被监听。确认.wslconfig的 mirrored 已生效改完务必wsl --shutdown重启过。如果要直连国内网站记得unset_proxy——代理变量还挂着、 又关了就会全断这点前面强调过。配好网络后WSL 拉 GitHub / pip / conda 都会顺畅起来。下一部分讲资源分配——怎么通过.wslconfig限制内存和 CPU别让 WSL 把 16G 内存吃满拖垮 Windows。5 资源配置网络通了最后一个容易被忽略、却很影响体验的点是资源占用。尤其像我这种 16G 内存的笔记本Y7000P如果放任不管跑训练时 WSL 能把内存吃到让整个 Windows 卡死。这一部分讲清楚 WSL2 默认会占多少、为什么要限、以及怎么限。5.1 不限制会怎样默认最高吃掉 80% 内存WSL2 跑在一个轻量级虚拟机里内存是动态分配的启动时只占一点点然后随着 Linux 里程序的需求往上涨最高可达 Windows 总内存的约 80%。举例16GB 的机器WSL2 理论上能涨到约 12.8GB。平时这套动态机制挺高效但机器学习场景是重灾区训练大模型本身就吃内存WSL 一路涨上去你 Windows 这边还开着浏览器、IDE、……两边抢内存结果就是整机卡顿甚至假死。同理如果 WSL 里某个进程内存泄漏 / CPU 跑满 / 磁盘 I/O 失控也会把 Windows 一起拖下水。所以对内存不富裕的机器主动给 WSL 设个上限是很有必要的。5.2 怎么限制还是改.wslconfig限制资源同样写在 Windows 主机那个.wslconfig里就是第 4 部分配网络用的同一个文件C:\Users\你的Windows用户名\.wslconfig没有就新建。把资源参数和前面的网络参数写在同一个[wsl2]段下即可[wsl2] # —— 网络第 4 部分—— networkingModemirrored dnsTunnelingtrue firewalltrue autoProxytrue # —— 资源 —— memory8GB # 限制最大内存 processors2 # 限制 CPU 核心数 swap0 # 关闭交换空间按需也可不写参数说明memory最大内存上限支持 GB / MB如 8GB、2048MB。processors分给 WSL 的 CPU 核心数。swap交换空间大小swap0表示禁用不确定就别写这行用默认值。改完后照例彻底重启 WSL 生效wsl--shutdown5.3 该设多大按总内存来定没有标准答案原则是给 Windows 留够剩下给 WSL16GB 内存我的情况建议把 WSL 限制在 8GB 12GB具体看你 Windows 端还要同时开多少东西。我自己常用 8GB跑一般的训练够用、Windows 也不卡。32GB 及以上可以放宽到 16GB 甚至更多按实际负载调。要是某次训练发现 8GB 不够OOM 被杀再往上调到 1012GB 即可.wslconfig改完wsl --shutdown重启就生效很灵活。5.4 监控与日常习惯看占用Windows 任务管理器里有个Vmmem新版可能叫vmmemWSL进程它代表的就是 WSL 虚拟机的总资源占用盯它就知道 WSL 吃了多少。用完就关不跑任务时一条wsl --shutdown就能把 WSL 占的内存、CPU 全部释放回 Windows。养成这个习惯比纠结上限设多少还管用。5.5 关于 GPU限不限很多人以为要在 WSL 里把显卡驱动、CUDA 都装好才能用 GPU其实不用记住两条就行不要在 WSL 里装 NVIDIA 显卡驱动。 驱动由 Windows 那边提供、自动带进 WSL。进到 WSL 直接敲nvidia-smi能看到显卡就说明 GPU 已经能用了。跑 PyTorch、TensorFlow 这类框架用 conda 或 pip 装框架就够了不用再单独折腾系统的 CUDA 环境——装框架时它会自带需要的部分。我在自己装好的 WSL 里直接试了一下确实是这样$ nvidia-smi NVIDIA-SMI565.75Driver Version:566.24CUDA Version:12.7NVIDIA GeForce RTX4060Laptop GPU...什么都没额外装进去就能看到显卡。这也是 3.1 建议选 22.04 的原因之一GPU 这套东西在主流 LTS 上最省心系统太新反而容易出兼容问题。到这里从装什么版本、装到哪到网络打通再到资源限制一个稳定、好用、不拖垮 Windows 的 WSL 机器学习 / AI 开发环境就配置完成了。剩下的就是进去apt、conda、pip装你自己的环境开始干活了。