news 2026/10/22 21:04:56

Ubuntu 20.04换源报错解决与sources.list配置指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu 20.04换源报错解决与sources.list配置指南

简介:这份资源面向Ubuntu 20.04 LTS(Focal Fossa)用户,尤其是因误改sources.list导致apt报错、软件安装失败或系统升级异常,需要快速恢复默认软件源的人群,也适合刚接触Linux包管理、想弄清各仓库作用的初学者。资源包共1个文件,为35KB的PDF文档,完整收录了Ubuntu 20.04 LTS默认sources.list内容,涵盖main、restricted、universe、multiverse、updates、backports及security等仓库条目,并配有各仓库用途说明,方便对照理解。已有6782人学习下载。读者可直接复制默认源内容覆盖原文件,配合apt-get update与upgrade恢复系统正常更新,同时了解中国镜像源cn.archive.ubuntu.com的选用方式,以及按需启用或禁用multiverse等仓库的取舍思路,是一份实用的排错与恢复参考。

1. 为什么 Ubuntu 20.04 的 sources.list 一改就报「无法安全地用该源进行更新」

装完 Ubuntu 20.04 LTS,第一件想干的事往往就是把默认源换成国内镜像,结果apt update直接甩你一脸notice: 无法安全地用该源进行更新,所以默认禁用该源。这个报错不是网络问题,也不是镜像站挂了,而是 Ubuntu 从 18.04 开始引入的InRelease/Release.gpg签名校验机制在起作用——你换的源地址如果没带正确的签名文件,或者你把focal写成了bionic,apt 就会拒绝加载。

sources.list是 APT 包管理器的源清单文件,位于/etc/apt/sources.list,每一行定义了一个软件仓库的地址、发行版代号和组件范围。Ubuntu 20.04 的代号是focal,组件分main、restricted、universe、multiverse四个区。改这个文件的目的通常有三个:换国内镜像提速、加第三方 PPA、临时启用deb-src源码源。适合谁看?刚装完系统的开发、运维、嵌入式工程师,以及需要在离线环境里批量部署 Ubuntu 20.04 的人。这篇不讲虚的,从文件结构拆到镜像选型,再到改完怎么验证、翻车了怎么回滚,全部给可复制的命令和参数。

2. sources.list 的行格式与 Ubuntu 20.04 默认源拆解

2.1 一行 sources.list 到底由哪几段组成

先看 Ubuntu 20.04 装完后的默认/etc/apt/sources.list长什么样(去掉注释后的有效行):

deb http://archive.ubuntu.com/ubuntu/ focal main restricted deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted deb http://archive.ubuntu.com/ubuntu/ focal universe deb http://archive.ubuntu.com/ubuntu/ focal-updates universe deb http://archive.ubuntu.com/ubuntu/ focal multiverse deb http://archive.ubuntu.com/ubuntu/ focal-updates multiverse deb http://archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse deb http://security.ubuntu.com/ubuntu/ focal-security main restricted deb http://security.ubuntu.com/ubuntu/ focal-security universe deb http://security.ubuntu.com/ubuntu/ focal-security multiverse

每一行的语法是:

deb [可选参数] URI suite component1 component2 ...
  • deb:二进制包仓库;deb-src是源码包仓库,默认被注释掉。
  • URI:仓库根地址,必须以/结尾,比如http://archive.ubuntu.com/ubuntu/。
  • suite:发行版代号或代号加更新类型。focal是基础发行版,focal-updates是稳定更新,focal-security是安全更新,focal-backports是向后移植的新软件。
  • component:组件名,main是官方支持的自由软件,restricted是官方支持的专有驱动,universe是社区维护的自由软件,multiverse是有版权限制的软件。

提示:focal和focal-updates不能混在一行里写,APT 会把它们当成两个不同的 suite 去请求,结果就是 404。

2.2 为什么换源后 apt 会报「无法安全地用该源进行更新」

这个报错的完整形态通常是:

Notice: 无法安全地用该源进行更新,所以默认禁用该源。 Notice: See apt-secure(8) manpage for repository creation and user configuration details.

原因分三类,按出现频率排:

第一类,镜像站没有同步InRelease文件。Ubuntu 官方仓库根目录下有InRelease(内联签名)和Release+Release.gpg(分离签名)。APT 优先找InRelease,找不到就找Release.gpg。如果镜像站只同步了Packages.gz而没同步签名文件,APT 就会禁用该源。国内主流镜像站(清华 TUNA、中科大 USTC、阿里云)都同步了签名,但一些企业内网自建源经常漏掉。

第二类,suite写错。比如把focal写成focal/或者Focal,APT 请求dists/focal/InRelease时拿到 404,然后回退到Release也 404,最后报「无法安全地用该源进行更新」。

第三类,系统时间不对。签名校验依赖 GPG 时间戳,如果本机时间比签名时间早,GPG 会认为签名「来自未来」而拒绝。虚拟机挂起后恢复、树莓派没接 RTC 电池,都会踩这个坑。

2.3 改之前先备份:一条命令留好后悔药

改任何系统配置文件之前,先备份。这不是废话,是我见过太多人改完sources.list把文件搞成空文件,然后apt全挂,连vim都装不回来。

# 备份原始 sources.list,带时间戳,方便回滚 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak.$(date +%Y%m%d%H%M%S) # 确认备份文件存在且非空 ls -l /etc/apt/sources.list.bak.* wc -l /etc/apt/sources.list.bak.*

cp的-p选项我没加,因为这里不需要保留原时间戳,带时间戳的备份文件名已经能区分版本。wc -l用来确认备份文件不是 0 行——如果原文件本来就是空的,那说明问题不在改源,而在系统安装阶段就出错了。

注意:如果你在容器里操作,/etc/apt/sources.list可能是挂载进去的,备份要写到容器外,否则容器一删备份也没了。

3. 换成国内镜像源:选型、写入与验证的完整命令

3.1 镜像站怎么选:延迟、同步频率与组件完整度

国内常用 Ubuntu 20.04 镜像站对比:

镜像站地址同步频率组件完整度适用场景
清华 TUNAhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/每 5 分钟全组件 + 源码教育网、通用
中科大 USTChttps://mirrors.ustc.edu.cn/ubuntu/每 5 分钟全组件 + 源码教育网、电信
阿里云https://mirrors.aliyun.com/ubuntu/每 10 分钟全组件公网、云服务器
华为云https://mirrors.huaweicloud.com/ubuntu/每 10 分钟全组件华为云内网
网易https://mirrors.163.com/ubuntu/每 30 分钟全组件公网

选型逻辑:云服务器优先用云厂商内网镜像(阿里云 ECS 用阿里云镜像走内网,不计流量);教育网用清华或中科大;公网通用选阿里云或华为云。同步频率影响你拿到最新安全补丁的速度,但 5 分钟和 30 分钟的差别对绝大多数人无感。

3.2 用 sed 批量替换默认源为清华镜像

最稳的改法不是手写整个文件,而是用sed把官方域名替换成镜像域名,保留原有的 suite 和 component 结构:

# 备份(如果 2.3 已经做过可跳过) sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak.$(date +%Y%m%d%H%M%S) # 把 archive.ubuntu.com 和 security.ubuntu.com 替换为清华镜像 sudo sed -i 's|http://archive.ubuntu.com/ubuntu/|https://mirrors.tuna.tsinghua.edu.cn/ubuntu/|g' /etc/apt/sources.list sudo sed -i 's|http://security.ubuntu.com/ubuntu/|https://mirrors.tuna.tsinghua.edu.cn/ubuntu/|g' /etc/apt/sources.list # 查看替换结果 grep -v '^#' /etc/apt/sources.list | grep -v '^$'

sed的-i是原地修改,s|...|...|g用|作分隔符是因为 URL 里有/,用/作分隔符要转义很麻烦。g是全局替换,一行里出现多次也能全换。第二条sed把security.ubuntu.com也指向清华镜像——清华镜像同时承载了focal-security,不需要单独指向security.ubuntu.com。

替换后应该看到类似:

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted ...

3.3 改完必须跑的三条验证命令

改完不验证,等于没改。按顺序跑:

# 1. 更新包索引,看是否有签名错误或 404 sudo apt update # 2. 检查 apt 实际使用的源列表(包括 sources.list.d 下的) apt-cache policy | grep -A2 'focal' # 3. 确认没有源被禁用 sudo apt-get update 2>&1 | grep -i 'notice\|disabled\|insecure'

apt update的输出里,每个源应该显示Hit(未变化)或Get(有更新),如果出现Ign(忽略)或Err(错误),说明该源有问题。apt-cache policy会列出每个包的候选版本和来源仓库,如果某个源的Release文件没加载成功,这里会显示(not found)或直接不出现。

提示:如果apt update报Release file expired,说明镜像站的Release文件过期了,通常是镜像站同步卡住。换一个镜像站,或者等镜像站恢复。

3.4 加第三方 PPA 和启用 deb-src 的正确姿势

第三方 PPA 不要直接往/etc/apt/sources.list里塞,用add-apt-repository命令,它会自动处理签名密钥并写到/etc/apt/sources.list.d/下:

# 添加 PPA(以 deadsnakes 为例,装新版 Python) sudo add-apt-repository ppa:deadsnakes/ppa sudo apt update # 查看生成的源文件 cat /etc/apt/sources.list.d/deadsnakes-ubuntu-ppa-focal.list

启用deb-src源码源,把sources.list里deb-src行的注释去掉,或者单独写:

# 启用源码源(用于 apt source 下载源码包) sudo sed -i 's|^# deb-src|deb-src|g' /etc/apt/sources.list sudo apt update

deb-src源会显著增加apt update的时间,因为要下载源码包的索引。不用apt source的话,保持注释状态即可。

4. 改源翻车现场:5 个高频踩坑与排查路径

4.1 现象:apt update 报 404,但浏览器能打开镜像地址

原因:suite写错,或者镜像站没有同步该 suite。比如把focal写成focal/,APT 请求dists/focal//InRelease,多了一个斜杠导致 404。另一种情况是镜像站只同步了focal和focal-updates,没同步focal-backports,而你文件里有focal-backports行。

解决:用curl直接探测镜像站的dists目录:

# 探测镜像站是否有 focal 的 Release 文件 curl -sI https://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/focal/Release | head -1 curl -sI https://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/focal-updates/Release | head -1 curl -sI https://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/focal-backports/Release | head -1

返回200说明存在,404说明镜像站没同步。把不存在的 suite 行注释掉或删掉。

4.2 现象:报「无法安全地用该源进行更新」,但 Release 文件存在

原因:系统时间不对。GPG 校验签名时会检查签名时间戳,如果本机时间比签名时间早,GPG 报signature made in the future。

解决:校准时间:

# 查看当前系统时间 date # 用 NTP 同步时间(需要 systemd-timesyncd 或 ntp) sudo timedatectl set-ntp true timedatectl status # 如果没有 NTP,手动设置(临时) sudo date -s "2025-01-01 12:00:00"

虚拟机挂起恢复后时间漂移是常见原因,timedatectl set-ntp true能解决大部分情况。

4.3 现象:apt update 卡在Waiting for headers或Connecting to ...

原因:镜像站地址解析慢,或者 HTTPS 握手超时。有些内网环境没有 IPv6,但镜像站 DNS 返回了 AAAA 记录,APT 尝试 IPv6 连接超时后才回退 IPv4。

解决:强制 APT 用 IPv4:

# 临时强制 IPv4 sudo apt -o Acquire::ForceIPv4=true update # 永久配置 echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4

如果还是慢,换 HTTP 而不是 HTTPS,省掉 TLS 握手时间。但注意 HTTP 源没有传输加密,内网可以用,公网慎用。

4.4 现象:改完源后apt install报依赖冲突,之前能装的包装不上了

原因:不同镜像站的同步进度不一致。你从阿里云换到清华,清华的focal-updates可能比阿里云晚了几小时,导致某些包的依赖版本对不上。

解决:先apt update刷新索引,再apt install。如果还冲突,用apt-cache policy <包名>看候选版本来自哪个源,确认该源已同步。实在不行,换回原来的镜像站,等同步完成再换。

4.5 现象:sources.list 改坏了,apt 完全不能用,vim 也打不开

原因:把sources.list写成了空文件,或者写入了非法字符(比如从网页复制时带了全角空格)。

解决:用备份恢复,或者用nano而不是vim(nano 对新手更友好,不会因为不熟悉操作而误删内容):

# 从备份恢复 sudo cp /etc/apt/sources.list.bak.20250101120000 /etc/apt/sources.list sudo apt update # 如果没有备份,用 printf 写一个最小可用源 sudo printf 'deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse\ndeb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse\ndeb http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse\n' > /etc/apt/sources.list sudo apt update

printf比echo更可控,\n明确换行,避免echo在不同 shell 下行为不一致。

5. 批量部署与离线场景:用 cloud-init 和本地镜像源固化 sources.list

5.1 用 cloud-init 在首次启动时自动写入镜像源

如果你在批量部署 Ubuntu 20.04 云主机,手动改sources.list不现实。cloud-init 的apt模块可以在首次启动时直接指定源:

#cloud-config apt: primary: - arches: [default] uri: "https://mirrors.aliyun.com/ubuntu/" security: - arches: [default] uri: "https://mirrors.aliyun.com/ubuntu/" sources_list: | deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

把这段写进 cloud-init 的 user-data,实例首次启动时 cloud-init 会覆盖/etc/apt/sources.list并执行apt update。primary和security分别指定基础源和安全源的地址,sources_list直接写完整内容,优先级高于primary/security。

注意:cloud-init 只在实例首次启动时运行一次。如果实例已经启动过,改 user-data 不会重新生效,需要cloud-init clean后重启,或者手动执行cloud-init single --name cc_apt_configure。

5.2 内网离线环境:用 apt-mirror 搭本地源并指向它

没有外网的环境,需要在局域网内搭一个 Ubuntu 20.04 镜像源。用apt-mirror同步官方源到本地磁盘,然后内网机器的sources.list指向这台镜像服务器:

# 在镜像服务器上安装 apt-mirror sudo apt install apt-mirror # 编辑 /etc/apt/mirror.list,指定同步的 suite 和组件 sudo tee /etc/apt/mirror.list > /dev/null <<'EOF' set base_path /var/spool/apt-mirror set mirror_path $base_path/mirror set skel_path $base_path/skel set var_path $base_path/var set nthreads 20 set _tilde 0 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse clean https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ EOF # 执行同步(首次同步约 100GB+,视组件而定) sudo apt-mirror

同步完成后,用 Nginx 把/var/spool/apt-mirror/mirror/mirrors.tuna.tsinghua.edu.cn/ubuntu/发布出去,内网机器的sources.list写成:

deb http://内网镜像IP/ubuntu/ focal main restricted universe multiverse deb http://内网镜像IP/ubuntu/ focal-updates main restricted universe multiverse deb http://内网镜像IP/ubuntu/ focal-security main restricted universe multiverse

apt-mirror的nthreads控制并发下载数,内网带宽大可以调到 20-30,公网同步建议 5-10 避免被镜像站限流。clean行指定同步时清理已删除的包,保持镜像与上游一致。

5.3 验证本地源是否可用:用 apt-cache 和实际安装测试

搭完本地源,别急着批量推。先在一台测试机上验证:

# 刷新索引 sudo apt update # 查看某个包的来源 apt-cache policy nginx # 实际安装测试 sudo apt install -y --reinstall nginx

apt-cache policy nginx的输出里,500 http://内网镜像IP/ubuntu focal/main amd64 Packages说明包来自本地源。如果显示的是官方源地址,说明sources.list没生效,检查文件路径和权限。

我一般会在本地源搭好后,用apt-get install --download-only下载一个包但不安装,确认下载链路通:

# 只下载不安装,验证源可用 sudo apt-get install --download-only -y nginx ls -l /var/cache/apt/archives/nginx*.deb

--download-only把包下到/var/cache/apt/archives/但不执行安装,适合在批量部署前做连通性验证。确认.deb文件存在且大小正常,说明源完全可用。

这套流程我用了三年多,从单机换源到几百台内网机器的批量部署都跑过。最深的教训是:改sources.list之前永远先备份,改完之后永远先apt update验证再干别的。有次在客户现场改完源直接apt upgrade,结果源没同步完,升到一半依赖断了,花了两个小时从备份恢复。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 12:06:41

电商平台软件架构落地:高并发、分布式事务与避坑指南

简介&#xff1a;这份《电商平台软件架构.pdf》面向电商后端开发、架构设计与技术面试人群&#xff0c;系统梳理高并发电商系统的分层与组件设计&#xff0c;帮助读者建立从业务到基础设施的完整认知框架。内容围绕中台服务展开&#xff0c;涵盖订单、库存、支付、购物车、积分…

作者头像 李华
网站建设 2026/10/16 5:04:54

Win7蓝屏别重装:F8进“最后一次正确配置”和安全模式救援指南

简介&#xff1a;面向Win7用户的蓝屏报错排查指南&#xff0c;以docx文档形式讲解系统启动时出现蓝屏的常见原因与处理方法&#xff0c;特别适合因驱动调整、新装硬件引发兼容性问题而无法正常开机的普通用户与运维人员参考。文档内容围绕Last Known Configuration、安全模式、…

作者头像 李华
网站建设 2026/10/15 10:52:10

PuLP实现多目标优化:分层/ε-约束/目标规划实战

简介&#xff1a;本资源是一份面向科研人员与工程实践者的多目标线性规划建模与求解实战指南&#xff0c;聚焦复杂约束下的资源分配优化问题&#xff0c;依托Python PuLP库实现论文级复现。内容涵盖三目标协同优化&#xff08;最大化RE、最小化Q及辅助目标fun1/fun2&#xff09…

作者头像 李华
网站建设 2026/10/16 14:53:18

WinDbg调试实战手册:从符号配置到故障转储与TTD回放

简介&#xff1a;一份面向Windows开发人员、系统管理员及内核调试初学者的中文调试手册&#xff0c;聚焦Windbg这一微软官方调试器。手册基于官方文档系统梳理了Windbg的核心能力&#xff0c;包括故障转储分析、实时用户模式与内核模式代码调试、CPU寄存器与内存检查&#xff1…

作者头像 李华
网站建设 2026/10/16 5:41:48

本地部署Comfy 生图生视频全教学流程

一、本地环境配置我这边配置较低&#xff0c;如参考&#xff0c;请以我的配置为最低配置参考win10Python 3.9硬件配置&#xff1a;4GB 显存、8 核 CPU、16G 内存&#xff0c;5121024 固态硬盘 二、下载 ComfyUI 桌面版注&#xff1a;本文推荐此方案&#xff0c;该方案较为简便1…

作者头像 李华