【翻译于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 官方文档和许多其他网站都建议进行以下修复:

  1. 在 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,您可以忽略它。

  2. 使用以下命令重新创建:/etc/wsl.conf

     sudo bash -c 'cat <<EOF > /etc/wsl.conf
     [network]
     generateResolvConf = false
     EOF'
    
  3. 使用以下命令重新创建:/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
    
  4. 保留 WSL

  5. 在 Windows 中以管理员身份运行命令提示符并执行以下命令:

     wsl --shutdown
     netsh winsock reset
     netsh int ip reset all
     netsh winhttp reset proxy
     ipconfig /flushdns
    
  6. 使用 Windows 搜索进行网络重置。如其本身所述,它将重新安装您的网络适配器。在采取任何行动之前,请注意这一点。

  7. 重新启动窗口。

通常在重启后,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的开发吧!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐