刚帮朋友调试一台新装的Ubuntu服务器,他碰到的问题很有代表性:执行apt update速度慢到无法忍受,安装个nginx都要等好半天。这几乎是每个国内Ubuntu用户都会遇到的痛点。解决思路也不复杂,把系统默认的官方源切换到国内镜像站,我一般第一时间选阿里云。
这篇内容写给两种人看:一种是刚接触Linux、对apt源还停留在“会用但不懂”阶段的新手,另一种是需要在多台机器上批量配置源的老手。我会把“为什么换源”“怎么换源”“换完之后踩过的坑”一次性讲清楚,同时覆盖18.04、20.04、22.04、24.04这几个主流LTS版本的完整配置样例,尽量让你照着操作就能跑通。
1. 为什么要把系统源换成阿里云镜像
1.1 官方源慢的真实原因与镜像站的工作原理
Ubuntu系统安装完成后,软件源默认指向的是官方服务器地址。由于物理距离、国际出口带宽和链路拥堵等因素,国内用户访问官方源时延迟往往很高,经常出现几十KB/s的下载速度。这不是你网络的问题,而是访问路径决定的。
国内镜像站的原理其实很朴素:镜像站运营商定期从官方仓库同步一份完整数据到自己的机房,用户从就近的国内地址拉取软件包,网络延迟和带宽立刻得到改善。阿里云的Ubuntu镜像属于云厂商基础设施建设的一部分,同步频率高、带宽充足、覆盖面广,我用了几年稳定性都非常好。
需要说明的是,换源不会影响系统安全。镜像站的数据本身带GPG签名校验,软件包的哈希值也是完整保存的。也就是说,即便数据经过第三方镜像站转发,只要校验不通过,apt一样会拒绝安装。后面的章节我会专门讲GPG公钥机制,这里先记住一点:换源不是把安全关掉。
1.2 阿里云源与清华、中科大等镜像源的取舍
国内几个主流镜像站我都实际用过,分别是阿里云、清华TUNA、中科大USTC、网易等。从使用体验来说,阿里云源的稳定性和速度综合表现排在第一梯队,特别是ECS服务器之间内网访问时延迟极低。
选择阿里云源还有几个隐藏优势。一是阿里云的镜像站对IPv6和其他进阶协议支持比较完善;二是更新频率高,新版本软件发布后基本当天就能同步;三是在阿里云官方文档中有完整的源地址列表,出问题时方便排查。如果你用的是阿里云ECS,强烈建议换成阿里云源,同样的代码走内网负载,速度提升是按倍计算的。
清华和中科大的源本身也很好,尤其是某些特定网络环境下响应速度更优。我的习惯是:阿里云服务器、公司办公网络用阿里云源;如果所在网络访问某一家镜像站延迟特别高,就择机切换,不必死守一家。
1.3 动手前先确认系统版本
源配置文件的路径是/etc/apt/sources.list,其中最关键的是“版本代号”字段。Ubuntu每个发行版都有自己的代号(Codename),比如22.04对应Jammy Jellyfish,24.04对应Noble Numbat。如果代号写错,apt会去找不存在的目录,报出404错误。
确认自己系统版本最直接的方法,打开终端执行:
lsb_release -a输出中的Codename一栏就是要用到的字段。如果系统没有安装lsb-release,执行cat /etc/os-release也可以看到VERSION_CODENAME。这一步一定不能跳过,我见过太多人抄网上配置时没核对版本,把jammy的源写进focal的系统里,结果更新时报一串404错误,还以为源地址有问题。
2. 换源的完整实操流程
2.1 第一步:备份原有的源列表文件
换源之前备份,这个习惯必须养成。不管你在网上看到的是哪个版本的操作,动手改系统配置文件前先做备份,成本极低但收益极大。哪怕只是防止手误删除重要注释,备份也能让你随时回滚。
备份命令很简单:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak如果你是Ubuntu 24.04及更新版本,系统源被拆分成多个文件,存放在/etc/apt/sources.list.d/目录下,其中ubuntu.sources就是核心源文件。这种情况下备份命令是:
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak从前是用sources.list单一文件管理所有源,后来新版本引入了DEB822格式,把配置拆到了sources.list.d里。两种方式并行存在,操作前先用ls命令看一眼系统实际用的是哪一种布局,再决定备份哪个文件。
2.2 第二步:写入阿里云源地址
备份完成后,编辑源文件。传统方式是用vim或nano直接编辑,我推荐先清空再写入,避免残留的官方源地址造成冲突。
清空文件用:
sudo tee /etc/apt/sources.list << EOF ... EOF如果你用的是新版DEB822格式,则编辑/etc/apt/sources.list.d/ubuntu.sources,内容格式略有不同,需要把Types、URIs、Suites、Components字段改成阿里云的地址。
这里强调一个容易踩的坑:老教程里常见的archive.ubuntu.com和security.ubuntu.com两个官方域名,在阿里云源里其实也对应了不同路径。很多人只替换了第一个,把security字段遗漏或写错,结果apt update时依然有部分软件包走官方源,速度依然很慢。要替换就完整替换,别留尾巴。
2.3 各版本Ubuntu的具体源配置样例
为方便直接抄作业,我列出四个主流LTS版本对应的阿里云源配置。18.04及以下版本已经逐步退出标准支持期,建议尽早升级,这里我只列20.04、22.04、24.04和24.10这几个还在维护周期内的版本。
Ubuntu 20.04 Focal配置:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverseUbuntu 22.04 Jammy配置:
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverseUbuntu 24.04 Noble的DEB822格式配置(写入/etc/apt/sources.list.d/ubuntu.sources):
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 Types: deb URIs: http://mirrors.aliyun.com/ubuntu/ Suites: noble-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg注意24.04不再使用sources.list单文件,而是通过sources.list.d/下的.sources文件管理。配置中的Signed-By字段指向系统中已经安装的Ubuntu官方GPG密钥文件,这个字段非常关键,少了它apt会直接报错。
3. GPG公钥校验机制与密钥导入
3.1 为什么apt一定要校验GPG签名
很多刚接触Linux的人第一次遇到GPG公钥报错都会懵:error showing cache lock、NO_PUBKEY、The following signatures couldn't be verified...这些错误看着吓人,其实逻辑很简单。
软件源本质上是远程服务器上的文件仓库。如果没有任何校验机制,攻击者只要在传输链路中篡改软件包内容,系统就可能被植入恶意代码。GPG机制解决的就是信任问题:Ubuntu官方用私钥对Release文件签名,apt用预先安装的公钥验签。验签通过,说明数据确实来自官方且没有被修改过;验签失败,apt就拒绝继续执行。
这里需要理解一个关键点:阿里云的镜像站同步的是Ubuntu官方仓库数据,文件签名用的还是Ubuntu官方那把私钥。所以换阿里云源不需要导入阿里云自己的公钥,系统自带的Ubuntu公钥文件就能完成验证。
3.2 公钥缺失的三种正确解决办法
如果在apt update时看到NO_PUBKEY错误,多半是系统某种原因缺失了对应公钥。解决办法有三种,按推荐顺序排列。
第一种,用keyserver拉取,这也是我自己最常用的方式:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 需要填写的报错公钥ID报错信息里会完整显示缺失的指纹,把最后8位或完整指纹粘贴进去即可。注意Ubuntu 22.04后apt-key命令已经标记为废弃,虽然部分系统仍能用,但更推荐第二种方式。
第二种,直接安装公钥包。Ubuntu的公钥托管在官方软件包里,执行:
sudo apt-get install --reinstall ubuntu-keyring这个包内含Ubuntu官方全套GPG公钥,装完后一般能覆盖大多数源的校验需求。
第三种,手动下载公钥到指定目录。这种方式适合需要离线安装的场景,先在有网络的机器上导出公钥文件,再拷贝到/etc/apt/trusted.gpg.d/目录下。我个人不推荐把来源不明的公钥导入系统,除非你非常清楚这个公钥的出处。
4. 执行update与upgrade的正确姿势
4.1 apt update的输出怎么看
源配好之后,第一件事是更新软件源索引:
sudo apt update正常执行的输出会包含Get:1、Get:2这样的行,每一行对应一个源条目。有些条目显示Ign或者Hit,前者代表该条目被忽略,后者代表本地索引已经是最新版本,都不用担心。等到输出末尾出现Reading package lists... Done就说明更新成功了。
如果看到Err或404字样,说明源列表里有条目无法访问。常见原因包括网络不通、版本代号写错、源路径格式有误。处理方式是回到上一步检查sources.list或ubuntu.sources文件内容,不要被错误信息吓到。
我建议更新完源之后,顺便执行一次系统更新验证整体状态:
sudo apt upgradeupgrade之前先看一眼将要升级的软件包数量。如果是一台新安装的服务器,升级软件包是正常操作;但如果是运行重要服务的生产机器,建议慎重升级,尤其要避免跨大版本升级软件包。
4.2 升级前必看的包列表与几类升级场景
很多人习惯性执行apt upgrade -y直接升级全部,我强烈不建议在未查看包列表的情况下使用-y参数。正确做法是先用命令预览:
apt list --upgradable这个命令会列出所有可升级软件包、当前版本和目标版本。看到内核相关包时需要特别留意,因为内核升级后需要重启系统才能生效。如果你在跑关键服务,可以暂时排除内核包,等待维护窗口再处理。
升级场景大致分三类。第一类是刚装完系统后的全量升级,这种情况直接upgrade即可;第二类是日常安全更新,通常只涉及少量软件包,风险低;第三类是跨版本系统升级,比如从22.04升级到24.04,这时不应该用简单的apt upgrade,而是要用do-release-upgrade工具,过程更加复杂。换源后正常使用场景下,前两类比较常见。
这里还要提一个容易被人忽略的细节:每次apt update之后,apt会建立一份Package list缓存。如果源地址发生变化但缓存未刷新,后续安装软件时可能出现诡异错误。解决办法也很简单,就是每次更换源后一定先执行update,再执行安装或升级操作,顺序不要反。
5. 常见报错与排查思路
5.1 高频问题速查表
把这些问题整理成一张速查表,遇到问题时先对照自查,能节省大量时间。
| 报错现象 | 可能的原因 | 解决思路 |
|---|---|---|
| 404 Not Found | 版本代号写错或源路径错误 | 检查Codename,核对地址格式 |
| NO_PUBKEY | 系统中缺少对应源的公钥 | 重新安装ubuntu-keyring或拉取公钥 |
| Hash Sum mismatch | 本地缓存损坏或网络中断 | 清理/var/lib/apt/lists后重新update |
| Temporary failure resolving | DNS解析失败 | 检查网络连通性和DNS配置 |
| E: Unable to locate package | update未执行或源不含该软件包 | 先执行apt update再查询 |
| Release file expired | 系统时间错误 | 同步系统时间后重试 |
| apt-key is deprecated | 使用了废弃命令 | 改用ubuntu-keyring或DEB822格式 |
这几类问题我基本都在真实环境中遇到过。比如Hash Sum mismatch,很多时候是因为上次update时网络中断,部分列表文件下载不完整,清理后重新下载即可解决。Release file expired则往往和主板时间不准有关,尤其双系统用户,时间漂移会导致apt认为源文件的签名过期。
5.2 三个让我印象深刻的排查案例
第一个案例,某台服务器切换阿里云源后始终报404。检查源文件时发现把jammy写成了jammmy,多打了一个字母。这种低级错误反而最隐蔽。我的建议是,粘贴配置样例后不要急着执行,先用cat检查一遍,再执行update。
第二个案例,apt update始终卡在一个条目上不动。排查发现是域名解析慢,DNS配置指向了一个不稳定服务器。将DNS改成公共DNS后立即恢复正常。很多源更新慢的问题,根源其实不在源,而在DNS解析。
第三个案例,Hash Sum mismatch反复出现。清理缓存、更换源都没用,最后发现是某层网络设备对HTTPS流量做了缓存劫持。这种场景在办公网络里并不算罕见,换用HTTP协议源地址后问题消失。虽然HTTP源本身少了传输层加密,但apt的GPG校验机制依然能保证数据完整性,所以安全性上倒是不用太担心。
6. 锦上添花:桌面版换源与周边生态源配置
6.1 图形界面换源与服务器版最小化配置
如果你在桌面版Ubuntu上操作,图形化换源更直观。打开“软件和更新”(Software & Updates),在“Ubuntu软件”选项卡的“下载服务器”下拉菜单里选择“其他”,搜索aliyun并选中即可。系统会自动替换源列表,并在后续更新时提示输入用户密码。
图形界面的好处是省去了手写配置的麻烦,也不容易写错版本代号。但服务器版通常没有图形界面,必须走命令行路线。我的做法是写一个简单的部署脚本,在需要批量配置多台机器的场景下可以显著节省时间。
部署脚本的核心逻辑是备份原文件、写入阿里云源、执行apt update三步。用变量保存版本代号,就能自动适配不同系统版本。脚本编写时注意加set -e,任何一步失败立即退出,避免半配置状态。
6.2 顺带配置Python和Node的镜像源
换完apt源后,建议顺手把Python的pip镜像、Node的npm镜像也换成阿里云源。开发环境里这两个工具的下载速度同样是痛点。
pip换源只需修改或创建~/.pip/pip.conf文件,写入国内地址。npm同理,执行npm config set registry时指定阿里云镜像。这两个源在阿里云镜像站里都长期维护,速度和apt源保持一致。
如果你平时使用Docker,也可以顺手配置Docker镜像加速器,配置文件在/etc/docker/daemon.json中。这些操作虽然和Ubuntu的源不是一回事,但本质都是“访问海外资源速度慢,改成国内镜像”的需求。搭配使用后,整个开发链条的下载效率都会明显提升。
我个人在实际操作中的体会是,换源这件事技术门槛不高,但非常考察细心程度。版本代号、文件路径、公钥状态,这三个关键点只要有一个出问题,后续就会冒出各种莫名其妙的报错。写这篇内容时,我又回顾了一遍自己从踩坑到熟练的过程,最想提醒大家的还是那句老话:动手之前先备份,改完之后先update。这套流程熟练之后,二三十秒就能完成一台机器的源切换,剩下的时间拿来做真正有价值的事情,不香吗。