在Ubuntu上折腾Anaconda环境,十个有九个都被“慢”字折磨过。不管是conda install pytorch卡出天际,还是apt-get update半天没反应,归根到底都是卡在“默认源离你太远”这个问题上。我这台装了双系统的Ubuntu机器,从22.04一路用到24.04,中间换了至少三次源方案,踩过404、踩过SSL报错、也踩过源混用导致的依赖冲突,今天这篇就专门把apt源、conda源、pip源这三件事一次说透。适合刚装完Ubuntu和Anaconda的新手,也给那些觉得“自己源没问题”的老手一个排查思路——毕竟换源不是改一行配置就完事,后面藏着一堆坑。
1. 换源前必须搞清楚的底层逻辑
1.1 为什么在Ubuntu上一定要换源
先说最根本的问题:官方源到底慢在哪。Ubuntu的apt默认源指向的是archive.ubuntu.com,conda默认源指向的是repo.anaconda.com,pip默认源是pypi.org,这些服务器的物理位置都在国外。国内访问的时候,数据包要经过长距离的国际链路传输,丢包和延迟会明显放大,表现就是你看到的“几十KB/s的龟速下载”或者“干脆超时无响应”。
镜像站的原理其实特别简单:国内的一些高校和云厂商搭了服务器,定期从上游官方仓库做一次全量同步,把整个软件仓库“搬到”国内,然后对外提供下载服务。既然物理距离变近了,速度自然就上来了。实测的情况下,同一台机器,还源前conda下载速度只有几十KB,换完清华源能稳定跑到10MB/s以上,差距非常直观。
这里有个容易混淆的点:apt源、conda源、pip源,它们管的是三套完全不相干的东西。用apt install装的是Ubuntu系统包,比如gcc、openssh-server;用conda install装的是Anaconda发行版维护的Python包和预编译库,比如cudatoolkit、pytorch;用pip install装的是PyPI上的Python包,比如requests、django。三者互不替代,所以换源也是三件事,漏掉任何一个,总有一个地方会继续慢。
1.2 三类源分别解决什么问题
| 源类型 | 对应命令 | 管理内容 | 典型配置位置 |
|---|---|---|---|
| apt源 | apt update/apt install | Ubuntu系统级软件包 | /etc/apt/sources.list |
| conda源 | conda install/conda create | Anaconda虚拟环境包 | ~/.condarc |
| pip源 | pip install | Python包 | ~/.pip/pip.conf |
注意表格里的配置位置是针对单用户的,如果你机器上有多个用户都要用conda,或者你有root权限想给整台机器做全局配置,那么conda源还可以写到/etc/conda/.condarc,pip源可以写到/etc/pip.conf,后面我会单独讲这个区别。
很多人喜欢把conda源和pip源混为一谈,但这两个的镜像仓库完全是独立的。清华源上,conda走的是https://mirrors.tuna.tsinghua.edu.cn/anaconda/这个路径,pip走的是https://pypi.tuna.tsinghua.edu.cn/simple这个路径。你要是把pip的源地址填到conda的配置文件里,它肯定报404,反过来也一样。
1.3 换源前必须确认的三条基础信息
动手之前,先把这三样东西搞清楚,不然折腾半天可能白干。
第一,Ubuntu的版本代号。不同版本的apt源地址里,路径最后一段是版本代号,写错了直接404。查看命令:
lsb_release -cs如果是24.04,输出是noble;22.04输出是jammy;20.04输出是focal。后面写源配置的时候,这个代号要精确对应。
第二,Anaconda的安装路径。这决定了conda命令的归属,也影响你后面对环境变量的判断。用which conda查看,如果输出类似/home/yourname/anaconda3/bin/conda,说明是用户目录安装;如果输出/opt/anaconda3/bin/conda,就是系统级安装。两种安装方式下,.condarc配置的生效路径会有差异。
第三,当前pip配置里的残留项。很多人以前手动改过pip源,时间久了就忘了。先跑一下:
pip config list如果里面已经有一堆旧配置,后面可能需要先清理,否则新改的配置可能被旧的覆盖掉,排查问题的时候特别容易困惑。
2. Ubuntu系统级apt源更换(基础中的基础)
2.1 备份源文件,别上来就删
第一步永远是备份。虽然改坏了一个配置文件不至于让系统瘫痪,但apt源坏了之后,你连apt install都没法用,手边又没有离线包的时候会非常被动。备份很简单:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak现在较新版本的Ubuntu把源拆成了两种形式:传统的/etc/apt/sources.list单文件,和Ubuntu 24.04开始引入的/etc/apt/sources.list.d/ubuntu.sources新格式。如果你的系统是后者,上面那行cp命令可能发现文件不存在,那就备份整个目录:
sudo cp -r /etc/apt/sources.list.d /etc/apt/sources.list.d.bak这里给个实际经验:不管系统默认用的是哪种格式,备份做一下不亏。因为镜像站对新格式的支持也是最近才跟上的,万一你要降级回原版系统源,有个备份文件在,两秒钟就能还原。
2.2 编辑apt源配置,用清华镜像
我用清华源比较多,其他镜像站的配置方式几乎一样,就是域名不同。如果你用的是传统sources.list格式,直接编辑:
sudo vim /etc/apt/sources.list然后把文件里的所有内容替换成下面这些。注意noble要改成你实际的版本代号:
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-security main restricted universe multiverse如果你是Debian系的sources格式,也就是24.04默认的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扩展一句,很多教程喜欢同时打开deb-src源,也就是源码包,但我个人建议默认关掉。deb-src会额外拉取大量的源码索引,拖慢apt update的速度,而且对绝大多数普通用户来说用不上。真需要源码包的时候再临时加一行注释打开就行,没必要平时开着给自己添堵。
2.3 apt update生效验证
改完配置,更新索引:
sudo apt update这一步会重新拉取软件包列表,如果输出里的Hit和Get速度明显变快,没有404和Failed,就说明源生效了。然后再验证一下:
apt policy这个命令会列出当前所有的源和优先级。如果看到http://mirrors.tuna.tsinghua.edu.cn/ubuntu/在列表里,且优先级是500,说明配置正确。
我遇到过一种情况:改完apt源之后apt update报Certificate verification failed,也就是证书验证失败。这个和清华大学镜像站的历史问题有关——早些年它用过自带证书,现在一般不会有这个问题。如果真遇到,先检查系统时间是不是不对,date命令看一下,时间偏差会导致TLS握手失败。别急着关证书验证,优先排查系统时间。
3. conda源配置(Anaconda加速的关键环节)
3.1 什么是.condarc,在哪生成
.condarc是conda的配置文件,名字前面带点,是隐藏文件。它控制着conda从哪下载包、显示什么渠道、是否开启strict channel优先级等。文件一般放在当前用户的家目录下:
cd ~ && touch .condarc很多新手的误区是去Anaconda的安装目录找这个文件,其实那个目录是系统级的,优先级低于用户目录。除非你有特殊需求,否则统一配置在~/.condarc就对了。
我建议直接用conda config命令来生成和操作这个文件,而不是手动vim。命令式操作的好处是conda自己会处理好格式,不会因为写错缩进导致整个文件失效:
conda config --set show_channel_urls yes执行完这条,你的~/.condarc文件就自动生成了,里面会多一行show_channel_urls: true。这一步相当于“初始化”了conda的配置文件机制,后面我们再往里灌镜像源配置。
3.2 写入清华conda镜像源
直接编辑~/.condarc,把下面这段内容放进去。我实测过,清华源是目前国内conda镜像里同步稳定、速度也靠谱的一个:
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解释一下这里的逻辑。channels里的defaults是让你继续使用默认的Anaconda仓库,但接着的default_channels把默认仓库的实际URL从官方地址重定向到了清华镜像。custom_channels解决的是第三方channel的映射——你写conda install -c conda-forge somepackage的时候,conda会去https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge找包,而不是去国外的conda.anaconda.org。
写得直白一点:如果你只改了channels但不改default_channels和custom_channels,那conda还是去官方地址拉包,换源等于没换。这是很多教程没讲到位的坑。
如果你更喜欢用中科大源或者阿里云源,把上面的域名整体替换就行。阿里云conda源的配置稍微有点不一样,它的路径不带anaconda这段,建议直接参照阿里云开发社区最新的配置样例,因为它的路径结构做过调整,旧教程里的URL很可能会404。
3.3 conda换源后的生效验证
改完源之后,不能直接conda install看效果,因为conda会缓存索引。正确操作是:
conda clean -i -y这一步清除的是之前从官方源拉取的索引缓存。然后新建一个测试环境感受一下速度:
conda create -n test_speed python=3.10 -y如果输出里出现Downloading and Extracting Packages且进度条刷刷走,说明源生效了。如果速度还是慢,那多半是http而不是https的遗留配置,或者在缓存清理这一步漏了。
顺手看一眼当前实际生效的源:
conda config --show channels conda config --show default_channels这两条命令会打印出conda解析后的channel地址,核对一下域名是否已经指向了镜像站。
3.4 多用户环境的conda源配置差异
单用户配置.condarc在~/.condarc,但如果是多用户共用的Anaconda,最好在/etc/conda/.condarc这个路径做全局配置。这个文件的优先级低于用户级,也就是说每个用户可以在自己的~/.condarc里覆盖全局配置。
还有一个细节:conda的channel优先级。如果你在channels里写了多个源(比如同时写了defaults和conda-forge),conda会从左到右依次查找包,左侧优先级更高。默认策略下,如果前面的源找不到某个包,它会自动去后面的源找。但如果你开了channel_priority: strict,那么conda只会从优先级最高的channel里找包,找不到就直接报错。这个设置适合对包来源有强制要求的场景,普通用户保持默认的flexible就好。
4. pip源配置(Python包管理加速)
4.1 pip配置文件的位置与优先级
pip源和conda源是两回事,很多新手在Anaconda环境里直接用pip install,结果发现还是慢,原因就是pip还在用官方源。pip的配置文件查找有几个层级,从高到低是:
- 命令行参数(
-i指定) - 用户级配置文件:
~/.pip/pip.conf或~/.config/pip/pip.conf - 全局配置文件:
/etc/pip.conf或/etc/xdg/pip/pip.conf
这里有个好记的口诀:越靠近用户,优先级越高。命令行参数最高,其次用户配置,最后系统配置。所以如果你以前在命令行里硬编过-i参数,那配置文件怎么改都会被覆盖,排查的时候就看看有没有什么脚本里写死了源地址。
另外要注意:~/.pip/pip.conf和~/.config/pip/pip.conf如果同时存在,前者生效,后者被忽略。建议统一使用~/.pip/pip.conf,因为Anaconda环境下pip对~/.pip目录的兼容性最好。
4.2 修改pip源配置文件
手动创建并编辑~/.pip/pip.conf:
mkdir -p ~/.pip vim ~/.pip/pip.conf填入清华源配置:
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn如果更愿意用阿里云,就写:
[global] index-url = https://mirrors.aliyun.com/pypi/simple/ trusted-host = mirrors.aliyun.com这里有个网上讨论比较多的问题:trusted-host到底要不要写。它是用来跳过HTTPS证书校验的,但在清华和阿里这些官方镜像站的场景下,它们的证书都是正规机构签发的,理论上不需要写。我之前踩过一个坑:某些老教程里把trusted-host写得很大,导致pip不再校验证书,虽然速度没影响,但安全性上打了折扣。我的建议是:优先只配置index-url,如果pip报SSL: CERTIFICATE_VERIFY_FAILED,再回头检查系统证书链,而不是盲目加上trusted-host。如果确定是镜像站自身的证书问题或者内网环境需要,再加也不迟。
4.3 pip源换完怎么验证
最直接的验证方式是安装一个小体积的包,看日志里的URL:
pip install --no-cache-dir requests -v-v参数会输出详细的下载日志,正常情况下你会看到类似Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple的信息。如果打印的还是https://pypi.org/simple,说明配置没生效,按优先级顺序去排查是不是配置文件路径写错,或者有环境变量PIP_INDEX_URL干扰了。
另外强烈建议给pip加一个默认的no-cache-dir习惯,或者定期用pip cache purge清理缓存。缓存的坑在于:有时候你换源之后装包看似很快,实际上用的是旧源拉下来的缓存文件,时间长了把新旧包的版本搞混。清一次缓存,让pip从新源重新拉一遍,至少装大包之前是值得做的。
5. 换源后的踩坑实录与排查技巧
5.1 conda更新报404:版本与镜像兼容问题
清华镜像站对conda版本是有最低要求的。如果你用的conda版本太老(比如4.8以下),它请求的仓库元数据路径和老版本的repo格式不匹配,镜像站会返回404。这个问题的特征是:其他源都能用,唯独conda update的时候报CondaHTTPError: 404 NOT FOUND。
解决办法按顺序来:先试着直接升级conda本身:
conda update conda -c defaults如果这条命令也报404,那就临时加一个官方源地址把conda升上来:
conda update conda -c https://repo.anaconda.com/pkgs/main升完级再切回镜像源配置,问题一般就解决了。这属于老机器新场景的经典坑,重装系统几乎不会遇到,但如果你是从很旧的Anaconda版本一路升级上来的,那就很容易撞上。
5.2 pip换源后某些包反而装不了
一个真实经历:我在清华pip源上装某个包的夜间版,结果它报No matching distribution found。查了一下,发现这个包在官方PyPI上确实存在,但清华源的同频率是定时同步的,它还没有把最新的包同步过来。这不是配置问题,而是镜像源同步延迟。
这种情况下有两个选择:一是等镜像站同步完成,通常也就一两天;另一个是临时指定官方源装这一个包:
pip install package_name -i https://pypi.org/simple注意这个-i参数只对当前这一条命令生效,不会改变全局配置。这是一个很实用的临时切换手段,不会污染你的环境。
5.3 conda和pip混用导致的源冲突
这个问题堪称最常见的“伪源”问题。很多教程让用户在conda环境里用pip安装包,说速度更快,这么干本身没错,但如果你pip的源和conda的源都指向不同镜像,那会导致同一个包在两个仓库里的版本不一致,时间长了环境变得非常混乱。
我的习惯是:在conda环境里装包以conda为主,conda源配清华;如果某个包conda上没有,才用pip,并且pip源也配同一个镜像站。宁可两个都配清华,也不要用“conda用清华、pip用阿里”这种混搭。镜像站的同步时间点不同,包版本可能存在几个小时到几天的偏差,一旦你因为某个包追新版本,可能就是怀疑人生的开始。
还有一个非常隐蔽的坑:在conda环境里使用pip install --user。--user参数会把包装到~/.local目录下,而不是conda环境里,导致你在激活的环境里import不到,或者换个环境神奇的“复活”。这不是源的问题,是环境隔离被绕过了。在conda环境里,永远不要加--user。
5.4 速度慢的终极排查法
如果换完源还是慢,别急着怀疑镜像站。先做一次基准测试,看看到底是网络问题还是源问题:
wget -O /dev/null https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/repodata.json这条命令从清华源拉取一个相对较大的文件到空设备,测的就是纯粹的网络下载速度。如果这个速度正常,说明你到镜像站的链路没问题,那问题可能出在conda或者pip的HTTP请求并发配置上。可以试试在conda配置里加一行:
remote_max_retries: 5 remote_read_timeout_secs: 30.0这两个参数可以缓解网络抖动导致的下载中断问题。如果连wget都慢,那基本就是你本地网络到目标机房的线路问题,换哪个源都差不多。
5.5 镜像站的Notices与公告
镜像站并不总是无条件的稳定。清华、中科大这些镜像站偶尔会因为磁盘容量、上游故障等原因暂停某个仓库的同步,或者调整目录结构。如果你隔了很长一段时间回来,发现某个源突然404了,先别急着怀疑自己配置有误,去镜像站的官网公告页看一眼,看看是不是有临时变更。
6. 一些我个人用着顺手的经验补充
先说结论:我个人的最终方案是apt源用清华,conda源用清华主仓库+conda-forge,pip源用阿里。这套组合我用了大半年基本没出过问题。
有一个小技巧值得分享:每次配置完源之后,建议做个备注文件放在家目录,比如source_config_notes.md,把这次换源的日期、使用的镜像站、改了哪几个文件都记下来。看起来很傻,但半年之后你再需要排查环境问题,这份简单的笔记能帮你省出至少半小时查历史配置的时间。
还有一个容易被忽略的点:ubuntu.sources格式和sources.list格式的转换。如果你用的是Ubuntu 24.04初版自带的ubuntu.sources格式,想换回sources.list旧格式,需要把/etc/apt/sources.list.d/ubuntu.sources里的内容改掉或者禁用。我自己就曾经同时启用两份源文件,apt update的时候拉重复数据,还因为两套源优先级不同,差点把包比较器的索引搞乱。稳妥的检查方式:
ls /etc/apt/sources.list.d/看看这个目录下有哪些文件,确保不存在多个源的重复定义。
最后再提一个很多人没想到的点:Anaconda的pkgs/main仓库默认包含Python解释器、numpy等基础包,conda-forge仓库包含大量第三方扩展包。如果你用conda-forge的频率很高,建议在.condarc里把它的custom_channels配置好,否则每次-c conda-forge都会去官方源。这不是必然出错的场景,但确实是很多人配置完清华源之后,conda-forge渠道依然速度感人的原因。
说实话,换源这件事本身并不复杂,复杂的是换完之后,系统里可能残留下各种老配置和新配置互相打架的问题。我写这篇东西的核心目的,就是希望你在配置的时候就能预判这些坑,而不是等出了问题再回来翻文档。建议收藏起来,下次新装机器的时候照着走一遍,基本十分钟就能搞定。