ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu换源详解:apt下载慢?手把手教你配置国内镜像源

Ubuntu换源详解:apt下载慢?手把手教你配置国内镜像源 如果你装的是 Ubuntu第一次跑apt update时大概率会被那个几十 KB/s 甚至直接超时的下载速度劝退。题图那种百兆宽带却拉不动一个软件包的体验几乎每个新手都经历过。所谓“Ubuntu 换源”本质上就是把系统默认的软件仓库地址从官方服务器换成国内高速镜像站的同步副本让你下载软件包时能真正跑满带宽而不是对着进度条干瞪眼。这篇内容适合所有 Ubuntu 用户特别是刚装完系统正准备装 gcc、装 Docker、装各种开发环境的人。我尽量把换源背后的文件结构、命令逻辑、踩坑点都讲透你照着做一遍之后不管装什么都顺很多。1. 换源原理与准备先弄懂“源”到底是什么1.1 源的真面目apt 的“购物清单”Ubuntu 里的“源”其实是一个叫sources.list的文本文件里面记录着软件包的下载地址。你执行apt update时系统会读取这个文件去对应的服务器拉取一份软件包索引你执行apt install时再根据索引去对应服务器下载真正的.deb包。所以换源做的事情很直接把文件里那一串官方地址替换成国内镜像站的地址。地址换了软件包的内容几乎一模一样但下载速度天差地别。我见过不少新手直接把网上抄来的sources.list内容粘贴进去结果apt update报出一大堆 404、哈希校验失败。原因多半是版本代号写错了。Ubuntu 每个正式版本都有一个代号比如 20.04 叫 focal22.04 叫 jammy24.04 叫 noble。源地址里的路径必须带上正确的代号镜像站才找得到对应的软件仓库目录。另外源文件里常见的deb和deb-src区别也要有个概念deb是二进制软件包普通用户装软件用的就是它deb-src是源码包一般只有需要编译源码、打补丁的开发者才需要。日常使用可以只保留deb能少拉很多索引。1.2 版本代号换源前必须确认的几件事换源前先花三十秒确认两件事系统版本代号和 CPU 架构。命令分别对应lsb_release -c输出类似Codename: noble这就是你要填到源地址里的代号。dpkg --print-architecture输出amd64或arm64。x86 电脑基本是 amd64ARM 开发板、苹果 M 系列虚拟机则可能是 arm64。绝大多数电脑用的是 amd64 的 Ubuntu 源也就是https://mirrors.xxx.com/ubuntu/这个路径下的仓库。但如果你在 ARM 开发板上跑 Ubuntu源就不一样了得用ubuntu-ports原因是官方把 ARM 移植版的软件仓库独立发布了路径是https://mirrors.xxx.com/ubuntu-ports/。这一点在后面的实操环节我会单独拆开讲因为很多人栽在这里。1.3 为什么官方源这么慢一个科学且不玄学的解释官方源速度慢并不是“感觉慢”而是客观的链路问题。Ubuntu 官方源的地域服务器分布在全球各地北美、欧洲为主国内访问要跨越大洋链路长、节点多加上晚高峰出境带宽拥塞TCP 丢包重传频繁速度自然就崩了。镜像站则把软件仓库同步到了国内访问路径短丢包率低速度能稳定在几 MB/s 到几十 MB/s。顺带一提如果你所在的环境本来就在国内千万别先怀疑是 Ubuntu 官方源“坏掉了”。只要apt update能跑完、只是慢大概率就是链路问题直接换源解决。如果apt update卡住不动可以先ping一下镜像站域名确认网络连通性再继续排查。2. 镜像源选型与备份策略2.1 主流镜像源横向对比国内可用的 Ubuntu 镜像站不少我实测下来综合体验比较好的有这几个镜像源地址特点适用场景阿里云https://mirrors.aliyun.com/ubuntu/带宽大、节点多、同步快个人桌面、云服务器通用清华 TUNAhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/高校镜像稳定限速相对宽松教育网、开发机中科大 USTChttps://mirrors.ustc.edu.cn/ubuntu/同步频率高支持 IPv6服务器、极客用户华为云https://mirrors.huaweicloud.com/ubuntu/企业级带宽某些区域访问极快华为云主机、企业内网腾讯云https://mirrors.cloud.tencent.com/ubuntu/腾讯云内网有专用地址腾讯云 CVM 推荐如果服务器本身在某个云厂商内网我建议优先用该厂商的内网镜像地址速度比走公网镜像站快一个量级。比如腾讯云主机用mirrors.cloud.tencent.com阿里云 ECS 用mirrors.aliyun.com华为云用mirrors.huaweicloud.com。这些内网地址通常不需要额外配置 DNS 或证书直接替换即可。2.2 安全备份与恢复预案改源之前务必备份原文件。这是一个非常便宜但极有用的操作能让你在改坏之后三十秒内回到原状sudo cp /etc/apt/sources.list /etc/apt/sources.list.$(date %F)备份文件会带上日期比如sources.list.2025-01-11。如果后面操作出了问题恢复只需要sudo mv /etc/apt/sources.list.2025-01-11 /etc/apt/sources.list对于新版 Ubuntu 系统后面会细说备份是把整个/etc/apt/sources.list.d/目录里的源文件复制一份到其他目录而不是只备份sources.list。我还习惯把所有源相关的文件放到一个目录备份避免漏掉。毕竟新版系统除了sources.list还存在/etc/apt/sources.list.d/ubuntu.sources这种新格式文件只备份老文件很容易造成“改了但没完全改”的尴尬。2.3 源安全性签名与 HTTPS 的细节换源后有个容易忽略的安全点镜像站的仓库元数据都带有 GPG 签名。apt update会自动校验签名的公钥是否在系统信任列表里如果不在就会报NO_PUBKEY或The following signatures couldnt be verified错误。大多数正规镜像站清华、阿里、中科大、华为云等的文件结构完全复刻官方源包括公钥体系所以默认系统里自带的 Ubuntu 官方公钥就能直接验证通过不需要额外导入。但如果你用的是某些小众镜像、公司内网自制源或者系统时间严重偏差也会触发签名验证失败。这类问题我在第 4 章的排错表里集中讲。关于 HTTPS当前主流的国内外镜像站都支持 HTTPS。建议源地址使用 HTTPS 而不是 HTTP防止运营商劫持或中间人篡改软件包。虽然 apt 有 GPG 签名兜底但加密传输总是更稳妥的选择。3. 不同系统版本下的换源实操3.1 图形化方式适合桌面版新手的操作路径如果你用的是 Ubuntu 桌面版最直观的换源方式是走图形界面。打开“软件和更新”Software Updates在“Ubuntu 软件”选项卡里把“下载自”后面的服务器地址从“Ubuntu 服务器”改成“其他站点”然后在弹出的列表里找到阿里云、清华等镜像站选中后点击“选择服务器”系统会自动刷新源索引。图形化方式适合不想碰命令行的新手。但有一个坑如果你没有装software-properties-qt或software-properties-gtk这些组件快捷键software-properties-gtk可能会提示找不到命令。桌面版一般预装服务器版大概率没有这个界面遇到这种情况直接跳去命令行方式。另外图形界面改完源之后建议再手动刷新一次索引因为界面有时不会即时触发apt updatesudo apt update3.2 经典单文件方法20.04 到 22.04 的通用做法对于 20.04、22.04 以及更老没有切到新配置系统的 Ubuntu源配置集中在/etc/apt/sources.list。你可以先打开文件看下内容结构然后再覆盖它。查看cat /etc/apt/sources.list备份之后用你喜欢的编辑器修改。我习惯直接用tee命令写入整个文件比较干脆sudo tee /etc/apt/sources.list EOF deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse EOF注意把jammy替换成你自己系统对应的代号22.04 就是 jammy20.04 是 focal。jammy和jammy-updates的区别在于前者是基准发布版本后者是持续推送的安全更新和 bug 修复。日常建议把 updates 和 security 都打开不然漏洞补丁会常年收不到。写完以后执行sudo apt update正常情况下终端会显示连接的是mirrors.aliyun.com并且下载索引速度明显变快。3.3 新版 24.04 的 deb822 格式别只盯着 sources.list这里必须单独说。从 24.04noble开始Ubuntu 官方把 apt 源格式切换成 deb822 格式配置文件路径变成了/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这种方式跟传统的sources.list语法差别很大。如果你直接复制老教程里的deb http://...格式内容硬塞进去apt 虽然也兼容读取sources.list文件但新版默认其实已经不读/etc/apt/sources.list了主源都放在/etc/apt/sources.list.d/ubuntu.sources里。所以 24.04 及更新版本换源最稳妥的做法是直接修改这个.sources文件把URIs一行改成镜像站地址。例如sudo sed -i s|http://archive.ubuntu.com/ubuntu/|https://mirrors.tuna.tsinghua.edu.cn/ubuntu/| /etc/apt/sources.list.d/ubuntu.sources如果你不想用 sed直接sudo nano /etc/apt/sources.list.d/ubuntu.sources手改也行只改 URIs 那一段其余保持默认。这里还有一个很多人会忽略的问题如果你用的是 26.04 这种还未正式发布或刚进开发周期的版本镜像站的同步可能不稳定甚至没有对应版本的目录。遇到 404 别慌先确认镜像站是否已经同步了你那个版本再去换源页看同步状态。热词里出现ubuntu 26.04 换源但 26.04 目前还是开发版我的建议是开发版用户换源前先lsb_release -c确认代号再手动验证镜像站目录是否存在。3.4 开发板、ARM 设备与 Docker 容器的特殊处理开发板跑 Ubuntu 的场景和 x86 台式机完全不同。树莓派、RK3588 开发板、飞腾、兆芯这些 ARM 设备使用的源是ubuntu-ports仓库不是标准ubuntu仓库。如果你把 x86 的源地址写到 ARM 设备上大概率会得到 404 或架构不匹配的报错。ARM 开发板的换源模板以 22.04 jammy 为例sudo tee /etc/apt/sources.list EOF deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse EOF阿里云、中科大也都有对应的ubuntu-ports目录路径规则一样。24.04 的 ARM 设备同样需要改/etc/apt/sources.list.d/ubuntu.sources里的 URIs把ports.ubuntu.com/ubuntu-ports/替换成镜像站对应路径。Docker 容器里跑 Ubuntu 的话容器一般继承了宿主机的 DNS 配置但容器内可能没有systemd图形化换源想都不用想。直接改容器内的源文件即可。如果你 Docker 镜像本身是用ubuntu:24.04拉取的那同样要处理 deb822 格式不能照抄老教程。4. 换源后的验证、排错与常见问题4.1 验证换源是否成功的三个步骤换完源别急着装软件先做三轮验证确保没有埋雷。第一步更新索引看是否正常sudo apt update正常输出末尾会出现Reading package lists... Done Building dependency tree... Done Reading state information... Done All packages are up to date.如果出现很多Err开头的内容说明你的源文件有地方写错了。可以贴出错误信息照着下文的速查表排查。第二步测试实际下载速度。随便装一个小软件比如sudo apt install net-tools观察终端里的下载速率。如果速度从几十kB/s提升到几MB/s恭喜换源成功。第三步顺手跑一个依赖解析确认源索引的依赖关系完整sudo apt install -s git这条命令只做模拟安装不实际改动系统。如果依赖解析正常说明源没有缺包。4.2 常见报错速查表我把自己这些年踩过的坑整理成表格你对照着排查会快很多错误现象主要原因解决办法404 Not Found源地址里的版本代号写错镜像站没有这个目录lsb_release -c确认代号改成正确版本NO_PUBKEY 或签名无法验证系统时间不对或镜像源用的公钥不在信任列表校准时间sudo apt install ntpdate然后sudo ntpdate ntp.ubuntu.com必要时导入对应公钥Hash Sum mismatch镜像站同步不完整或本地索引缓存损坏清缓存重试sudo apt clean后用sudo apt update连接超时镜像站不可达或 DNS 解析问题ping镜像站域名确认网络换一个镜像站试试无法找到软件包某些软件只在 universe 或 multiverse 组件里检查源文件是否包含universe multiverse组件依赖关系损坏换源前系统里已有半安装的包执行sudo apt --fix-broken install后再 updateapt 锁无法获取之前有 apt 进程被中断锁文件残留找到并 kill 残留进程后删除/var/lib/dpkg/lock-frontend等锁文件补充一个很容易被忽略的点如果你的系统时间离真实时间偏差超过几分钟HTTPS 证书和 GPG 签名都会被判定为无效。很多“换源后签名验证失败”的问题根源其实是时间漂移不是源错了。用date看下时间再决定要不要同步。4.3 更新与升级的节奏控制换源完成后不是非要立刻apt full-upgrade。如果系统装了很久、跑得很稳定只想应急装个软件那apt update后直接apt install就好没必要盲目升级几百个软件包。如果确实想升级建议分步走。先apt upgrade升级已安装软件包再考虑apt dist-upgrade处理内核升级和依赖变化。LTS 版本之间的跨版本升级比如 20.04 升 22.04不建议通过手动换源后硬升除非你很清楚do-release-upgrade的流程。跨版本升级时会替换源文件里的代号换过源的机器可能会遇到源不匹配的提示升级前记得把源临时改回官方源。对于 26.04 这种开发版本我的态度比较保守用来折腾新鲜特性可以但别在主力生产环境用。开发版镜像源可能同步不全加上系统本身还在迭代遇到依赖断裂的概率比 LTS 高不少。4.4 锦上添花把 pip、conda 也一并换好换完 apt 源之后很多人会发现 Python 的pip install同样慢如蜗牛。既然都在折腾源了建议顺手把 Python 包管理器的源也切换掉。给用户目录下的 pip 配置写入国内镜像mkdir -p ~/.pip tee ~/.pip/pip.conf EOF [global] index-url https://mirrors.aliyun.com/pypi/simple/ trusted-host mirrors.aliyun.com EOF用 conda 的话可以执行conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --set show_channel_urls yes这样不管 apt、pip 还是 conda下载体验都能拉满不用之后再一遍遍搜“pip 换源”“conda 换源”。写在最后一点个人经验教了这么多次换源我自己的习惯始终是备份永远优先于修改版本代号永远比地址重要。不管用哪个镜像站成功的关键不是复制粘贴而是确认自己系统版本的代号、架构和配置文件路径。新版 Ubuntu 24.04 的 deb822 格式和传统的sources.list差异很大动手前先看一眼文件内容再决定怎么改比盲抄任何教程都靠谱。再分享一个小技巧换完源之后如果用着用着发现某个软件源里的包一直比官方少一个版本别怀疑是自己改坏了去镜像站的网页上看一眼同步状态就好。镜像站的同步频率有差异有的每小时同步一次有的一天一次所以偶尔“慢半拍”是正常的。如果你在换源过程中遇到上面表格里没列到的报错不妨先执行apt update然后看完整输出错误信息里基本都会直接指明是哪个源、哪个文件出了问题。绝大多数“换源失败”都是版本代号或者文件路径的小事耐心看一遍输出你也能成为帮别人修源的那个人。
返回列表