Ubuntu 24.04 在软件源管理上做了一次不小的改动,过去我们熟悉的/etc/apt/sources.list单文件写法,现在被拆成了/etc/apt/sources.list.d/目录下的.sources文件,用的是 deb822 格式。这个变化看起来只是文件格式换了,但实际操作过的人都知道,网上大量老教程还在教你改sources.list,照着做要么不生效,要么直接报错。这篇内容就是把我自己在 Ubuntu 24.04 LTS 上换源的完整过程、踩过的坑、以及为什么新格式要这么设计,一次性讲清楚。不管你是刚装完系统的新手,还是从 22.04 升级上来发现源配置变了的老用户,都能直接照着操作。
1. 为什么 Ubuntu 24.04 要改用 .sources 格式
1.1 从 sources.list 到 deb822 的演进逻辑
先说说这个变化的背景。传统的sources.list格式,每一行就是一条源记录,长这样:
deb http://archive.ubuntu.com/ubuntu noble main restricted universe multiverse这种格式简单直接,但它有个硬伤:一行里塞了太多信息,源地址、发行版代号、组件列表全挤在一起,想加个架构限制或者签名选项,就得在行尾追加方括号参数,越写越长,可读性越来越差。而且同一个源的不同组件要写多行,重复信息很多。
deb822 格式借鉴了 Debian 控制文件的写法,用键值对的方式组织,一个源就是一个段落,字段清晰:
Types: deb URIs: http://archive.ubuntu.com/ubuntu Suites: noble noble-updates noble-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg这么改的好处很实在。第一,一个文件可以同时描述多个套件(Suites),不用像以前那样每个套件写一行。第二,Signed-By字段让签名密钥的指定变得明确,不再依赖全局的 trusted.gpg 机制,安全性更好。第三,字段化的结构方便脚本解析和程序化生成,对做自动化运维的人来说友好很多。
Ubuntu 从 24.04 开始,默认安装就把源配置放在了/etc/apt/sources.list.d/ubuntu.sources这个文件里,而/etc/apt/sources.list变成了一个空文件或者只剩注释。这就是为什么你按老教程改sources.list会发现根本没反应——APT 压根不读那个文件了。
1.2 新旧格式的字段对照关系
要把老源改成新格式,得先搞清楚字段怎么对应。我整理了一张对照表,照着填就不会错:
| 旧格式位置 | 新格式字段 | 说明 |
|---|---|---|
| 行首 deb / deb-src | Types | deb 表示二进制包,deb-src 表示源码包 |
| 第一个 URL | URIs | 源地址,可以写多个,空格分隔 |
| 发行版代号 | Suites | 如 noble、noble-updates、noble-backports |
| 组件列表 | Components | main、restricted、universe、multiverse |
| 方括号内参数 | Architectures / Signed-By 等 | 独立字段,不再挤在方括号里 |
这里有个细节要注意:Suites字段可以一次写多个值,比如noble noble-updates noble-security,这样一条记录就覆盖了主源、更新源和安全源。而旧格式里这三个是要分三行写的。很多人换源时只改了主源,忘了更新源和安全源,结果apt update时部分索引还是走官方源,速度上不去,就是这个原因。
1.3 换源到底解决了什么问题
说白了,换源就是把 APT 拉取软件包索引和安装包的地址,从官方源换成地理位置更近、带宽更充足的镜像源。官方源archive.ubuntu.com在国内访问经常慢得让人抓狂,apt update卡在Waiting for headers或者Connecting to ...半天不动,装个几十兆的包要等好几分钟。
换成国内镜像源之后,同样的操作通常几秒到十几秒就能完成。这不是玄学,是物理距离和网络链路决定的。镜像站会定期从官方源同步,同步周期一般是几小时到一天,所以软件包版本可能比官方源稍微滞后一点点,但对日常使用来说完全无感。
需要强调的是,换源只影响 APT 这个包管理器的下载地址,不会改变系统本身,也不会影响你已经装好的软件。换源失败最坏的情况就是apt update报错,把配置改回去就恢复了,风险很低。但前提是你得改对文件、写对格式。
2. 动手之前:确认你的系统状态和备份策略
2.1 先搞清楚当前源配置长什么样
动手之前别急着改,先看一眼现状。执行:
cat /etc/apt/sources.list.d/ubuntu.sources正常情况下你会看到类似这样的内容:
Types: deb URIs: http://archive.ubuntu.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://security.ubuntu.com/ubuntu/ Suites: noble-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg注意这里分了两段:一段是主源加更新源加 backports,另一段是安全源。安全源单独走security.ubuntu.com,这个地址在换源时也要一起换掉,否则安全更新还是慢。
同时确认一下/etc/apt/sources.list的状态:
ls -l /etc/apt/sources.list如果这个文件是空的或者只有注释行,说明系统已经完全使用新格式了。如果里面还有内容,那可能是从旧版本升级上来的,需要一并处理。
2.2 备份是必须的,但备份方式有讲究
我见过太多人换源前不备份,改错了之后对着报错发呆。备份很简单:
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak但这里有个坑:.sources.bak这个后缀 APT 不会读取,所以备份文件放在同目录下是安全的。如果你备份成ubuntu.sources.old也没问题。但千万别备份成ubuntu.sources之外的、以.sources结尾的名字,比如ubuntu-backup.sources,那样 APT 会把它也当成源配置读进去,导致重复源或者冲突。
另外,如果你之前手动往sources.list.d/里放过其他.list或.sources文件(比如装 Docker、添加 PPA 时生成的),换源时不要动它们,只改ubuntu.sources这一个文件就行。那些第三方源有自己的地址,跟系统源是两码事。
2.3 选哪个镜像源:不是越快越好
国内常用的 Ubuntu 镜像源有清华 TUNA、阿里云、中科大 USTC、华为云、网易等。选哪个?我的经验是:
- 清华 TUNA:同步频率高,包全,教育网友好,但高峰期偶尔会慢。
- 阿里云:公网访问稳定,企业用户多,速度均衡。
- 中科大 USTC:教育网老牌镜像,稳定可靠。
- 华为云:近几年质量提升明显,南方用户访问体验好。
实际选择时,不用纠结太久。可以先 ping 一下或者用curl测一下响应速度:
curl -o /dev/null -s -w '%{time_total}\n' http://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/noble/Release哪个快用哪个。但要注意,有些镜像站对 HTTPS 支持更完善,建议优先用 HTTPS 地址,避免明文传输被篡改的风险。清华和阿里都支持 HTTPS。
提示:不要同时配置多个镜像源指向同一个套件。有人想着"多配几个源是不是更快",实际上 APT 会依次尝试,反而可能因为某个源响应慢拖累整体速度,还可能引发哈希校验冲突。
3. 手把手改写 ubuntu.sources 文件
3.1 用编辑器打开并替换内容
推荐用nano或者vim,新手用nano更友好:
sudo nano /etc/apt/sources.list.d/ubuntu.sources把里面的内容全部替换成清华源的配置(以 noble 为例):
Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ Suites: noble noble-updates noble-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ Suites: noble-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg注意几个关键点。第一,URIs末尾的斜杠建议保留,虽然不加通常也能工作,但加上更规范。第二,安全源也换成了清华的地址,因为清华镜像站同时同步了 security 仓库。第三,Signed-By保持不变,因为镜像站同步的是官方签名的包,用的还是 Ubuntu 官方密钥。
如果你用的是阿里云,把URIs换成:
URIs: https://mirrors.aliyun.com/ubuntu/中科大则是:
URIs: https://mirrors.ustc.edu.cn/ubuntu/3.2 发行版代号千万别写错
Suites字段里的noble是 Ubuntu 24.04 的代号。这个必须和你的系统版本严格对应,写错了会报404 Not Found或者Release file not found。
查自己系统代号的方法:
lsb_release -cs输出noble就对了。如果你是从 22.04 升级上来的,代号应该是noble,但升级过程中可能残留了jammy的配置,需要检查清理。
各版本代号对照:
| 版本 | 代号 |
|---|---|
| Ubuntu 22.04 LTS | jammy |
| Ubuntu 24.04 LTS | noble |
| Ubuntu 24.10 | oracular |
| Ubuntu 25.04 | plucky |
注意:不要把
Suites写成noble/updates这种带斜杠的形式,那是旧格式的写法。新格式里更新源就是noble-updates,安全源是noble-security,backports 是noble-backports。
3.3 保存后立即验证配置语法
改完保存,先别急着apt update,用apt-get的配置检查功能验证一下:
sudo apt-get update如果输出里出现Hit、Get、Reading package lists... Done,说明配置生效了。如果出现E: Malformed entry或者E: The list of sources could not be read,那就是格式写错了,回去检查字段名拼写、冒号后面有没有空格、段落之间有没有空行。
deb822 格式对缩进不敏感,但字段名必须准确,冒号必须是英文冒号,字段和值之间至少一个空格。段落之间用空行分隔,同一个段落内字段顺序无所谓。
我建议第一次改完后,先跑一次apt update看结果,确认没问题再继续装软件。如果报错,把备份文件恢复回去:
sudo cp /etc/apt/sources.list.d/ubuntu.sources.bak /etc/apt/sources.list.d/ubuntu.sources sudo apt update4. 换源后 apt update 报错的排查链路
4.1 报错信息分类与对应原因
换源后最常见的报错就那么几类,我把它们和原因对应起来,方便你对号入座:
| 报错关键词 | 可能原因 |
|---|---|
Malformed entry | 字段名拼写错误、缺少冒号、格式不符合 deb822 |
404 Not Found | Suites 代号写错,或镜像站没有对应仓库 |
Release file not found | 同上,或镜像站同步不完整 |
NO_PUBKEY | 签名密钥缺失,通常出现在第三方源 |
Hash Sum mismatch | 镜像站同步中,索引和包不一致,稍后重试 |
Could not resolve | 网络问题或 URIs 地址写错 |
Connection timed out | 镜像站不可达,换一个源 |
4.2 一个真实的排查过程
我有一次帮朋友处理,他换完源apt update报:
E: Malformed entry 1 in sources file /etc/apt/sources.list.d/ubuntu.sources (URI parse) E: The list of sources could not be read.URI parse说明地址解析失败。我让他把文件内容发过来,发现他写的是:
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu Suites: noble noble-updates noble-backports看起来没问题?但仔细看,他把Types字段漏了。deb822 格式里Types是必填字段,没有它 APT 不知道这是二进制源还是源码源,解析直接失败。补上Types: deb就好了。
还有一次是Suites写成了Noble,首字母大写。deb822 的字段值区分大小写,Noble不等于noble,结果就是找不到对应仓库。这种错误很隐蔽,因为肉眼看过去差不多。
4.3 用 apt 的调试选项定位问题
如果报错信息不够明确,可以加调试参数:
sudo apt-get update -o Debug::Acquire::http=true这会打印出详细的 HTTP 请求过程,能看到 APT 到底在请求哪个 URL,返回了什么状态码。如果看到请求的是https://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/Noble/Release,那就说明代号大小写有问题。
另一个有用的命令是:
sudo apt-get indextargets它会列出 APT 当前认为需要获取的所有索引目标,能帮你确认配置是否被正确解析。
4.4 换源失败后的回滚操作
排查超过十分钟还没头绪,别硬扛,直接回滚:
sudo cp /etc/apt/sources.list.d/ubuntu.sources.bak /etc/apt/sources.list.d/ubuntu.sources sudo apt update回滚后如果正常,说明问题出在你改的内容上,可以对照本文的格式重新改一遍。如果回滚后还是报错,那可能是系统本身有其他问题,比如/etc/apt/sources.list里有残留的旧配置冲突,或者/etc/apt/sources.list.d/下有其他损坏的文件。
检查目录下所有源文件:
ls -la /etc/apt/sources.list.d/把不认识的、非必要的文件临时移走再试。
5. 换源之外的几个关联操作
5.1 清理旧的 sources.list 残留
从 22.04 升级到 24.04 的系统,/etc/apt/sources.list里可能还留着旧格式的源。虽然 24.04 的 APT 默认不读这个文件,但为了干净,建议把它清空或注释掉:
sudo nano /etc/apt/sources.list把里面的deb开头的行全部注释掉(行首加#),或者直接清空文件内容。这样能避免以后排查问题时产生混淆。
5.2 第三方源的 .sources 文件也要注意格式
如果你装了 Docker、添加了 PPA,sources.list.d/下会有对应的.sources或.list文件。Docker 官方现在也推荐用 deb822 格式,它的文件长这样:
Types: deb URIs: https://download.docker.com/linux/ubuntu Suites: noble Components: stable Signed-By: /etc/apt/keyrings/docker.asc注意它的Signed-By指向的是 Docker 自己的密钥文件,不是 Ubuntu 的。换系统源时不要动这个文件,两者互不影响。
5.3 换源后建议做一次完整升级
源换好、apt update正常之后,建议跑一次:
sudo apt upgrade -y把已有软件包更新到镜像源里的最新版本。如果之前因为官方源太慢一直没更新,这一步可能会下载不少东西,但速度会比之前快很多。
如果内核有更新,apt upgrade会提示你重启。重启前确认没有正在运行的重要任务。
5.4 关于 apt 缓存的清理
换源后,旧的包索引缓存还在/var/lib/apt/lists/里。虽然apt update会覆盖更新,但如果遇到奇怪的哈希校验问题,可以手动清一下:
sudo rm -rf /var/lib/apt/lists/* sudo apt update这个操作是安全的,只是清空索引缓存,不会删除已安装的软件。清完后重新apt update会从新源重新拉取索引。
6. 几个容易被忽略的细节和我的实操心得
6.1 HTTPS 还是 HTTP
清华、阿里、中科大现在都支持 HTTPS。用 HTTPS 的好处是传输加密,防止中间人篡改包索引。虽然 APT 本身有 GPG 签名校验,但 HTTPS 多一层保护没坏处。唯一需要注意的是,某些老旧镜像站或者内网环境可能 HTTPS 证书有问题,那就退回 HTTP。
6.2 镜像站同步延迟的处理
镜像站不是实时同步的,通常每 6 到 24 小时同步一次。如果你刚看到官方源发布了某个安全更新,换源后可能暂时拉不到。这种情况等几个小时再apt update就行,不用反复折腾配置。
6.3 多版本共存的注意事项
如果你机器上同时有多个 Ubuntu 版本(比如虚拟机里跑 22.04 和 24.04),换源时一定要确认当前操作的是哪个系统。lsb_release -cs是最可靠的确认方式。我见过有人在 24.04 里把Suites写成jammy,结果拉了一堆 22.04 的包,虽然大部分能装,但依赖关系可能出问题。
6.4 换源不是一劳永逸
镜像站的地址偶尔会变,或者某个镜像站临时维护。如果某天apt update突然变慢或报错,先检查是不是镜像站的问题。可以临时换回官方源验证:
URIs: http://archive.ubuntu.com/ubuntu/如果官方源正常,那就是镜像站的问题,换一个镜像站即可。
6.5 关于 deb822 格式的缩进和空行
deb822 格式对缩进没有强制要求,字段可以顶格写,也可以缩进。但段落之间必须有空行,否则 APT 会把两个段落当成一个,导致字段冲突。我习惯每个字段顶格写,段落之间空一行,这样最清晰。
另外,字段名是大小写不敏感的,Types和types都能识别,但为了规范,建议按官方文档的大小写写。
6.6 一个快速验证源是否生效的小技巧
改完源之后,除了apt update,还可以用:
apt-cache policy这个命令会显示每个源的优先级和当前使用的源地址。如果看到https://mirrors.tuna.tsinghua.edu.cn/ubuntu出现在列表里,说明配置已经生效。
或者更直接:
grep -r "tuna" /etc/apt/sources.list.d/能搜到你写的镜像地址就对了。
6.7 如果公司内网有自建镜像源
有些公司内网会搭建自己的 Ubuntu 镜像,这种情况下URIs填内网地址,Signed-By可能需要换成公司自己的密钥。具体配置要问运维,不要照搬公网镜像的写法。内网源的好处是速度极快,而且不依赖外网。
6.8 换源后 pip、conda、npm 要不要一起换
这是另一个话题了。APT 换源只影响系统包管理,pip、conda、npm 各有各的源配置,需要单独处理。如果你在 Ubuntu 24.04 上做 Python 开发,pip 换源是另一套操作,改的是~/.pip/pip.conf或~/.config/pip/pip.conf。conda 改的是~/.condarc。这些和 APT 换源互不影响,但思路是一样的:把下载地址指向更快的镜像。
我个人的习惯是,系统装好后先把 APT 源换好,然后按需处理 pip 和 conda 的源。Docker 的镜像加速又是另一回事,改的是/etc/docker/daemon.json。这几件事分开做,不要混在一起,出问题了也好定位。
6.9 关于 Ubuntu 26.04 的提前预判
虽然现在聊 26.04 还早,但按照 Ubuntu 的节奏,deb822 格式大概率会延续下去,甚至可能进一步统一。所以现在把.sources格式用熟,以后升级到新版本时就不用重新学一遍。旧格式的sources.list会逐渐退出历史舞台,早点适应新写法是划算的。
我在几台机器上反复换源之后的最大体会是:格式本身不难,难的是改对文件、写对代号、别忘了安全源。把这三件事做好,换源就是五分钟的事。改完之后跑一次apt update,看到一排Hit和Get刷刷地过,那种顺畅感,比什么都实在。