1. 从报错到定位:这个报错背后发生了什么
先说结论:Could not resolve 'mirrors.aliyun.com'的本质是 DNS 解析失败。它不是你敲错了地址,也不是阿里源挂了,而是你的系统问 DNS 服务器"mirrors.aliyun.com 对应的 IP 是什么"时,没有得到一个有效的回答。
很多人在这一步就慌了,以为是源的问题,跑去换清华源、中科大源,结果发现报错依然存在,只是域名从 mirrors.aliyun.com 换成了 mirrors.tuna.tsinghua.edu.cn。这说明思路从一开始就偏了——问题不在"哪个源",而在"你能不能解析到源服务器的地址"。
这个报错的完整链路是这样的:当你执行apt update时,APT 会去读/etc/apt/sources.list里的源地址,然后系统需要把这个域名解析成 IP 才能发起 HTTP 请求。如果解析失败,APT 就会抛出Could not resolve的错误,命令直接终止。整个过程里,真正出问题的环节是 DNS 查询,而不是 APT 本身。
从这几个月的社区反馈来看,这个报错在 Ubuntu 用户中出现的频率相当高,尤其是刚装完系统的新手。原因也很有代表性:Ubuntu 默认使用 systemd-resolved 管理 DNS,而这个服务在某些场景下(比如手动改过网络配置、虚拟机里装系统、或者网络环境切换过)会产生异常,导致解析功能失效。
这篇文章我就按实际的排查顺序来写,从现象出发,逐步定位到根因,再给出修复方案。最后补上我在多次踩坑后总结的换源完整流程和一些平时文档里不会写的细节。
2. 环境确认与故障复现:先别急着改配置
2.1 确认系统版本和当前源配置
排查任何一个问题,第一步都是先搞清楚"我在哪"。Ubuntu 不同版本的源配置路径和默认网络管理方式有差异,盲目执行网上的命令很容易越改越乱。
先看系统版本:
lsb_release -a正常情况下会输出类似下面的信息:
Distributor ID: Ubuntu Description: Ubuntu 24.04.2 LTS Release: 24.04 Codename: noble注意Codename这一行,它决定了你换源时要写的内容。不同版本的代号完全不同:24.04 是 noble,22.04 是 jammy,20.04 是 focal。如果你在网上抄了一个源配置,但粘贴进去的内容和你系统版本不匹配,虽然报错不是 Could not resolve,但同样会让你折腾半天。
看完版本后,看当前的源文件:
cat /etc/apt/sources.list如果你的系统是 24.04 之后的版本,执行cat /etc/apt/sources.list可能会发现文件是空的,或者提示没有这个文件。这是因为新版 Ubuntu 把软件源配置迁移到了/etc/apt/sources.list.d/ubuntu.sources,格式也从原来的单行 deb 地址变成了 DEB822 格式。这个变化让很多从旧版本升级上来的用户懵了,因为他们对着旧教程找sources.list,找半天找不到,然后开始瞎折腾。
2.2 复现错误并记录完整报错信息
确认了环境之后,先执行一次apt update复现问题,然后把完整报错信息记录下来:
sudo apt update一个典型的报错输出长这样:
Err:1 http://mirrors.aliyun.com/ubuntu noble InRelease Could not resolve 'mirrors.aliyun.com' Reading package lists... Done Building dependency tree... Done Reading state information... Done All packages are listed in the package list.注意看了,这个报错里有几个关键字:Err表示错误,Could not resolve表示解析失败,后面跟的是具体的域名。如果报错前面还有一个 IP 地址,比如Could not resolve 'mirrors.aliyun.com' (8.8.8.8),那说明系统明确去问了 8.8.8.8 这台 DNS 服务器但没有得到答复。
完整信息的价值在于:它能告诉你系统当前使用的 DNS 服务器是哪台,这直接决定了下一步的排查方向。
3. 逐步排查链路:从网络连通性到 DNS 解析全过程
这一部分是整篇文章的核心。我不是直接给答案,而是按真实踩坑时的排查顺序来写。你跟着走一遍,以后遇到类似问题都能自己解决。
3.1 第一步:Ping 测试判断网络基础连通性
先看最基础的网络通不通:
ping -c 4 223.5.5.5这里没有用域名而是直接 ping IP,是为了跳过 DNS 解析环节,纯测网络链路。如果 ping 不通,可能是网卡配置、路由或物理连接的问题;如果 ping 得通,说明网络是通的,问题就在 DNS 解析环节。
接下来 ping 外网域名:
ping -c 4 www.baidu.com- 如果域名 ping 不通但 IP ping 得通,基本可以断定 DNS 解析有问题。
- 如果两者都通,情况就比较奇怪了,需要进一步测试。
我遇到的大多数情况都是"IP 通、域名不通",这基本上就把问题锁定在 DNS 上了。
3.2 第二步:解析测试确认 DNS 是否生效
确认网络通之后,用dig或nslookup做一次显式解析:
nslookup mirrors.aliyun.com如果系统没装nslookup,用下面这个命令安装:
sudo apt install dnsutils不过这里有个尴尬的地方:如果你连 apt 都用不了,安装 dnsutils 也会报错。这时候用getent或者 Python 来查也行。优先推荐getent,因为它不需要额外装东西:
getent hosts mirrors.aliyun.com如果返回了 IP 地址,说明系统层面可以解析,问题可能出在 APT 的配置上;如果没有返回,说明系统层面就解析不了。
3.3 第三步:检查 DNS 配置文件
明确了 DNS 解析有问题之后,查看当前系统配置的 DNS 服务器:
cat /etc/resolv.conf这里有个非常典型的坑:在 Ubuntu 22.04 及之后的版本中,/etc/resolv.conf是一个软链接,指向/run/systemd/resolve/stub-resolv.conf,里面写的 DNS 是127.0.0.53这个本地回环地址。这不是错误,而是 systemd-resolved 的 stub 模式——系统把 DNS 查询都转发给本地 systemd-resolved 服务,再由它转发给上游真实 DNS。
如果你在这个文件里看到的是127.0.0.53,说明 systemd-resolved 在接管 DNS;如果你看到的是一串真实 IP,说明系统直接使用该 IP 解析。两种情况对应着不同的修复思路。
3.4 第四步:测试 systemd-resolved 的解析状态
既然/etc/resolv.conf指向的是 systemd-resolved,那要看的就不仅是配置,还要看这个服务本身的状态:
systemd-resolve --status在新版系统上,命令变成了:
resolvectl status这个命令输出很长,重点看DNS Servers和Current DNS Server两行。如果这里显示的是空值,或者指向了一个失效的 DNS 服务器,就能解释为什么解析失败了。
再做一个针对性测试:
resolvectl query mirrors.aliyun.com如果返回resolve call failed,说明 systemd-resolved 这个服务本身有问题。最常见的两种原因:一是上游 DNS 配置成了不可达的地址(比如之前设的某个内网 DNS,换了个网络环境后就失效了);二是服务内部状态异常,需要重启。
3.5 第五步:检查网络管理器的覆盖配置
Ubuntu 桌面版使用 NetworkManager 管理网络,服务器版使用 netplan。这两个工具都有可能覆盖 systemd-resolved 的配置,所以光改/etc/resolv.conf是治标不治本的——下次重启或者重新连接网络,配置会被恢复。
Netplan 的配置文件在/etc/netplan/目录下,查看当前配置:
ls /etc/netplan/ cat /etc/netplan/*.yaml看到类似下面的内容:
network: version: 2 ethernets: ens33: dhcp4: true这个配置表示网卡通过 DHCP 获取 IP 和 DNS。如果 DHCP 服务器没有下发有效的 DNS,或者下发的 DNS 本身有问题,就会出现解析失败。
4. 修复方案详解:三种经过验证的有效路径
4.1 方案一:直接指定可信的公共 DNS
如果确定是 DNS 配置问题,最快的修复方式是把系统 DNS 指向一个公共 DNS。这里我推荐 223.5.5.5(阿里 DNS)和 119.29.29.29(腾讯 DNS),前者和阿里源配套使用延迟最低,后者在国内的稳定性也不错。
对于使用 netplan 的服务器版,修改配置文件:
network: version: 2 ethernets: ens33: dhcp4: true nameservers: addresses: - 223.5.5.5 - 119.29.29.29注意缩进必须严格对齐,YAML 对缩进非常敏感。改完应用配置:
sudo netplan apply应用之后,再用getent hosts mirrors.aliyun.com验证一次,如果返回 IP 地址,说明修复成功。
4.2 方案二:重置 systemd-resolved 服务
如果修改配置后依然解析失败,大概率是 systemd-resolved 服务本身状态异常。这个服务的状态异常有时候很隐蔽——配置文件看起来没问题,但服务内部的状态已经乱了。
重启服务:
sudo systemctl restart systemd-resolved重启后确认服务状态:
systemctl status systemd-resolved输出里应该有active (running)字样。如果服务处于 failed 状态,查看详细日志:
journalctl -u systemd-resolved --no-pager -n 50日志末尾会告诉你服务为什么起不来。常见原因包括端口被占用、配置文件语法错误等。
4.3 方案三:临时绕过 systemd-resolved(不推荐但应急有效)
在某些极端情况下,systemd-resolved 怎么修都修不好,但你又急着要装软件。这时候有一个临时的应急方案:直接把/etc/resolv.conf指向真实 DNS。
先备份原始文件:
sudo mv /etc/resolv.conf /etc/resolv.conf.bak然后新建一个使用真实 DNS 的文件:
sudo bash -c 'echo "nameserver 223.5.5.5" > /etc/resolv.conf'这个方案能让系统立刻恢复解析功能,但有一个副作用:因为/etc/resolv.conf不再是软链接,而是变成了一个普通文件,NetworkManager 或 systemd-resolved 后续不会再管理它。这意味着你手动指定的 DNS 会一直生效,即使网络环境变了也不会自动更新。
所以我只建议把它当作应急手段,问题修好之后还是要把 systemd-resolved 恢复正常,然后把软链接恢复回去:
sudo rm /etc/resolv.conf sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf4.4 排查中的其他常见干扰因素
上面三个方案覆盖了绝大多数情况,但如果你依然解决不了,再检查下面几个点。
IPv6 问题:某些网络环境下 IPv6 DNS 不可达,但系统优先尝试 IPv6 解析,导致超时。可以用下面的命令查看系统是否优先使用 IPv6:
cat /proc/sys/net/ipv6/conf/all/disable_ipv6如果输出为 0,说明 IPv6 是开启状态,但这本身不一定是问题。更有效的排查方式是看解析超时的时间——如果每次报错都要等很久才出结果,IPv6 超时的嫌疑就很大。
代理设置:如果你之前配置过代理,APT 会尝试通过代理访问源站。代理服务器的 DNS 解析有可能会失败。检查代理环境变量:
env | grep -i proxy如果有输出,说明有代理环境变量在生效。检查 APT 的代理配置:
cat /etc/apt/apt.conf.d/*proxy*防火墙或安全组:某些云服务器或公司网络会限制对特定 IP 段的访问。虽然阿里源没有听说过被大规模封锁的情况,但你的网络环境确实可能出现特殊限制。可以用curl直接测试是否能连通阿里源 IP:
curl -I http://mirrors.aliyun.com如果 curl 能通而 apt 不通,问题大概率在 APT 的配置上,而不是网络。
5. 修复之后的完整换源操作:从备份到验证
DNS 问题解决之后,才真正进入换源的正式环节。这里我按完整的操作流程走一遍,每一步都带上为什么这样做。
5.1 备份原始源文件
改任何系统配置文件之前,第一件事永远是备份。这不是形式主义,而是出了问题能让你三秒钟恢复到原始状态:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup.$(date +%Y%m%d)对于 24.04 及之后的版本:
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.backup.$(date +%Y%m%d)把日期加到备份文件名里,是个我自己用了很多年的习惯。改配置最怕的就是改坏了之后想回滚,结果发现备份文件被覆盖了。加个日期虽然只是一个小动作,但能让你在需要回滚时快速找到正确时间点的版本。
5.2 选择阿里源并写入配置
我身边不少人觉得选源很纠结,阿里、清华、中科大、华为各有支持者。但从实际体验来看,国内这些大厂的开源镜像站在核心软件包同步上基本没有明显差距,最大的区别反而可能在于你当前网络环境到各个机房的物理延迟。如果你是北方电信的网络,使用阿里源通常延迟低一些;如果是教育网环境,清华源可能有更好的路由。
这里直接用阿里源为例。对于 22.04 及之前的版本,编辑/etc/apt/sources.list:
sudo vim /etc/apt/sources.list把文件内容全部替换为:
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse注意这里的jammy是 22.04 的代号。如果你是 24.04,把jammy换成noble;如果是 20.04,换成focal。如果你不确定自己的代号,回到文章开头,执行lsb_release -a查看 Codename 就行。
5.3 新版系统的 DEB822 格式处理
如果你用的是 24.04 或更新的版本,情况会不一样。新版系统的源配置在/etc/apt/sources.list.d/ubuntu.sources,格式是 DEB822:
Types: deb URIs: http://mirrors.aliyun.com/ubuntu/ Suites: noble noble-updates noble-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg要把这个文件指向阿里源,直接改 URIs 那一行就行,其他内容保持原样。Suites 里的noble对应 24.04,如果你是其他版本,替换成对应代号。这里建议大家优先使用 sed 命令做精准替换,而不是手动删改整个文件——直接编辑整个文件容易误删 Signed-By 行,导致后续 apt update 报公钥错误:
sudo sed -i 's|http://archive.ubuntu.com/ubuntu/|http://mirrors.aliyun.com/ubuntu/|g' /etc/apt/sources.list.d/ubuntu.sources5.4 更新软件源缓存
配置写完之后,执行更新:
sudo apt update这次如果看到类似下面的输出,就说明换源成功了:
Hit:1 http://mirrors.aliyun.com/ubuntu noble InRelease Hit:2 http://mirrors.aliyun.com/ubuntu noble-updates InRelease Hit:3 http://mirrors.aliyun.com/ubuntu noble-backports InRelease Reading package lists... Done Building dependency tree... Done Reading state information... DoneHit表示连接成功且元数据没有变化。看到全是Hit基本不用担心,这是正常现象。如果出现Get,说明下载了新的元数据,也不用担心。真正需要关注的是Err和Ign开头的行,遇到Err要仔细看报错信息。
5.5 升级软件包(可选)
如果你不仅想换源,还想顺便把系统软件包升级到最新版本:
sudo apt upgrade这一步会把所有已安装的软件包升级到软件源中的最新版本。第一次执行可能需要下载大量数据,耗时比较长,建议在稳定的网络环境下执行。
6. 安全校验与日常使用中的经验细节
6.1 GPG 密钥验证机制
很多刚接触 Ubuntu 的人不理解为什么换源后apt update会报公钥错误。这里补充一下背景:APT 每次获取软件包元数据时,都会验证这些数据是否由 Ubuntu 官方密钥签名。当你换源之后,APT 还会在元数据中找到由阿里源签名的 Release 文件以及对应的 InRelease 文件,里面包含了 Ubuntu 官方公钥的签名。
在新版本 Ubuntu 中,源配置默认通过Signed-By指定密钥文件路径,路径指向/usr/share/keyrings/ubuntu-archive-keyring.gpg。这个机制保证了即使你换成了阿里源或清华源,APT 依然会验证软件包的官方签名,从而防止源被篡改后下发恶意软件。这一点也是为什么推荐大家使用官方镜像站而不是网上随便找的源地址——因为这些镜像站不会改动上游的签名信息。
如果你在apt update时遇到公钥报错,比如The following signatures couldn't be verified because the public key is not available,先检查你的输出内容是不是把Signed-By行删了或者指向了不存在的文件。绝大多数公钥报错都是源配置不完整导致的。
6.2 阿里源与清华源的选择逻辑
这个问题没有标准答案,我在实际使用中的体会是:核心目的只是让 apt 能正常下载软件,清华源和阿里源在软件包同步速度上差距很小,真正有影响的是你当前网络到镜像站的延迟和带宽。
具体可以做一个简单测试来判断:
time curl -s -o /dev/null http://mirrors.aliyun.com/ubuntu/dists/noble/InRelease time curl -s -o /dev/null http://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/noble/InRelease哪个耗时短,就选哪个源。这个测试结果会受网络环境波动影响,但大体上能反映你当前网络到两个源站的连接质量。
6.3 换源后常见问题的排查思路
换源成功不等于一劳永逸。后续你可能会遇到下面几个高频问题,简单列一下排查思路。
换源后 apt update 依然报错:先确认 sources.list 里的代号是否和系统版本一致,再用curl -I <源地址>测试源站连通性。两个都正常的情况下,基本能把问题锁定在 DNS 或者网络管理服务。
下载速度没有明显提升:有些时候,换源之后速度还是很慢,甚至比默认源还慢。这可能是因为阿里源在高峰期带宽紧张,也可能是因为你的网络运营商和源站之间的互联链路不够好。可以换个源再试一次,别在一个源上死磕。
系统升级后源配置被还原:Ubuntu 大版本升级时(do-release-upgrade),系统可能会自动重置源配置。升级后检查一下/etc/apt/sources.list或/etc/apt/sources.list.d/ubuntu.sources,确认配置是否还是你之前设置的镜像源。
6.4 systemd-resolved 与 Docker 的 DNS 冲突
如果你在 Ubuntu 上装 Docker,可能会遇到一个和本文相关的经典问题:容器内无法解析域名。原因是 Docker 默认把 DNS 设置为127.0.0.53(即宿主机的 systemd-resolved),但 systemd-resolved 的 stub 模式在某些条件下无法正确处理来自 Docker 容器网络的 DNS 查询。
解决方式是修改 Docker 的 daemon.json,把 DNS 指向真实可用的公共 DNS:
sudo vim /etc/docker/daemon.json写入:
{ "dns": ["223.5.5.5", "119.29.29.29"] }重启 Docker:
sudo systemctl restart docker这个问题和换源遇到的问题同源——都是 DNS 解析链路在某个环节断了。理解了 systemd-resolved 的工作原理,这类问题基本都能找到一个清晰的排查路径。
7. 写在最后的几点实际体会
这次踩坑让我最深的感触是:排查问题的关键不是背命令,而是理解系统各组件之间的关系。你看到Could not resolve报错时,脑子里应该有一个清晰的链条:apt 请求域名 → 系统查 /etc/resolv.conf → 请求转发到 systemd-resolved → systemd-resolved 向上游 DNS 查询 → 返回 IP → 建立连接。
每一步对应着不同的配置文件和排查方式。当你把这条链路理解清楚了,不管报错的是阿里源还是清华源,不管是 Could not resolve 还是 Temporary failure in name resolution,你都有一套稳定的排查方法,而不是四处搜教程碰运气。
另外一个小建议:如果条件允许,尽量让 DNS 配置保持自动获取,不要手动固定。手动固定 DNS 在一时能解决问题,但换了个网络环境后忘记改回来,反而会造成新的问题。systemd-resolved 不是洪水猛兽,它在绝大多数场景下工作得很好,出了问题优先修复它,而不是绕过它。
最后再提醒一句:本文给出的所有命令都建议在理解了作用之后再执行,尤其是涉及删除和覆盖文件的命令。命令行操作没有"撤回"功能,谨慎永远是对的。