玄学解决 WSL2 中的 arch Linux 的更新问题
2021-02-27 02:42:46

当我使用校园网时,WSL2 的 arch Linux 在进行系统更新会偶尔发生网络错误;在家里则完全没有这种问题。在发帖求助 arch Linux 中文论坛的过程中,我发现重启这个解决问题的玄学方法确实有用 😓

问题描述

环境如下

image-20210227112812244

当我执行sudo pacman -Syu时,由于我不了解的网络原因造成以下错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
:: 正在同步软件包数据库...
错误:无法从 mirrors.tuna.tsinghua.edu.cn : Failed to connect to mirrors.tuna.tsinghua.edu.cn port 443: 没有到主机的路由 获取文件 'core.db'
错误:无法从 mirrors.bfsu.edu.cn : Failed to connect to mirrors.bfsu.edu.cn port 443: 没有到主机的路由 获取文件 'core.db'
core 已经是最新版本
错误:无法从 mirrors.tuna.tsinghua.edu.cn : Failed to connect to mirrors.tuna.tsinghua.edu.cn port 443: 没有到主机的路由 获取文件 'extra.db'
错误:无法从 mirrors.bfsu.edu.cn : Failed to connect to mirrors.bfsu.edu.cn port 443: 没有到主机的路由 获取文件 'extra.db'
错误:无法从 mirrors.163.com : Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds 获取文件 'extra.db'
extra 已经是最新版本 0.0 B 0.00 B/s 00:00 [----------------------------------------] 0%
错误:无法从 mirrors.tuna.tsinghua.edu.cn : Failed to connect to mirrors.tuna.tsinghua.edu.cn port 443: 没有到主机的路由 获取文件 'community.db'
错误:无法从 mirrors.bfsu.edu.cn : Failed to connect to mirrors.bfsu.edu.cn port 443: 没有到主机的路由 获取文件 'community.db'
错误:无法从 mirrors.163.com : Failed to connect to mirrors.163.com port 80: 连接超时 获取文件 'community.db'
community 已经是最新版本 0.0 B 0.00 B/s 00:00 [----------------------------------------] 0%
错误:无法从 mirrors.bfsu.edu.cn : Failed to connect to mirrors.bfsu.edu.cn port 443: 没有到主机的路由 获取文件 'archlinuxcn.db'
错误:无法升级 archlinuxcn (下载数据库出错)
错误:未能成功同步所有数据库

相关的 mirrorlist 文件如下

1
2
3
4
5
6
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
Server = https://mirrors.bfsu.edu.cn/archlinux/$repo/os/$arch
Server = http://mirrors.163.com/archlinux/$repo/os/$arch
Server = https://opentuna.cn/archlinux/$repo/os/$arch
Server = http://mirrors.aliyun.com/archlinux/$repo/os/$arch
Server = http://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch

解决过程

ping 镜像站

首先我尝试了 ping 镜像站,看看什么情况。经过测试发现无法 ping 通包括清华、北京外国语和网易在内的镜像站,但阿里云的镜像站可以 ping 通,并且可以通过 wget 下载源码。

与此同时,我在宿主机下可以 ping 通各个镜像站,浏览器上也可以正常访问这些镜像站。并且将 Windows 和 arch Linux 进行了互 ping,结果是 Windows 可以 ping 通 arch Linux,但是反过来不行。

检查 Windows 防火墙

考虑到这是 WSL2,我猜测是不是因为 Windows 的防火墙问题。

根据这个情况,我在这篇教程的指导下建立了相关的防火墙规则。

在启用了相关的防火墙规则并重启电脑后,重新执行sudo pacman -Syu发现可以正常更新了。

image-20210227131611413

提出疑问

于是我想了一下,问题真的是这样解决的吗?

我关闭了相关的防火墙规则并重启电脑,发现也可以正常更新 arch Linux。

考虑到上文提出的教程中是根据 WSL2 的 IP 地址建立相关的防火墙操作,我决定重新按照教程中的步骤查看一下宿主机和 WSL 的 IP 地址。

在查看了相关的 IP 地址后,我发现宿主机的地址是没有变化的,而 WSL 中的 IP 地址发生了改变,与防火墙规则中限定的 IP 地址并不相同。

查阅了相关资料后发现,WSL2 的网络适配器只有在 WSL2 被开启时才会建立,即每次重启电脑会自动删除这个适配器,直到启动 WSL 才会被建立。

通过实验也可以发现这一点:

开启 WSL2 时查看 Windows IP 地址

image-20210227132623705

重启电脑后查看 Windows IP 地址

image-20210227133147764

那如此一来,设立防火墙规则对于我的 WSL2 网络问题并不是一个解决方案(至少以我从现在看来)

现有结论

在现有的尝试下,我发现实际上我并不是依靠对 Windows 的防火墙设置来解决这个问题,而是通过重启这种玄学方法解决。

同时考虑到在家中我可以在 arch Linux 上正常访问各大镜像站,但在校园网下经常发生错误,这可能是导致错误的重要原因(但我现在还不太了解网络方面),只能在以后在找机会解决

重启可以解决 90% 的问题,重装可以解决 99% 的问题,重买可以解决 100% 的问题