多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Ubuntu 20.04 LTS 默认源修改指南:sources.list 配置、镜像替换与故障排查

Ubuntu 20.04 LTS 默认源修改指南:sources.list 配置、镜像替换与故障排查 简介这份PDF资料面向Ubuntu 20.04 LTSFocal Fossa用户尤其是因误改sources.list导致apt报错、软件安装失败或系统升级异常需要快速恢复默认软件源配置的运维与开发人员。资源完整给出官方默认源文件内容涵盖main、restricted、universe、multiverse、updates、backports及security等仓库条目并说明各仓库的用途与启用建议便于读者对照排查、按需裁剪。压缩包内共1个PDF文件约35KB轻量易存可直接查阅复制。目前已有6782人学习下载适合作为系统维护时的速查参考帮助读者理解镜像地址选择、仓库启用与禁用逻辑并配合apt-get update与upgrade完成缓存刷新与系统升级尽快恢复软件包管理功能。1. ubuntu20.04 LTS 默认源到底该不该改一次说清 sources.list 的取舍装完 Ubuntu 20.04 LTS第一件让人抓狂的事往往不是配环境而是apt update卡在某个源上转圈或者直接甩出一句Release 文件过期、无法安全地用该源进行更新所以默认禁用该源。这时候多数人第一反应就是去动/etc/apt/sources.list也就是我们常说的默认源配置文件。但改源这件事改对了是提速改错了就是给自己埋雷——轻则依赖装不上重则整个 apt 体系进入半瘫状态连后悔药都不好找。这篇笔记就围绕 ubuntu20.04 LTS 系统默认源 sources.list 文件的修改展开把「为什么要改、改成什么、怎么改、改完怎么验证、翻车了怎么救」这条链路讲透。适合两类人刚装完系统想换国内镜像源提速的新手以及维护多台机器、需要批量统一源配置的运维。核心结论先放这儿改源不是玄学它本质是替换一组 HTTP/HTTPS 地址但版本代号focal、组件main/restricted/universe/multiverse和协议http/https这三样必须对齐否则报错会以各种你意想不到的形式出现。2. 动手前先搞懂 sources.list 的语法与选型逻辑2.1 一行配置拆成四段deb、地址、代号、组件打开/etc/apt/sources.list你会看到类似这样的一行deb http://archive.ubuntu.com/ubuntu/ focal main restricted这一行拆开看是四个部分。deb表示二进制包仓库对应的还有deb-src表示源码包仓库。第二部分是仓库地址也就是镜像站的根 URL。第三部分是发行版代号Ubuntu 20.04 LTS 的代号是focal这个绝对不能写错写成focal之外的任何东西都会导致 404。第四部分是组件常见的有四个组件含义是否建议启用main官方支持的自由软件必须启用restricted官方支持的专有驱动建议启用universe社区维护的自由软件建议启用multiverse受版权限制的软件按需启用很多人改源只改地址忘了focal和组件结果就是apt update报404 Not Found或者Release 文件不存在。血泪经验是改之前先把原始文件备份改的时候整行替换不要只替换 URL 片段。2.2 为什么国内镜像源能提速选哪个更稳默认源指向的是境外服务器国内访问延迟高、丢包多apt update慢是常态。换成国内镜像源本质是把请求打到离你物理距离更近的服务器上。常见做法是选高校或云厂商的镜像站比如清华、阿里、中科大、华为云等。选型时看三点是否同步及时、是否支持 https、是否有 focal 目录。我一般会优先选支持 https 的镜像因为 http 在某些网络环境下会被劫持或返回错误内容而 https 能保证你拿到的Release文件是可信的。另外要注意有些镜像站虽然主站很快但focal-updates或focal-security目录同步滞后这会导致安全更新拿不到。判断方法很简单改完源后执行apt update看输出里有没有Ign或Err字样有就说明该源有问题。2.3 备份是底线改坏之前先留退路在动任何一行之前先执行备份。这不是形式主义而是你唯一的后悔药。# 备份原始 sources.list带日期后缀方便回溯 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak.$(date %Y%m%d) # 确认备份文件存在且非空 ls -l /etc/apt/sources.list.bak.*逻辑说明cp命令复制原文件$(date %Y%m%d)会展开成当天日期比如sources.list.bak.20250101。这样即使你后面改得面目全非也能一条命令还原。参数上没什么玄机关键是别用mvmv会把原文件移走一旦新文件写错系统里就没有参照物了。提示如果你在容器或云主机上操作建议同时把备份文件复制到宿主机或本地避免实例重置后备份一起丢失。3. 三种改源方式手动编辑、sed 替换、批量脚本3.1 手动编辑适合单机、看得见每一行最直接的方式是用编辑器打开文件逐行替换。新手推荐用nano因为它的快捷键提示就在屏幕底部不容易慌。# 用 nano 打开 sources.list sudo nano /etc/apt/sources.list打开后你会看到若干行以deb或deb-src开头的配置。把每一行的http://archive.ubuntu.com/ubuntu/或http://security.ubuntu.com/ubuntu/替换成你选定的镜像地址比如https://mirrors.aliyun.com/ubuntu/。注意focal、main、restricted这些词不要动。改完后按CtrlO保存CtrlX退出。然后执行# 刷新软件包索引验证新源是否可用 sudo apt update如果输出里全是Hit或Get没有Err说明源配置正确。如果有Err先检查地址拼写和focal是否写对。3.2 用 sed 一键替换适合记得住命令的老手如果你不想逐行改可以用sed做全局替换。下面这条命令把默认的 archive 地址替换成阿里云镜像# 将 archive.ubuntu.com 和 security.ubuntu.com 统一替换为阿里云镜像 sudo sed -i s|http://archive.ubuntu.com/ubuntu/|https://mirrors.aliyun.com/ubuntu/|g; s|http://security.ubuntu.com/ubuntu/|https://mirrors.aliyun.com/ubuntu/|g /etc/apt/sources.list逻辑说明sed -i表示直接修改文件s|旧|新|g是替换语法用|作分隔符是为了避免 URL 里的/和分隔符冲突。两条替换用;隔开分别处理主仓库和安全仓库。执行完同样要apt update验证。参数上要注意如果你的原始文件里用的是https而不是http这条命令不会匹配你需要把模式里的http改成https。另外有些系统里security.ubuntu.com的路径是/ubuntu/有些是/ubuntu替换前最好grep一下确认。3.3 批量脚本多台机器统一源配置维护多台 Ubuntu 20.04 时逐台改源效率太低。可以写一个脚本把源文件内容直接覆盖成标准模板。下面是一个可复用的 bash 脚本#!/bin/bash # 批量替换 Ubuntu 20.04 源为指定镜像 # 用法./set_apt_source.sh https://mirrors.aliyun.com/ubuntu/ set -e # 遇到错误立即退出避免半改状态 MIRROR_URL$1 SOURCE_FILE/etc/apt/sources.list if [ -z $MIRROR_URL ]; then echo 请传入镜像地址例如 https://mirrors.aliyun.com/ubuntu/ exit 1 fi # 备份原文件 cp $SOURCE_FILE ${SOURCE_FILE}.bak.$(date %Y%m%d%H%M%S) # 写入标准 focal 源配置 cat $SOURCE_FILE EOF deb ${MIRROR_URL} focal main restricted universe multiverse deb ${MIRROR_URL} focal-updates main restricted universe multiverse deb ${MIRROR_URL} focal-backports main restricted universe multiverse deb ${MIRROR_URL} focal-security main restricted universe multiverse EOF # 刷新索引 apt update逻辑说明脚本接收一个参数作为镜像根地址先备份再用cat和 heredoc 写入四行标准配置。这四行分别对应主仓库、更新仓库、回溯仓库和安全仓库覆盖了日常使用的全部场景。set -e保证任何一步失败就停止不会留下改了一半的文件。参数说明$1是镜像地址必须带https://或http://前缀且末尾要带/ubuntu/。如果你用的镜像站路径不同比如某些站是/ubuntu而不是/ubuntu/需要相应调整。执行前建议先在测试机跑一遍确认apt update无报错后再推送到生产机。注意批量脚本里不要加deb-src行除非你确实需要下载源码包。启用deb-src会显著增加apt update的索引下载量拖慢速度。4. 改完源后必做的验证与常见报错排查4.1 验证三件套apt update、apt policy、apt install改完源不代表万事大吉必须做三步验证。第一步是apt update看有没有Err。第二步是apt policy确认包的来源指向新镜像# 查看某个包的可用版本和来源仓库 apt policy bash输出里会列出该包的候选版本和对应的仓库地址。如果地址还是旧的说明源没生效可能是文件没保存或有多余的 sources.list.d 文件在干扰。第三步是实际安装一个小包比如apt install -y tree确认下载和安装流程通畅。4.2 报错「Release 文件过期」和「无法安全地用该源进行更新」这两个报错经常一起出现核心原因是本地时间不对或镜像站的Release文件签名验证失败。先检查系统时间# 查看系统时间和时区 timedatectl status如果时间偏差超过几分钟apt会拒绝该源。解决方法是同步时间# 安装并启用时间同步服务 sudo apt install -y systemd-timesyncd sudo systemctl enable --now systemd-timesyncd如果时间没问题那可能是镜像站同步不完整。换一个镜像站或者等几小时再试。另一个常见原因是/etc/apt/sources.list.d/目录下还有旧的源文件在生效需要一并检查。4.3 避坑清单五条血泪经验现象一apt update报 404提示focal Release找不到。原因镜像地址拼写错误或者镜像站没有同步 focal 目录。 解决用浏览器或curl访问镜像地址确认dists/focal/Release文件存在。不存在就换镜像。现象二改完源后apt install提示依赖冲突。原因新旧源混用部分包来自旧源部分来自新源版本不一致。 解决先还原备份再统一替换所有行确保没有残留旧地址。检查/etc/apt/sources.list.d/下是否有第三方源。现象三apt update卡在Waiting for headers很久。原因镜像站响应慢或网络不通。 解决换镜像站或者临时用-o Acquire::http::Timeout10缩短超时。现象四sudo apt update提示Could not resolve。原因DNS 配置有问题域名解析失败。 解决检查/etc/resolv.conf确保有可用的 DNS 服务器。可以临时加一个公共 DNS 测试。现象五改源后系统更新提示「部分包无法下载」。原因focal-updates或focal-security行缺失或地址错误。 解决确认四行配置齐全特别是focal-security不能少否则安全更新拿不到。5. 进阶技巧用 apt 配置片段和镜像测速做精细化管理5.1 用 sources.list.d 拆分管理避免主文件臃肿当你有多个源比如官方源、第三方 PPA、内部私有源时全部塞进/etc/apt/sources.list会很难维护。更好的做法是把额外源拆到/etc/apt/sources.list.d/目录下每个源一个.list文件。比如# 创建一个独立的源文件只放安全更新 sudo tee /etc/apt/sources.list.d/security.list EOF deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse EOF这样主文件只保留基础源安全更新单独管理排查问题时可以逐个禁用。注意文件名必须以.list结尾否则 apt 不会读取。5.2 镜像测速用 curl 量化每个镜像的响应时间选镜像不能凭感觉可以用curl测每个镜像的Release文件下载耗时# 测试多个镜像的响应时间单位秒 for url in \ https://mirrors.aliyun.com/ubuntu/dists/focal/Release \ https://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/focal/Release \ https://mirrors.ustc.edu.cn/ubuntu/dists/focal/Release \ https://repo.huaweicloud.com/ubuntu/dists/focal/Release do echo -n $url - curl -o /dev/null -s -w %{time_total}s\n $url done逻辑说明curl -o /dev/null丢弃下载内容-s静默模式-w %{time_total}s\n输出总耗时。跑一遍就能看出哪个镜像对你当前网络最快。参数上time_total包含 DNS 解析、连接、传输全过程比单纯 ping 更有参考价值。5.3 锁定版本用 apt-mark hold 防止关键包被意外升级改源后某些关键包比如内核、驱动可能因为新源版本更高而被自动升级导致系统不稳定。可以用apt-mark hold锁定# 锁定当前内核版本防止 apt upgrade 时被升级 sudo apt-mark hold linux-image-generic linux-headers-generic # 查看已锁定的包 apt-mark showhold # 需要升级时再解锁 sudo apt-mark unhold linux-image-generic linux-headers-generic这个习惯我是在一次内核升级导致网卡驱动失效后养成的。改源本身不会直接触发升级但后续apt upgrade会。锁定关键包等于给自己留了缓冲期。5.4 还原与回滚一条命令回到改源前如果改源后出现无法解决的问题最快的恢复方式是用备份覆盖# 从备份还原 sources.list sudo cp /etc/apt/sources.list.bak.20250101 /etc/apt/sources.list sudo apt update把日期换成你实际备份的日期。还原后如果apt update恢复正常说明问题确实出在源配置上。如果还原后依然报错那就要检查/etc/apt/sources.list.d/和/etc/apt/apt.conf.d/下是否有其他配置在干扰。我自己的习惯是每次改源前先备份改完立刻apt update验证验证通过后再把新配置提交到配置管理工具里。这样即使换机器也能一键复现。希望帮到你。本文还有配套的精品资源点击获取
返回列表