微软专家 发表于 2026-6-18 23:00:05

WSL2 Ubuntu 网络不可达与临时故障名称解析故障的修复实践

在将 WSL2 Ubuntu 发行版迁移到非系统驱动器后,或是升级 WSL 内核版本时,经常会出现 apt update 报 Temporary failure resolving 以及 ping 显示 Network is unreachable 的错误。这个问题在 WSL1 中不会出现,因为 WSL2 基于 Hyper-V 虚拟机,网络栈与宿主机桥接的方式不同。本文将汇总多次验证后的有效修复步骤,特别是针对自动生成的 resolv.conf 和 wsl.conf 配置失效的情况,以及一个容易被忽略的根因——Windows 将 AppData 下的 Packages 文件夹压缩后导致 WSL2 网络接口无法正常启动。

环境与现象
操作系统:Windows 10 10.0.19044
WSL 版本:2
发行版:Ubuntu 20.04 x64(其他发行版如 OpenSUSE 42 也可能遇到)

当执行 sudo apt update 时出现:

Err:1 http://archive.ubuntu.com/ubuntu focal InRelease
Temporary failure resolving
Err:2 http://security.ubuntu.com/ubuntu focal-security InRelease
Temporary failure resolving
...
W: Failed to fetch ... Temporary failure resolving

ping 8.8.8.8 则显示:Network is unreachable
ping google.com 显示:Temporary failure in name resolution

降级到 WSL1 可临时解决,但切换回 WSL2 问题复现:

wsl --set-version Ubuntu 1   # 正常
wsl --set-version Ubuntu 2   # 故障复现


常规修复:手动接管 DNS 配置
WSL 文档推荐的做法是删除自动生成的 resolv.conf 和 wsl.conf,然后手动创建静态配置。

在 WSL 终端中执行:

sudo cp /etc/wsl.conf /etc/wsl.conf.bk 2>/dev/null || true
sudo cp /etc/resolv.conf /etc/resolv.conf.bk 2>/dev/null || true
sudo rm -f /etc/resolv.conf /etc/wsl.conf


创建 /etc/wsl.conf 并禁止 WSL 自动管理 resolv.conf:

sudo bash -c 'cat > /etc/wsl.conf <<EOF

generateResolvConf = false
EOF'


创建 /etc/resolv.conf 并填入可用的 DNS 服务器:

sudo bash -c 'cat > /etc/resolv.conf <<EOF
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 192.168.1.254
EOF'

其中 192.168.1.254 是从 Windows 的 ipconfig 中获取的默认网关地址。

Windows 侧网络堆栈重置
以管理员身份打开命令提示符,执行:

wsl --shutdown
netsh winsock reset
netsh int ip reset all
netsh winhttp reset proxy
ipconfig /flushdns

之后从 Windows 设置中执行“网络重置”(会重新安装所有网络适配器),然后重启 Windows。

完成上述操作后,大多数场景下 WSL 网络应恢复正常。但一些用户(包括本文情况)仍然无效。此时需要检查 WSL 虚拟网卡的状态。

检查 eth0 状态
在 WSL 中运行 ip addr:

$ ip addr
...
6: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:15:5d:c2:ee:f9 brd ff:ff:ff:ff:ff:ff

eth0 处于 DOWN 状态。而 WSL1 下 eth0 是 UP 且分配了 IP(如 169.254.143.197/16)。这表明确实是 WSL2 虚拟网卡未能正常启动。

根本原因与最终解决方案
经过排查发现,当 Windows 对 C:\Users\用户名\AppData\Local\Packages 文件夹开启了“压缩内容以便节省磁盘空间”选项时,WSL2 的虚拟网络设备可能无法正确初始化,导致 eth0 保持 DOWN 状态。

解决办法如下:
1. 打开文件管理器,导航到 C:\Users\<你的用户名>\AppData\Local\Packages。
2. 右键点击 Packages 文件夹,选择“属性”。
3. 点击“高级”按钮。
4. 在“压缩或加密属性”中,取消勾选“压缩内容以便节省磁盘空间”。
5. 点击“确定”,在弹出的“确认属性更改”对话框中选择“将更改应用于此文件夹、子文件夹和文件”。
6. 等待系统完成属性变更(可能需要几分钟)。
7. 在命令行中执行 wsl --shutdown 确保 WSL 完全停止。
8. 重启 Windows。

重启后再次启动 WSL,运行 ip addr 确认 eth0 状态变为 UP 并获得了 IP 地址,apt update 与 ping 恢复正常。

此方法在多个发行版(Ubuntu 20.04、OpenSUSE 42)上验证有效,且无需修改注册表或安装额外工具。建议在新建 WSL 发行版后立即检查 Packages 文件夹的压缩设置,避免此类网络故障。

热心网友6 发表于 2026-6-19 00:10:05

Re: WSL2 Ubuntu 网络不可达与临时故障名称解析故障的修复实践

感谢分享这么详细的排查过程!我之前也遇到过WSL2网络不通的问题,手动改resolv.conf和重置网络都试过,有时候能好有时候又不行,一直没找到稳定的规律。你提到的Packages文件夹压缩导致虚拟网卡起不来这个原因,我之前完全没往这方面想过——这个发现太实用了。现在回想一下,可能我之前的故障就出在这里,因为确实习惯性给系统盘开压缩省空间。下次再遇到类似问题,一定先检查这个设置。另外想问一下,你遇到的发行版里,ArchWSL或者Alpine有没有类似情况?还是说主要影响Ubuntu和OpenSUSE这类带有systemd的发行版?

热心网友1 发表于 2026-6-19 09:05:00

Re: WSL2 Ubuntu 网络不可达与临时故障名称解析故障的修复实践

感谢楼主如此详尽的分享!我之前也遇到过WSL2网络完全不可用的情况,试过改resolv.conf和wsl.conf都没用,后来发现是Windows自动更新后把Packages文件夹的压缩给重新勾上了。楼主把这个根因和操作步骤写得非常清楚,尤其是“压缩内容以便节省磁盘空间”导致eth0 DOWN这一点,之前很多人可能完全想不到。 建议后来者按照楼主顺序排查:先试DNS接管和网络重置,如果不行再确认eth0状态,最后检查压缩设置。另外提醒一下,取消压缩后最好重启两次Windows,我遇到过第一次重启后WSL网卡还是DOWN,再次重启才生效的情况。再次感谢楼主的实践经验,收藏了!

热心网友5 发表于 2026-6-19 11:30:00

Re: WSL2 Ubuntu 网络不可达与临时故障名称解析故障的修复实践

感谢分享,这个排查过程非常细致,尤其是最后找到 Packages 文件夹压缩这个根因,确实是很隐蔽的坑。我之前也遇到过类似问题,试了各种 DNS 和网络重置都没彻底解决,看了你的分析才意识到可能是 Windows 层面的文件属性影响了 WSL2 的虚拟网卡初始化。这个经验对很多迁移过 WSL2 或者升级过内核的用户应该都很有帮助,以后遇到类似“eth0 状态 DOWN”的情况可以优先检查这个设置。
页: [1]
查看完整版本: WSL2 Ubuntu 网络不可达与临时故障名称解析故障的修复实践