刚装完 Ubuntu,或者用着用着发现apt update慢到让人想砸键盘,这时候十有八九会有人告诉你“换个国内源”。而在所有国内镜像站里,清华源(mirrors.tuna.tsinghua.edu.cn)又是出现频率最高的那个。我最初接触 Ubuntu 那会儿踩过不少坑,换源的时候甚至还把系统搞到差点重装,所以这篇文章打算把 Ubuntu 换清华源的完整思路和实操步骤一次性讲清楚:你会明白软件源是什么、为什么选清华源、从老版本的sources.list到 24.04 的ubuntu.sources该怎么处理、pip 和 conda 这类 Python 生态工具怎么跟清华源联动,以及被拒、404、GPG 报错这些高频问题到底怎么排查。不管你是刚装完虚拟机的新手,还是已经在 WSL 里折腾了一段时间的开发者,照着这份思路走,基本不会再被源的问题卡住。
1. 换源之前,先搞明白软件源到底是个啥
1.1 软件源的本质:apt 从哪里把软件拉下来
很多人把“换源”当成一个固定操作,复制粘贴完就结束了。但如果不理解背后的机制,后面一旦遇到报错,你根本不知道从哪里下手。所谓软件源,就是 Ubuntu 系统里 apt 这个包管理器默认连接的软件仓库。你可以把它想象成手机上的应用商店,apt install的时候,系统其实是在向这个“商店”查询软件包并下载安装。
这个“商店”的地址,写在/etc/apt/sources.list文件里,或者说,写在/etc/apt/sources.list.d/目录下的源文件里。Ubuntu 默认配置的是官方服务器地址archive.ubuntu.com和security.ubuntu.com。从国内网络环境直连这两个地址,速度时快时慢,高峰期甚至会出现几十 KB/s 的下载速度,装个稍微大点的软件包都像在受刑。镜像站的作用,就是把这些官方仓库的内容完整同步到国内服务器上,让你访问时走的是国内链路,速度自然快几个数量级。
1.2 为什么偏偏是清华源
国内能用的镜像站其实不少,阿里、中科大、华为云都有。但清华大学的 TUNA 镜像站一直是口碑最稳的那一档。首先是带宽和同步频率都有保障,Ubuntu、Debian、CentOS 这些主流发行版的仓库更新非常及时,基本不会出现“官方已经发了新版本,镜像站还差半天没同步”的情况。其次是覆盖面广,清华源不止有 apt,还有 pip、conda、npm、docker 等一整套开发环境需要的镜像,你换完系统源之后,Python 和 Anaconda 顺便也一起换了,一套配置走天下。
所以这篇文章里的“清华源”,指的不只是一个 apt 源,而是以mirrors.tuna.tsinghua.edu.cn为根地址的一组镜像服务。适合的人群也很明确:国内 Ubuntu 用户、刚装好系统或虚拟机的学习者、在 WSL 里做开发的人,以及任何被 apt、pip 下载速度折磨过的开发者。
2. 换源前的准备:版本判断与备份
2.1 先确认你的 Ubuntu 版本和源文件格式
这是我在实际交流中发现最多人栽跟头的地方。Ubuntu 的换源方式,不同版本之间其实有差异,尤其是 24.04 之后,源文件的组织方式发生了不小变化。你在网上搜教程时,如果照着旧版本的方法去改新版本,大概率会遇到“文件不存在”或者“改了之后没效果”的尴尬。
第一步,确认系统版本和代号:
lsb_release -a或者:
cat /etc/os-release输出里会出现类似Ubuntu 22.04.4 LTS这样的系统版本,以及jammy、noble这样的版本代号。这个代号很重要,因为源地址里的路径是按代号来的。常见对应关系大概是:
| 版本 | 代号 | 源文件位置 |
|---|---|---|
| 20.04 | focal | /etc/apt/sources.list |
| 22.04 | jammy | /etc/apt/sources.list |
| 24.04 | noble | /etc/apt/sources.list.d/ubuntu.sources |
24.04 开始,默认源文件从原来的单行列表格式切换成了 deb822 多行格式,放在/etc/apt/sources.list.d/ubuntu.sources里。如果你在 24.04 上还只盯着/etc/apt/sources.list改,基本是白忙一场,因为系统默认走的是ubuntu.sources这个文件。
2.2 备份源文件,给自己留条退路
改任何系统配置文件之前,备份是底线。这个习惯我建议你从一开始就养成,尤其是源文件这种直接关系到系统能否正常安装软件的关键配置。万一改错了、写挂了,还原备份远比在网上重新找教程要快。
老版本格式备份:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak新版本 deb822 格式备份:
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak备份文件名后面的.bak是约定俗成的后缀,你叫backup1也行,只要能认出来就能用。此时不要急着改文件,先看一眼当前源文件的内容,确认里面写的是不是官方地址。如果是,下一步直接替换;如果你之前已经换过别的源,那么替换时就要以实际内容为准。
3. apt 换源完整实操:从 sed 一键替换到手写配置
3.1 源文件里到底写了什么
先看老格式的/etc/apt/sources.list,默认内容大致是:
deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse一行一条源。每行里,deb表示这是一个二进制软件包源,后面跟的是服务器地址,再后面是发行版代号,最后是组件类别。main是官方维护的自由软件,restricted是官方支持的非自由软件,universe是社区维护的自由软件,multiverse是可能带有版权问题的非自由软件。日常使用建议四个都保留,避免装某些软件时提示找不到包。
24.04 的/etc/apt/sources.list.d/ubuntu.sources默认内容大致是:
Types: deb URIs: http://archive.ubuntu.com/ubuntu/ Suites: noble noble-updates noble-backports noble-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg含义和老格式一一对应,只是换成了结构化写法。URIs对应仓库地址,Suites对应发行版代号及更新通道,Components对应组件类别,Signed-By指定用于验证该源签名的密钥文件。
3.2 一条 sed 命令完成域名批量替换
替换的核心思路很简单:把域名从官方地址改成清华镜像地址,后面的路径保持/ubuntu/不变。
如果你的系统是老格式(20.04、22.04),在终端依次执行:
sudo sed -i 's@//archive.ubuntu.com/ubuntu/@//mirrors.tuna.tsinghua.edu.cn/ubuntu/@g' /etc/apt/sources.list sudo sed -i 's@//security.ubuntu.com/ubuntu/@//mirrors.tuna.tsinghua.edu.cn/ubuntu/@g' /etc/apt/sources.list如果你的系统是 24.04 新格式,执行:
sudo sed -i 's@//archive.ubuntu.com/ubuntu/@//mirrors.tuna.tsinghua.edu.cn/ubuntu/@g' /etc/apt/sources.list.d/ubuntu.sources sudo sed -i 's@//security.ubuntu.com/ubuntu/@//mirrors.tuna.tsinghua.edu.cn/ubuntu/@g' /etc/apt/sources.list.d/ubuntu.sources命令里的s@旧内容@新内容@g,表示把每一行中出现的旧内容全部替换成新内容。之所以用@做分隔符而不是常见的/,是因为地址里本身包含/,直接混用会让命令变得很难读。
替换完之后,建议先cat看一眼文件内容,确认所有官方域名都变成了mirrors.tuna.tsinghua.edu.cn,再进入下一步。
3.3 手写配置的方式也给你备好了
sed 替换适合整个文件都是默认源的情况。如果你之前手动添加过第三方源,或者文件内容已经被改得不认识了,那干脆手动编辑更稳妥。用你习惯的编辑器打开源文件,例如:
sudo vim /etc/apt/sources.list老格式直接写入以下内容(以 22.04 为例,其他版本将jammy换成对应代号):
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse24.04 新格式则编辑/etc/apt/sources.list.d/ubuntu.sources,写入:
Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ Suites: noble noble-updates noble-backports noble-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg这里有个细节:为什么新格式里没有单独给noble-security拆一个独立块?因为清华镜像的/ubuntu/路径下已经同步了noble-security这个套件,合并写在Suites里,Ubuntu 会统一从清华拉取,不存在老版本里security需要指向另一个域名的情况。这是新格式一个很舒服的地方,域名统一了,换源也就干净了。
3.4 更新源并验证结果
源文件改完之后,执行:
sudo apt update看到输出里大量出现Hit、Get,并且地址是mirrors.tuna.tsinghua.edu.cn,说明源已经生效。Hit表示仓库元数据没有变化,直接用缓存;Get表示有更新,正在下载;Ign一般是无害的忽略提示。如果更新过程中出现Err,就得进入第 5 章对着问题排查了。
确认源没问题后,顺便执行:
sudo apt full-upgrade把系统中所有软件包同步到镜像站对应的最新状态。这一步不是必须的,但我建议新装的系统做一次,因为官方源和镜像站在同步时间点上可能存在微小差异,升级完能避免依赖版本不一致导致的奇怪问题。
4. 不只是 apt:pip、conda 等生态的清华源配置
4.1 pip 换源:Python 开发者的刚需
apt 搞定之后,紧接着要处理的就是 pip。很多人在 Ubuntu 上用 pip 装 Python 包,速度同样让人着急。清华 PyPI 镜像地址是:
https://pypi.tuna.tsinghua.edu.cn/simple临时使用,安装某个包时手动指定:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple永久生效,写入 pip 配置文件。Linux 下的用户级配置文件位于~/.config/pip/pip.conf,没有就自己创建:
mkdir -p ~/.config/pip vim ~/.config/pip/pip.conf写入:
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple保存后,执行pip config list可以看到当前生效的配置。以后所有pip install都会走清华源,不需要每次带-i参数了。
这里我多提一句:有些旧教程会让你加trusted-host = pypi.tuna.tsinghua.edu.cn,这是因为早期使用 HTTP 协议或证书链不完整时需要跳过校验。现在清华源使用标准 HTTPS 证书,trusted-host已经不是必需的配置。如果你在公司内网,代理或防火墙导致证书校验失败,再考虑加这一行,否则别乱加,保持配置最小化才是好习惯。
4.2 conda 换源:装 Python 3.11 这类需求时特别省心
很多用 Anaconda 或 Miniconda 的用户,经常遇到conda create -n py311 python=3.11时下载速度极慢的情况。conda 默认的 repo 源在国外,清华源同样提供了 Anaconda 仓库镜像。
在用户主目录下编辑.condarc文件:
vim ~/.condarc写入:
channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud保存后,通过以下命令验证配置:
conda config --show channels conda config --show default_channelsdefault_channels是 conda 在默认官方源位置替换后的地址,custom_channels则是把 conda-forge、pytorch 这类社区频道也指到清华镜像的对应目录。这样配置之后,创建环境或者安装 PyTorch 等大体积包时,速度提升会非常明显。
4.3 其他常见源的快捷入口
清华源还有 npm、docker-ce、ros 等大量的镜像。比如 npm 只需要设置 registry:
npm config set registry https://mirrors.tuna.tsinghua.edu.cn/npm/docker 则是在/etc/docker/daemon.json里配置registry-mirrors,指向清华提供的 docker 镜像加速地址。这些按需配置即可,不用一次性全换,也不建议盲目把所有软件都指向同一个镜像站,那样反而可能因为单点带宽占用导致速度不升反降。
5. 换源后常见问题与排查实录
5.1 被清华源拒绝访问,到底怎么回事
这是搜索热词里一个很典型的问题:“被清华源拒绝访问”。实际表现往往是浏览器能打开清华源页面,但 apt 或 pip 莫名其妙报 403、403 Forbidden,或者干脆连接被重置。
根据我的排查经验,绝大多数 403 和“拒绝访问”不是你的 IP 被封了,而是镜像站对请求的客户端做了识别。清华源这类面向全网的公共服务,为了避免被爬虫和恶意脚本拖垮,会校验User-Agent。如果你用 Python 的requests库或者某些下载工具的默认 UA 去抓取镜像站内容,就可能被判定为非正常客户端而拒绝。
正常使用 apt 时,apt 自带的 UA 是类似APT-HTTP/1.3这样的标识,pip 也有自己的 UA,这些都不会被限制,所以日常apt update、pip install其实很少遇到拒绝访问。如果你确实用脚本去批量下载镜像站文件,建议把 UA 设置成常见浏览器的标识,并且控制请求频率,避免给公共资源造成压力。另外,如果你在公司或学校网络环境,出口 IP 是共享的,可能有别人误操作触发了镜像站的临时封锁,这种情况通常过段时间会自动恢复。
5.2 GPG 签名验证失败:NO_PUBKEY
换源之后执行apt update,有时会看到类似:
W: GPG error: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY XXXXXXXX这种问题通常不是清华源本身的问题,而是你的系统缺少某个软件源的官方 GPG 公钥。Ubuntu 用 GPG 签名来保证软件包来自官方且未被篡改,镜像站只是原样同步仓库和签名,密钥校验仍然走官方机制。
解决办法就是导入缺失的密钥。新版本系统建议用gpg配合 keyserver 导入:
sudo gpg --keyserver keyserver.ubuntu.com --recv-keys <报错里给出的KEY>然后再把导出的密钥放到系统 keyrings 目录(以 24.04 为例):
gpg --export <报错里给出的KEY> | sudo tee /usr/share/keyrings/<自定义名称>.gpg > /dev/null之后在源文件里把Signed-By指向这个 keyring 文件,再执行apt update。旧版本系统可能还会看到apt-key的用法,但 apt-key 在新版本里已经被标记为废弃,建议尽量用上面这种方式。
5.3 404 Not Found:路径、代号、组件别搞混
apt update报 404,核心原因基本是源地址里某个字段写错了。最常见的三种:
第一种,版本代号写错。源地址里必须用当前系统的代号,比如 24.04 是noble,你写成了jammy,镜像站对应路径下自然找不到这个仓库,直接 404。
第二种,源文件里混入了不存在的套件。比如某些教程让你写noble-proposed,但该套件在清华源dists目录下已经不再同步,或者你没有启用对应组件,都会导致访问失败。
第三种,用了旧格式文件却混入了新格式的配置。24.04 如果你还在/etc/apt/sources.list里写deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble ...,同时系统又读到ubuntu.sources里的内容,两边一旦冲突,同样可能引发各种诡异报错。
排查方法很直接:打开浏览器,或者用 curl,访问报错里给出的完整 URL,看这个路径在镜像站上是否真实存在。比如:
curl -I https://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/noble/Release能返回 200,说明路径正确;返回 404,就逐层检查路径里的每个部分。
5.4 换源后 apt update 卡住或极慢
明明换了国内源,为什么apt update还是很慢甚至像卡死了?
我遇到的一个高频原因是 IPv6 优先策略。如果你的机器有 IPv6 地址,但网络环境对 IPv6 支持不好,apt 在尝试连接镜像站的 IPv6 地址时会长时间超时,然后才回退到 IPv4,表现出来就是“转圈圈转很久”。解决办法要么是调整 DNS 让系统优先解析 IPv4,要么临时禁用 IPv6 测试一下:
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1不过这个方案只是临时验证用,不要永久关闭 IPv6,更稳妥的做法是调整 apt 的Acquire::ForceIPv4配置:
echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4另一个可能原因是你之前在其他源文件里残留了无效的第三方源。apt update会遍历/etc/apt/sources.list.d/下的所有源定义,其中任意一个长时间超时,都会拖慢整体进度。排查时用apt update -o Acquire::http::Timeout=5这种带超时参数的方式,快速找出哪个源有问题,然后注释或删除它。
5.5 常见问题速查
| 现象 | 大概率原因 | 处理方式 |
|---|---|---|
| 403 / 被拒绝访问 | 客户端 UA 异常或请求过于频繁 | 检查 UA、控制请求频率,正常 apt/pip 很少触发 |
| NO_PUBKEY | 缺少软件源公钥 | 通过 keyserver 导入该源对应密钥 |
| 404 Not Found | 路径、代号、组件写错 | 用 curl 访问完整 URL 定位错误字段 |
| apt update 极慢 | 某第三方源超时、IPv6 优先 | 禁用无效源、按需强制 IPv4 |
| 找不到软件包 | 源没有更新或组件缺失 | 确认执行过 apt update、检查 Components 是否包含 universe 等 |
| 安装包版本不是最新 | 镜像同步存在少量延迟 | 等待同步,或主动访问镜像站确认版本状态 |
6. 换完源之后,顺手把这些环境问题一起解决
清华源配置好了之后,很多新装系统的朋友紧接着会遇到一连串“接下来怎么办”的问题。我把最常被问到、且跟源/环境紧密相关的几个点一并列出来,你可以按需操作。
6.1 安装基础开发工具链
新装系统最痛的坑之一,就是gcc、make这类工具没有预装。执行:
sudo apt install build-essentialbuild-essential是一个元包,会把你需要的 gcc、g++、make 等基础编译工具链一起装好。很多时候你发现“ubuntu 安装 gcc 失败”,其实不是 gcc 本身装不上,而是之前没执行过apt update,源列表还是旧的,或者系统里缺少依赖。先把源换好并apt update,然后再装build-essential,大部分问题都能顺带解决。
6.2 SSH 远程连接配置
虚拟机里装好 Ubuntu,经常遇到 Windows 上用 Xshell 或者别的终端工具连不上。这种情况八成是系统里压根没装 OpenSSH 服务端。执行:
sudo apt install openssh-server sudo systemctl enable --now ssh如果还连不上,检查防火墙是否放行了 22 端口:
sudo ufw allow ssh另外确认网络模式是否正确,比如虚拟机里用 NAT 模式时,端口转发配置要指向虚拟机的实际 IP 和 22 端口。And 别忘了查看 Ubuntu 的 IP:ip addr。
6.3 中文输入法
中文输入法是很多人刚切换到 Ubuntu 时的痛点。现在 Ubuntu 24.04 系统自带的 IBus 已经能比较顺滑地支持中文拼音,你可以在系统设置里的 Region & Language 中添加中文输入源,试试自带的拼音引擎。如果更习惯搜狗输入法,那就要装 fcitx 框架,再去搜狗官网下载 Linux 版本安装包,安装后切到 fcitx,重启会话生效。
这里我多一句嘴:不建议一上来就折腾第三方输入法,先用系统自带拼音一两周。如果只是偶尔打中文,自带的完全够用;如果确实有大量中文输入需求,再考虑搜狗这类方案,能少踩很多兼容性的坑。
6.4 N 卡驱动
笔记本或台式机用了 NVIDIA 显卡,在 Ubuntu 上经常会出现分辨率异常、外接显示器不识别之类的现象,基本就是缺驱动。最简单的方式是在换好源之后执行:
sudo ubuntu-drivers autoinstall这个命令会自动检测你机器上的 NVIDIA 显卡型号并安装匹配的驱动。安装完成后务必重启一次。当你在网上看到“ubuntu 安装 nvidia 显卡驱动”一堆复杂的教程时,先试试这条命令,能解决大部分人的需求。
换源这件事,本身不复杂,但它牵涉到的环境细节和后续配置很多。做完一遍之后你会发现,apt、pip、conda 全都快了,开发环境搭建的顺畅度完全上了一个台阶。我自己的习惯是:任何新装的 Ubuntu 系统,第一步永远都是备份源文件、换成清华源、apt update、apt full-upgrade,然后再去装其他东西。这套流程踩过太多次坑之后,已经成了肌肉记忆,也希望能帮你少走点弯路。