WSL Ubuntu(Windows子系统Linux)无法连接互联网

226

最近我在Windows机器上安装了WSL Ubuntu 18.04,但似乎什么都不正常工作,因为我无法访问互联网
我尝试了一些命令,sudo apt update显示“连接失败”,ping google.com会花费很长时间,就像你在这个截图中看到的那样:


我还检查了nano /etc/resolv.conf并确保名称服务器是正确的,完全禁用了Kaspersky及其防火墙,禁用了Hyper-V,重新安装了WSL几次,甚至禁用了Windows Defender。但没有帮助。

那么你有什么想法,这里可能出了什么问题吗?


15
这个问题能否被迁移到正确的网站,而不是在这里关闭? - leftjoin
2
"sudo nano /etc/resolv.conf" 添加 1.1.1.1,然后 ping Google。 - scott
3
TL;DR (以下也有不完整的信息): sudo nano /etc/resolv.conf,在现有条目前加上#,在新行上添加nameserver 8.8.8.8,保存(Ctrl+X; Y; Enter),ping google.com以确保它起作用,然后为了确保它不会被覆盖:sudo nano /etc/wsl.conf,在新行上添加[network],然后在下一行上添加generateResolvConf = false,保存,完成。 - Andrew
21个回答

4

以上方法均无效。但切换到WSL 1可以解决问题!

所以在管理员权限的PowerShell中执行以下命令:

wsl --set-default-version 1

然后重新安装Ubuntu操作系统


1
这篇回答将帮助您将现有的发行版转换为版本1。 - Matthew
这对我也起作用,但由于我必须使用Podman,而他们使用wsl2进行虚拟化,所以我必须继续寻找……但为什么它在版本1上运行而在版本2上不运行真的让我抓狂。 - DaniloMourelle

4

如果您想保持%TEMP%压缩,只需解压WSL交换文件:%TEMP%\ApppData\Local\Temp\swap.vhdx - Jim Grisham
根据我在Win10.21H2上的经验,一次性的compact /u %TEMP%\swap.vhdx是不够的。我必须要运行compact /u %TEMP%\,这样%TEMP%目录本身就不会被标记为压缩。否则,每次我们执行wsl --shutdown然后启动WSL实例时,**%TEMP%\swap.vhdx**都会被重新创建,并继承自%TEMP%的压缩标志,问题就会再次出现。 - Jimm Chen

4

2
谢谢您发布这个 - 省了我很多时间! - Nev

3

好的,我知道这个帖子已经有一段时间没有太多活动了。我在工作笔记本电脑上花了几天时间尝试解决这个问题,因为公司设置不允许使用8.8.8.8(Google DNS)地址,所以我不仅需要编辑WSL2 /etc/wsl.conf文件。

#/etc/wsl.conf
[network]
generateResolvConf = False

我还需要编写一个PowerShell脚本,将实际的DNS服务器地址从Windows写入WSL2文件夹中。我不知道是因为我的工作电脑被锁定了还是什么原因,但我只能使用我的Windows机器使用的DNS服务器,而WSL2总是提取其自己的IP地址来填充resolv.conf文件,其中没有DNS服务器。
如果有其他人遇到这个问题,以下是我解决它的方法。将其保存为任何你想要的名称(在我的情况下是debian.ps1,在管理员PowerShell提示符下运行./debian.ps1),我使用导入的自定义Debian Buster WSL2发行版设置为默认值;如果您正在使用其他未设置为默认值的内容,则必须更改最后一行(wsl.exe),以启动正确的发行版:
# Get the DNS server of the Windows machine, save into variable nameserver
$nameserver = Get-WmiObject -Namespace root\cimv2 -Query "Select dnsserversearchorder from win32_networkadapterconfiguration" | where {$_.DNSServerSEarchOrder -ne $null} | select -ExpandProperty DNSServerSearchOrder
# Convert nameserver object into a string
$nameserver = Out-String -InputObject $nameserver
# Run Set-Contents (sc) to write the resolv.conf file in a public location as it has DOS formatted line endings written by PowerShell, not readable by Linux
sc -Path 'c:\Users\Public\Documents\resolv.conf' -Value ('nameserver ' + $nameserver) -Encoding utf8
# Convert the DOS formatted file into UNIX format for WSL2 and write it in the proper place (\etc\resolv.conf, its primary location is \\wsl$\[distro_name] from Windows)
[string]::Join( "`n", (gc 'c:\Users\Public\Documents\resolv.conf')) | sc '\\wsl$\debian\etc\resolv.conf'
wsl.exe

注意,如果您的发行版不在\wsl$\debian\下,您需要将其更改为实际所在的位置。我知道这并不美观,并且从互联网上发布的许多不同解决方案中提取,但这是唯一一个适用于我公司管理的个人电脑和组策略的方法。希望这可以为公司管理的个人电脑用户节省大量麻烦。请注意,如果您通过VPN连接,我认为这将不起作用-我还没有在办公室经过冠状病毒测试,它正在家庭WiFi上运行。如果您直接连接到公司网络,则可能需要进行一些调整。


这对我来说实际上是有效的;但是,你的 sc 缩写不是 Set-Content 命令的有效别名。SC (C:\Windows\System32\sc.exe) 是一个用于与服务控制管理器和服务通信的命令行程序。它位于环境路径中,Get-Alias sc 没有返回正面的响应。 - Mavaddat Javid
此外,WSL路径为\\wsl.localhost,例如\\wsl.localhost\Ubuntu-22.04\etc。然而,我无法使用Set-Content写入resolv.conf,但您可以使用sudo vi /etc/resolv.conf编辑它并粘贴内容。 - Mavaddat Javid
有趣的是,我只是像这样粘贴它,它就可以完美地运行。我只是从PowerShell中使用.\debian.ps1运行它 - 可能您的设置不同,因为Get-Alias sc返回对Set-Content的有效句柄。 - Matt

2
我安装了WSL和Ubuntu 20.04。
经过数天的故障排除,我终于找到了解决方法。
我想相信像我一样遇到这个问题的人都在运行WSL版本2。
只需切换回WSL版本1即可解决此问题,无需进一步配置。
要了解如何进行此更改,请按照以下链接操作:更改WSL版本

2
在我的情况下,当我安装了WSL2的要求并将我的wsl升级到版本2时,WSL网络开始不起作用。
它可以将域名解析为IP地址,但无法通过互联网访问IP地址。
我更新了操作系统和wsl2模块到最新版本,并尝试了所有解决方法,但都没有成功。
最后,我找到了解决办法。
  1. 转到设备管理器并检查查看>隐藏设备
  2. 卸载所有Hyper-V虚拟交换机扩展
  3. 从功能中删除“Windows子系统Linux”
  4. 重新启动
  5. 从功能中添加“Windows子系统Linux”
对于我来说,在那之后,发行版仍然保持为版本2,但它正在工作!值得一试。

2
很不幸,对我来说唯一的解决方案是:
  • 卸载任何Ubuntu(18.10和20.04)
  • 删除Windows功能中的Linux子系统
  • 重新启动计算机
  • 在Windows功能中启用Linux子系统
  • 重新启动计算机
  • 重新安装Ubuntu 20.04
这是在Win10 V1909(OS Build 18363.1379)上进行的。我已经尝试了这篇文章和其他stackoverflow帖子中的所有方法,但没有成功。
我只建议将上述步骤作为绝对的最后手段。

1

在我尝试在WSL2上安装MySQL-Server并尝试访问Ubuntu上的root时,出现了这种情况。系统本身变得非常奇怪(有时我希望还有其他的Ubuntu替代品),因此我尝试重启vEthernet(WSL)适配器和重新启动计算机,然后它又正常工作了。


1

我在WSL2的Debian 10上安装了ufw,之后将其移除并重新启动Windows即可解决问题。


-3
你可以通过在终端中输入以下命令来解决这个问题:
-> sudo systemctl restart NetworkManager

2
请注意,这是WSL,它默认不支持systemd。因此,systemctl将无法工作。 - NotTheDr01ds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接