解决 Ubuntu 和其他发行版上的 WSL2 网络无法访问的问题
【翻译于Kontext 的 Resolution for WSL2 Network Unreachable Issue on Ubuntu and Other Distros】
对于我的 Ubuntu 1.2 发行版,从 WSL20 升级到 WSL04 时,虚拟机无法连接到网络。错误消息包括:无法访问网络;临时故障解决; 名称解析等暂时失败。网站上有很多文章,其中许多文章都没有解决问题。本页总结了这些问题的解决方案,希望能为您节省大量时间。
问题上下文
在非系统驱动器上安装 Windows 子系统之后安装 WSL 2 Ubuntu 发行版后,尝试更新 apt 时会出现以下错误:
Err:1 http://archive.ubuntu.com/ubuntu focal InRelease
Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://security.ubuntu.com/ubuntu focal-security InRelease
Temporary failure resolving 'security.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease
Temporary failure resolving 'archive.ubuntu.com'
Err:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease
Temporary failure resolving 'archive.ubuntu.com'
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/InRelease Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal-updates/InRelease Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal-backports/InRelease Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/focal-security/InRelease Temporary failure resolving 'security.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.
同样,当 ping 8.8.8.8 或任何其他 IP 地址时,会显示以下错误:
ping: connect: Network is unreachable
当ping任何域名时,它会显示一个不同的错误:
ping: google.com: Temporary failure in name resolution
环境详细信息如下:
- 操作系统: 视窗 10 (10.0.19044)
- WSL 版本:2
- 发行版:Ubuntu 20.04 x64 版本或 OpenSUSE 42 或任何其他发行版。
降级到 WSL 1 时,将自动解决以下问题:
wsl --set-version Ubuntu 1
但是,当将其更改回版本2时,上述问题仍然存在:
wsl --set-verison Ubuntu 2
常规修复
WSL 2 官方文档和许多其他网站都建议进行以下修复:
-
在 WSL 中备份和删除自动生成的文件:
# Backup and delete auto-generated files sudo cp /etc/wsl.conf /etc/wsl.conf.bk sudo cp /etc/resolv.conf /etc/resolv.conf.bk sudo rm /etc/resolv.conf || true sudo rm /etc/wsl.conf || true
如果您的发行版中不存在 wsl.conf,您可以忽略它。
-
使用以下命令重新创建:
/etc/wsl.conf
sudo bash -c 'cat <<EOF > /etc/wsl.conf [network] generateResolvConf = false EOF'
-
使用以下命令重新创建:
/etc/resolv.conf
sudo bash -c 'cat <<EOF > /etc/resolv.conf nameserver 8.8.8.8 nameserver 8.8.4.4 nameserver 192.168.1.254 EOF'
上面的命令使用谷歌DNS和我的WIFI网络默认网关作为DNS服务器。您可以相应地更改它。您可以从Windows命令提示符中的ipconfig命令获取它:
ipconfig Wireless LAN adapter Wi-Fi: Connection-specific DNS Suffix . : IPv4 Address. . . . . . . . . . . : 192.168.1.135 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.1.254
-
保留 WSL
-
在 Windows 中以管理员身份运行命令提示符并执行以下命令:
wsl --shutdown netsh winsock reset netsh int ip reset all netsh winhttp reset proxy ipconfig /flushdns
-
使用 Windows 搜索进行网络重置。如其本身所述,它将重新安装您的网络适配器。在采取任何行动之前,请注意这一点。
-
重新启动窗口。
通常在重启后,WSL 网络现在应该可以正常工作。但不幸的是,这种方法对我不起作用。因此,我不断探索其他选项。
运行 ip 地址
在 WSL 中运行以下命令:
$ ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether ba:bc:6f:b0:f3:8b brd ff:ff:ff:ff:ff:ff
3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 36:6f:82:06:6f:9a brd ff:ff:ff:ff:ff:ff
4: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
5: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
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
上述文本已在我的 WSL 发行版中打印出来。问题是 eth0 状态是 DOWN。
如前所述,对于 WSL 1 版本,此问题不存在,因为 WSL2 的工作方式与 WSL1 不同:
10: eth0: <> mtu 1500 group default qlen 1
link/ether 9c:b6:d0:15:31:74
inet 169.254.143.197/16 brd 169.254.255.255 scope global dynamic
valid_lft forever preferred_lft forever
最终解决方案
在尝试了上述所有步骤后,但都对我不起作用。最后,在我大量的网上冲浪检索后找到了个解决办法:禁用对C:\Users\<your user id>\AppData\Local\Packages
的压缩。
具体如下:
-
导航到
C:\Users\<your user id>\AppData\Local\Packages
。根据你自己的用户 ID替换占位符 -
右键选择属性并接着点高级按钮
-
取消‘Compress contents to save disk space’(压缩内容以便节省磁盘空间)
-
点击确认按钮
-
采用对子项和子目录级联修改
-
通过在 Windows 终端或命令提示符中运行命令来关闭 WSL:
wsl --shutdown
-
重启电脑
重启后问题消失
享受用Ubuntu via WSL 2的开发吧!
更多推荐
所有评论(0)