Ubuntu 20.04换源报错解决与sources.list配置指南
简介这份资源面向Ubuntu 20.04 LTSFocal 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写成了bionicapt 就会拒绝加载。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内联签名和ReleaseRelease.gpg分离签名。APT 优先找InRelease找不到就找Release.gpg。如果镜像站只同步了Packages.gz而没同步签名文件APT 就会禁用该源。国内主流镜像站清华 TUNA、中科大 USTC、阿里云都同步了签名但一些企业内网自建源经常漏掉。第二类suite写错。比如把focal写成focal/或者FocalAPT 请求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 21 | grep -i notice\|disabled\|insecureapt 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 updatedeb-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::ForceIPv4true 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而不是vimnano 对新手更友好不会因为不熟悉操作而误删内容# 从备份恢复 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 updateprintf比echo更可控\n明确换行避免echo在不同 shell 下行为不一致。5. 批量部署与离线场景用 cloud-init 和本地镜像源固化 sources.list5.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 multiverseapt-mirror的nthreads控制并发下载数内网带宽大可以调到 20-30公网同步建议 5-10 避免被镜像站限流。clean行指定同步时清理已删除的包保持镜像与上游一致。5.3 验证本地源是否可用用 apt-cache 和实际安装测试搭完本地源别急着批量推。先在一台测试机上验证# 刷新索引 sudo apt update # 查看某个包的来源 apt-cache policy nginx # 实际安装测试 sudo apt install -y --reinstall nginxapt-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结果源没同步完升到一半依赖断了花了两个小时从备份恢复。希望帮到你。本文还有配套的精品资源点击获取