
简介Ubuntu 20.04 LTS系统的软件源配置集中在/etc/apt/sources.list文件中一旦误改或覆盖不当可能引发apt命令异常、软件包安装失败或无法获取安全更新。这份PDF文档为解决此类问题而整理面向希望快速恢复系统默认软件源配置的Linux初学者、运维人员以及因误操作导致源失效的用户。文档完整给出了Ubuntu 20.04 LTS默认sources.list的标准内容包括main、universe、multiverse等核心仓库以及updates、backports、security等更新源的具体写法并对各仓库的作用作了简要说明用户可对照文档将内容复制到系统文件中再执行apt更新命令即可修复。资源共1个PDF文件约35KB内容精炼、便于查阅。已有6782人下载学习适合在软件源被破坏、系统升级受阻时快速恢复默认配置。1. 为什么要动 sources.list新装 ubuntu20.04 的第一道坎按着 ubuntu20.04 安装教程在 VMware 里装完系统第一件事几乎都是sudo apt update。如果继续用安装镜像自带的官方源在国内宽带或云服务器上速度经常掉到几十 KB/s装个 vim 都要等半天。标题说的“系统默认源 sources.list 文件的修改”就是把 /etc/apt/sources.list 里的海外官方地址整体换成国内镜像站地址让 apt 恢复正常速度。它解决的不仅是慢还有 update 反复超时、索引拉不全等连锁问题。适合三类人刚装完系统的新手、准备在这台机器上配置 ROS noetic 或 CUDA 深度学习环境的人、用 docker 构建 ubuntu20.04 基础镜像的运维。改源本身不复杂真正让人翻车的是代号写错、公钥过期、多源混用后面逐条拆。2. sources.list 的结构与默认源先看懂再动手2.1 一个行一个仓库deb、URI、代号和组件四位一体在 Ubuntu 20.04 LTS 上apt 的软件仓库清单集中在两个位置/etc/apt/sources.list 和 /etc/apt/sources.list.d/ 目录下所有以 .list 结尾的文件。apt 在 update 时会合并读取这两个位置改源只动主文件、不检查这个目录是很多人的第一个盲区。去掉注释行后每一行都是一个仓库的定义格式是固定的四段deb URI 发行版代号 组件列表。例如deb http://archive.ubuntu.com/ubuntu focal main restricted universe multiverse第一段 deb 表示二进制软件包deb-src 表示源代码包URI 是这个仓库的实际地址focal 是 Ubuntu 20.04 LTS 的发行版代号对应 22.04 是 jammy、18.04 是 bionic最后的组件列表用空格分隔main 是官方支持的自由软件restricted 是官方维护但带有专有成分的部分比如闭源驱动universe 是社区维护的自由软件multiverse 是包含版权或专利限制的软件。默认安装的服务器版可能只启用了 main restricted桌面版会把 universe 一起带上具体取决于安装时的软件集合选择。搞清楚这四段改源时就不会茫然我们要换的只是第二段 URI其余字段必须和原系统保持一致特别是 focal 这个代号一旦写成别的版本镜像站目录里找不到对应路径apt update 立刻 404。2.2 为什么“默认源”慢是必然结果不是玄学Ubuntu 20.04 默认写入的仓库地址是 archive.ubuntu.com安全更新走 security.ubuntu.com解析结果通常是 Canonical 在海外的 CDN 节点。在国内网络环境下跨洋链路的往返时延很高而 apt update 拉取索引文件的方式是串行请求大量小文件时延被逐个放大体感就是长时间卡在 Get 状态偶尔整个 update 超时失败。还有一个很多人没注意的点20.04 桌面版默认的 sources.list 走的是 http 明文协议没有缓存加速运营商有时会限速这类长尾小流量。所谓“换了镜像源后快如闪电”本质是绕开了跨洋链路走国内镜像站的局域网或骨干出口时延从上百毫秒降到十几毫秒。如果你的机器在海外 VPS 上官方源反而更快那就不要换国内源。判断源快不快别用 ping很多镜像站禁 ICMP用 curl 测 TCP 连接耗时更接近 apt 真实体验。2.3 选哪个镜像源阿里云、清华 TUNA、中科大 USTC 的取舍常见镜像源都是对官方仓库的定时同步路径结构完全一致替换域名即可。下面是实际工作中我常备的几个镜像站仓库路径协议适用场景阿里云http://mirrors.aliyun.com/ubuntu/http/https国内云服务器、家庭宽带通用性最好清华 TUNAhttp://mirrors.tuna.tsinghua.edu.cn/ubuntu/http/https/rsync教育网、高校实验室IPv6 友好中科大 USTChttp://mirrors.ustc.edu.cn/ubuntu/http/https教育网备选部分区域解析快华为云http://mirrors.huaweicloud.com/ubuntu/http/https华为云 ECS 内网速度快公网也可用选择标准不是“哪个最快”而是你所在网络到镜像站的路径质量。教育网用清华和中科大云厂商的机器优先用同厂商的公共镜像普通宽带就闭眼选阿里云。还有一个边界要记住不要在生产环境挂到个人维护的小型镜像站上高峰期被限速时apt install 会慢到让你怀疑人生换成官方源反而是最优解。3. 修改 sources.list 的两种落地路径sed 替换与全量覆盖3.1 备份给后悔药留个后门改任何系统级配置文件之前我第一件事永远是备份。备份动作本身只有一条命令sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak.$(date %Y%m%d%H%M%S)-a会保留文件属主和权限避免备份文件被普通用户改出问题后面加的时间戳方便以后区分是哪一次改动。如果改了 sources.list.d 下的文件同样按这个方式备份。恢复时把备份文件名替换回去即可相当于一颗后悔药。不要直接用编辑器另存为 .bakapt 对配置文件权限敏感权限错乱时会报“World writable”警告虽然不影响读取但是很烦。3.2 用 sed 只换域名最快且不破坏原有注释结构对刚装完、还没动过源文件的系统我最常用的是 sed 替换因为它只动域名不碰注释和原有的缩进格式sudo sed -i.bak \ -e s//archive.ubuntu.com/ubuntu//mirrors.aliyun.com/ubuntug \ -e s//security.ubuntu.com/ubuntu//mirrors.aliyun.com/ubuntug \ /etc/apt/sources.list拆开看sed 不直接处理 / 分隔符而是用 作为定界符因为 URL 里本来就有一堆斜杠用 / 会让转义写得像咒语-i.bak 表示原地替换并自动生成 sources.list.bak 备份和 3.1 的手动备份二选一即可两条-e分别处理主仓库和安全更新仓库。注意 security.ubuntu.com 必须单独替换很多人只替换 archive 导致 update 最后阶段还是从海外拉包。国内镜像站把 focal-security 的目录合并到了主仓库路径下所以这两类地址最终都指向同一个镜像站域名。-i.bak的备份名固定如果你愿意养成分层习惯可以在第一步的 cp 备份后再执行这条完全没问题。3.3 全量覆盖一份干净可复制的 focal 源如果系统已经被折腾过源文件里注释和残留地址很多我建议直接全量覆盖别在旧文件上打补丁sudo tee /etc/apt/sources.list EOF deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse EOF用 tee 而不是cat 是因为 tee 配合 sudo 才能拿到写 /etc 的权限here-doc 的 EOF 加了单引号避免 shell 把 $ 开头的变量展开。这套内容里 focal 对应 Ubuntu 20.04updates 是持续累积的更新仓库backports 是回移植包security 是安全更新。组件一次写全四个省得以后安装 universe 某个包时才发现源里没有。生产环境如果对软件许可有要求可以去掉 multiverse。全量覆盖的缺点是一旦漏了某个 line之前启用的源就无声消失所以每一步写完都要立刻 update 验证。3.4 立即验证apt update 输出里的 Get、Hit、Ign 怎么读改完源文件必须先跑一次 update让 apt 从新地址拉索引列表sudo apt-get update正常输出里能看到三类状态Hit 表示本地缓存已是最新不需要重新下载Get 表示正在从新源下载索引文件Ign 表示某个路径被忽略比如镜像站没有提供 Release 文件的目录。如果出现 Err 和 404必须停下处理否则后面 install 的包可能来自不完整的索引。update 结束后再用一条命令确认最终生效的仓库行grep -hE ^deb /etc/apt/sources.list /etc/apt/sources.list.d/*.list | sort -u这里 grep 只看行首是 deb 的启用项把两个位置的源合并列出。排序去重后一眼就能看出有没有重复、冗余或来源混杂的仓库。4. 改源后最常见的 5 个坑从 404 到公钥过期这五条我基本都踩过一遍前两条看着像玄学其实背后都是明确的机制排查起来并不难。4.1 404 Not Found系统代号与镜像目录对不上现象apt update 输出Err:... 404 Not Found [IP: ...]紧跟一个具体的镜像站 IP。原因绝大多数是把 focal 写成了其他版本代号。20.04 的代号是 focal22.04 是 jammy18.04 是 bionic镜像站的文件路径按代号分目录写错了自然找不到。另一个常见原因是加了 deb-src 行但镜像站没有同步源码目录还有一个隐蔽场景是某些镜像站没同步 deb-src 目录必须确认。解决先列出当前生效的仓库行逐个校对代号grep -n ^deb /etc/apt/sources.list把所有非 focal 的代号统一改回来再检查 deb-src。拿不准镜像站是否同步了源码目录用 curl 探一下路径curl -I http://mirrors.aliyun.com/ubuntu/dists/focal/Release返回 200 就说明主仓库路径没问题404 就换一个镜像源。4.2 公钥报错NO_PUBKEY 不是玄学是 keyring 版本太老现象update 到最后输出The following signatures couldnt be verified because the public key is not available: NO_PUBKEY ...后面跟着一串十六进制 key id。原因Ubuntu 20.04 系统里预装的是当年的 ubuntu-keyring如果这台机器从安装后一直没更新过keyring 里的签名密钥可能已经轮换而新镜像源拉下来的 Release 文件用的是新密钥。换源只是把地址换掉keyring 的更新得自己补。解决优先重装 keyringsudo apt-get install --reinstall ubuntu-keyring如果当前源已经无法 update就从 keyserver 补拉缺失的密钥sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys NO_PUBKEY后面的8位注意 apt-key 在 22.04 上已经废弃在 20.04 上还能用但不建议长期依赖它。重装后立刻再跑一次 update理论上不会再看 NO_PUBKEY。4.3 依赖冲突的根源多源混用把系统变成黑匣子现象源改完后 update、install 都正常装某个软件时却提示依赖不满足甚至apt-get -f install也修不回来。原因最常见的是 /etc/apt/sources.list.d/ 里残留着别人放进去的第三方源或者当年测试时加的 bionic 源没删。apt 会合并所有 .list于是同一台 20.04 机器同时面向 focal 和 bionic 仓库两个版本的 libc6、python3 在依赖树上互相打架这时候系统的依赖状态就进入黑匣子模式。解决先把所有源摊开看grep -r ^deb /etc/apt/sources.list /etc/apt/sources.list.d/确认一个发行版只保留一套仓库删掉非 focal 的文件后执行sudo apt-get -f install。如果已经乱到依赖修不回来优先备份配置重装系统不要试图手动 dpkg 乱包越修越深。4.4 改了 sources.list 却仍然从旧地址拉包现象cat 检查文件里明明已经是国内镜像地址update 却还是长时间卡在某个海外 IP或者输出里反复出现旧域名。原因第一种是 /var/lib/apt/lists/ 里残留了旧的索引缓存apt 会优先复用第二种是 /etc/apt/apt.conf.d/ 里配置了全局代理apt 的请求被代理转发到旧链路第三种是 sources.list.d 里有个文件把旧源重新指了回来。解决清缓存再试sudo apt-get clean检查代理配置apt-config dump | grep -i proxy再把 sources.list.d 下所有非当前发行版的 .list 文件移走。这三步走完update 的请求地址才真正干净。4.5 https 源连不上先补 apt-transport-https或退回 http现象把源换成 https 的镜像站地址后update 报Failed to fetch ... Connection failed或证书校验失败。原因Ubuntu 20.04 上 apt 走 https 依赖 apt-transport-https 和 ca-certificates 两个包全新系统里默认不一定装全。报证书错误的原因通常是 CA 证书库太旧和源无关还有一类情况是内网源只开放 http换 https 反而连不上。解决补上传输层支持再 updatesudo apt-get install apt-transport-https ca-certificates补完之后如果还给镜像站强上 https需要确保镜像站支持内网环境用 http 不失为务实的做法。不要为了绕过证书错误去设置Acquire::https::Verify-Peer false那是把签名校验关掉等于让更新链路裸奔。5. 三个高频场景里的源配置ROS、深度学习和 Docker 镜像构建改系统源只是基础实际项目里几乎都要叠加第二套源。这套叠加做得不好前面的活全白干。5.1 ubuntu20.04 安装 ros noetic系统源和 ROS 源各司其职Ubuntu 20.04 上装 ROS Noetic单纯改系统源是不够的ROS 包不在 Ubuntu 官方仓库里。常见做法是把 ROS 源单独放进 /etc/apt/sources.list.d/和系统源分开管理echo deb http://packages.ros.org/ros/ubuntu focal main | sudo tee /etc/apt/sources.list.d/ros-latest.list sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt-get updateROS 源这一行只有 focal 和 main 两个字段没有 updates、security 那些分层而 key id 直接写在命令里比从网页复制大段密钥可靠。用独立 .list 文件而不是塞进 sources.list是为了将来 ROS 源出问题时不牵连系统源直接注释这个文件就行。顺序上有讲究先改好系统源并 update 成功再添加 ROS 源避免两边同时报错时分不清是哪个源的问题。5.2 ubuntu20.04 配置深度学习系统源、NVIDIA 源、pip 源三线并行做深度学习环境时系统源解决基础库NVIDIA 官方源解决驱动和 CUDA 工具包。先装 NVIDIA 的 keyring 包源被自动写到 sources.list.dwget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.0-1_all.deb sudo dpkg -i cuda-keyring_1.0-1_all.deb sudo apt-get update这个 keyring 包装完apt 会多出一个指向 developer.download.nvidia.com 的仓库安装 cuda、nvidia-driver 都从那里拉。别为了省事把系统源直接换成 NVIDIA 源两者是不同软件集合混在一起会让依赖解析变慢。很多桌面版用户遇到的“ubuntu20.04 没有 wifi 选项”本质是网卡驱动没装上而闭源驱动正好来自这个 NVIDIA/Ubuntu restricted 组件系统源里组件没有写全时驱动装不上就表现得像没有无线选项。另外记住把 pip 也换个国内源装 torch 会省很多时间pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/血泪经验不要同时添加两个不同版本的 CUDA 仓库update 时公钥和版本交替冲突最后只能删掉一个再 purge 重来安装前先看官方系统要求。5.3 docker 构建 ubuntu20.04 环境在 Dockerfile 里改源而不是 COPY 进来用 docker 构建 ubuntu20.04 基础镜像时官方 ubuntu:20.04 镜像里的源文件和宿主机是一样的路径可以直接在 Dockerfile 里用 sed 改源保证镜像可移植FROM ubuntu:20.04 RUN sed -i s//archive.ubuntu.com/ubuntu//mirrors.aliyun.com/ubuntug; s//security.ubuntu.com/ubuntu//mirrors.aliyun.com/ubuntug /etc/apt/sources.list \ apt-get update \ apt-get install -y --no-install-recommends python3 python3-pip ca-certificates \ rm -rf /var/lib/apt/lists/*不推荐把宿主机上的 sources.list 用 COPY 拷进镜像因为镜像可能要在不同网络环境复用写死在文件里会降低灵活性。这里 sed 是两条匹配用分号连着写的等价于 3.2 里两条 -e 的效果。--no-install-recommends 能避免装进来一堆不需要的推荐包最后的 rm -rf 清掉 apt 索引缓存镜像层会小不少。在 CI 拉镜像时如果构建机在海外就不需要改源反过来在国内构建不改源基本等死。这个判断逻辑比命令本身更重要。5.4 源配好后先别急着 upgrade看清升级集再动手改完源很多人顺手就是 apt upgrade把几百个包全升了。对刚配好深度学习或 ROS 的机器我建议先看一眼升级清单sudo apt list --upgradable | head -30如果列表里有 linux-image、nvidia、libc6 这类关键包而机器是生产或教学环境就不要贸然 full-upgrade。常见做法是只升级当前任务需要的包或者用apt-get --with-new-pkgs upgrade处理被保留的包。新内核、新驱动装完后重启失败的概率不低而源本身没问题时保持现有版本稳定性优先。6. 改完源先做的三件事验证、净化、留后门改源完成后我会用几个命令从三个层面确认这套动作能挡住绝大多数隐藏问题。第一层验证 apt 实际读取了哪些文件sudo apt-config dump | grep -E Dir::Etc::sourcelist|Dir::Etc::sourceparts ls -l /etc/apt/sources.list /etc/apt/sources.list.d/apt-config dump 输出里能看到主文件和 sourceparts 目录的路径两个位置都要真实存在。如果之前有过残留的空 .list 文件ls 一眼就能看出来。第二层看索引落盘情况确认 update 不是假成功ls /var/lib/apt/lists/ | grep -i focal | head正常会有 mirror 域名加 focal 各组件拼出来的多个索引文件。如果一个都没有说明 update 实际没从新源拉到东西需要回头看 4.4 的缓存问题。第三层看包的候选版本来源apt-cache policy python3输出里的候选版本行会标注来自哪个仓库。如果候选版本指向的仓库和你预期的镜像站不是同一个说明还有更高优先级的源在拦截这就是 4.3 的混源场景。再往前一步如果你同时挂了好几个源可以用 pin 控制来源优先级。在 /etc/apt/preferences.d/ 下建一个文件cat /etc/apt/preferences.d/mirror-pin Package: * Pin: origin mirrors.aliyun.com Pin-Priority: 990pin-priority 990 高于系统默认的 500apt 在有多个可用源时会优先从这个镜像取包适合不想让第三方源偷偷改候选版本的场景。注意 pin 的 origin 写的是源域名不是完整 URL写错会被当成默认优先级忽略。最后一个进阶技巧是开启 deb-src如果之后要编译内核模块或调试软件需要源码包就把 deb-src 行加回来并 update。我只在实际需要时才开因为源码索引文件体积不小平时开着会让 update 变慢。现在我自己的习惯是每次改完源立刻备份、update、grep 错误、再把新拉下来的索引目录看一遍全程不到一分钟。之所以这么机械是因为我在这台机器上踩过一次大坑一个不留神把 bionic 的源写进了 focal 系统等发现时整个 python3 环境已经乱到只能重装系统那种看着终端滚屏却无能为力的感觉后来就成了上面这套固定动作。希望帮到你。本文还有配套的精品资源点击获取