装好Debian 12(bookworm),第一件事就是把软件源换成国内源,这个动作对国内用户来说基本是必做项。官方源deb.debian.org在国内直连速度随缘,apt update卡上几分钟是常态,真到装桌面环境或者编译工具链时,几百个包排队下载能把人耗到崩溃。我这些年折腾过不少Debian系统,从服务器到开发机都有,换源这件事看着简单,实际遇到的坑一个不少:版本代号写错(bookworm写成了bullseye)、security源路径不对、Debian 12新的deb822格式和旧的sources.list混用、公钥NO_PUBKEY报错、换完源upgrade到一半发现404——每一个都能让你在命令行前抓头发。
这篇文章不是单纯贴个sources.list让你复制,而是把换源前后的完整链路拆开讲清楚:从系统镜像怎么选、源文件放在哪、三个常见国内源怎么配置,到apt update之后怎么验证确实生效、常见报错怎么排查,最后把Docker、npm、pip这些周边生态的国内源配置也一并带上。无论你是刚装好Debian 12的新手,还是准备给一批服务器做源配置的运维,按下面的步骤走,基本不会翻车。
1. 装系统前先花5分钟挑对下载渠道,后面省一堆事
很多人忽略了这一层:换源不只是装完系统后改sources.list,安装系统的过程本身就涉及下载渠道。如果你连系统ISO都是从一个慢到崩溃的渠道拉下来的,那体验已经输了一半。
1.1 官方镜像站慢到怀疑人生?国内镜像站怎么选
Debian官方提供ISO镜像的站点是cdimage.debian.org,这个站在国内直连的速度和deb.debian.org一样感人。所以下载镜像这一步,我都是直接走国内镜像站。目前国内用得比较多、稳定性也经过验证的镜像站有这么几个:
| 镜像站 | Debian镜像路径 | 特点 |
|---|---|---|
| 清华大学TUNA | mirrors.tuna.tsinghua.edu.cn/debian-cd/ | 老牌高校源,同步快,组织可靠 |
| 阿里云 | mirrors.aliyun.com/debian-cd/ | 带宽足,云服务器访问快 |
| 中科大 | mirrors.ustc.edu.cn/debian-cd/ | 高校源里的实力派,可靠性高 |
| 华为云 | mirrors.huaweicloud.com/debian-cd/ | 起步稍晚,但速度和稳定性都不错 |
选择上我的经验是:如果你用的是阿里云、腾讯云这类国内云主机,直接选同一家的镜像站(阿里云ECS甚至可以用内网镜像地址,不影响);普通家庭宽带或个人电脑,清华和中科大是更稳妥的选择。高校源有个隐形优势——它们有教育网的骨干带宽,很多高校学生和教育网用户访问速度极快,对公网用户来说也基本都能跑满带宽。
镜像站的路径里有个细节:绝大多数镜像站都用debian-cd作为ISO镜像目录,不是debian。debian目录是软件仓库(apt源),debian-cd才是ISO文件所在。我在一些新手提问里经常看到有人把ISO下载路径和软件源路径搞混,这两个完全是两回事。
1.2 安装镜像的版本选择:netinst、DVD、Live怎么取舍
镜像站里通常能看到amd64/、arm64/这些架构目录,进去之后还有iso-cd/、iso-dvd/等子目录。Debian官方提供的安装镜像主要有三类:
- netinst(网络安装):只有几百MB,是个引导安装器。安装过程中需要的软件包全部通过网络获取。好处是体积小,坏处是如果安装时网络差,整个过程会非常痛苦。
- DVD镜像:完整的离线条目,DVD-1包含大多数常用软件,DJV-2到DVD-5包含更多可选软件包。适合网络环境差、或者需要批量部署多台机器的场景。
- Live镜像:带完整桌面环境,可以U盘启动直接体验,也带有安装器。适合想先试试Debian 12桌面效果再决定是否安装的用户。
我的建议是:如果你网络条件一般,直接用DVD-1镜像,装完后你已经拥有一个能跑起来的基础系统,软件源再换成国内源,后续装什么都不会太费劲。netinst也不是不行,但安装器配置镜像源的时候需要手动选择中国地区的镜像站点,很多人就是在这个环节忽略了,一路默认官方源装完,结果系统装好了apt却慢如蜗牛。
安装镜像下载完后还有一个容易被忽略的安全习惯:校验SHA256SUMS。镜网站根目录下提供了SHA256SUMS文件和对应的签名文件,下载后用sha256sum命令核对一下,防止镜像文件损坏或被篡改。这个习惯在下载任何Linux发行版时都适用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 换源前必须弄明白的sources.list机制
直接把别人的sources.list复制过来粘贴,能跑通,但一遇到404或者签名报错就抓瞎。原因是你根本不理解源文件里每一段在说什么。磨刀不误砍柴工,先把机制搞清楚。
2.1 源格式的核心概念:版本代号与组件
Debian的每个稳定发布版本都有一个代号,Debian 12的代号就是bookworm。在这个仓库体系里,每个镜像站会维护几个不同的归档区域,apt通过/etc/apt/sources.list里的每一行来定位这些区域。
一条经典的源记录长这样:
code复制deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
拆开来看:
deb:声明这是一个二进制软件包仓库(二进制包,即编译好的可执行文件)。如果要加源码包,会写deb-src。对普通用户来说,没有特殊需求可以不加deb-src,能少下载不少索引数据。http://deb.debian.org/debian:仓库的根地址。bookworm:发行版代号。这一项决定了apt去仓库的dists/bookworm/目录下找索引文件。如果你写的代号和仓库实际存在的目录对不上,就会报404。main contrib non-free non-free-firmware:四个组件(Components)。main是官方自由软件,contrib是依赖非自由软件的自由软件,non-free是非自由软件,non-free-firmware是Debian 12新增的组件,专门存放闭源固件,比如无线网卡、显卡需要的固件包。
Debian 12的软件源体系里,除了主仓库,还有两个重要的仓库需要配置:
bookworm-updates:常规更新仓库,发布相对稳定的更新。bookworm-security:安全更新仓库,专门提供安全补丁。
这三个仓库缺一不可。很多人只写了主仓库,没写security,结果系统漏洞补丁拉不下来,这是比较危险的。
2.2 为什么不能直接照抄旧版Debian 11的源
Debian 11的代号是bullseye。如果你从网上下载一篇2022年写的教程,里面写的可能全是bullseye的源。直接拿过来的话,你的Debian 12系统会去向一个目标目录为bullseye的仓库请求索引,结果就是404。
另一个差异就是non-free-firmware。Debian 11及更早版本的源里没有这个组件,但Debian 12把它列入了默认软件源的一部分。单纯漏掉它,apt不会报错,但你在安装一些需要闭源固件的网卡或显卡驱动时,会找不到对应的固件包,表现就是无线网卡不工作或者显卡驱动装不上。所以标准写法一定要带上non-free-firmware。
还有一类旧教程里常见的错误:把bookworm-security写成bookworm/updates。Debian 11时代确实有人用这个写法,但那是旧的bullseye/updates形式的残留,Debian 12统一用bookworm-security作为Suite名称,写到debian-security仓库目录下。写错了,同样404。
2.3 Debian 12的deb822格式:先看清楚你的源文件在哪
这是Debian 12换源最大的隐藏坑。从Debian 12开始,官方安装器默认生成的源配置不是传统的/etc/apt/sources.list,而是新式的deb822格式文件/etc/apt/sources.list.d/debian.sources。
deb822格式长这样:
code复制Types: deb
URIs: https://deb.debian.org/debian
Suites: bookworm bookworm-updates bookworm-backports
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
它和经典格式的deb行完全不是一种写法。如果你用sed只改了/etc/apt/sources.list,但系统实际使用的是/etc/apt/sources.list.d/debian.sources,那你的修改等于没改,apt update照样走官方源。
所以动手前的第一件事:
code复制ls -l /etc/apt/sources.list /etc/apt/sources.list.d/
看清楚自己的系统用的是经典格式还是deb822格式,再决定后面改哪个文件。如果两种格式的文件都存在,apt会把它们全部加载,这种情况下也很容易出问题——两个源都在,同一个包可能有两个不同版本的候选,导致依赖冲突。保守做法是:决定用哪个文件,另一个就备份后移除。
3. 三个常见国内源的完整配置方法
这一节直接给可抄作业的配置。我以三种最常用的国内源为例:清华TUNA、阿里云、中科大。你选一个用就行,不要混着用。混用多个国内源,一旦不同源的同步时间有差异,apt会检出同一软件包的不同版本,造成依赖解析难题,这是我在实际运维里踩过的坑。
3.1 先确认你的源文件长什么样,并做好备份
按照上一章的方法查看源文件后,先备份。如果是经典格式:
code复制sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
如果是deb822格式:
code复制sudo cp /etc/apt/sources.list.d/debian.sources /etc/apt/sources.list.d/debian.sources.bak
备份是个好习惯,改坏了随时能回滚。我见过太多人改源改到系统apt直接挂掉,连apt install都跑不了,最后只能靠备份文件救回来。
3.2 清华、阿里、中科大三套配置怎么填
清华TUNA源(经典格式),写入/etc/apt/sources.list:
code复制deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
如果你需要backports(获取较新版本软件包),再追加一行:
code复制deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
阿里云源(经典格式):
code复制deb http://mirrors.aliyun.com/debian/ bookworm main contrib non-free non-free-firmware
deb http://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free non-free-firmware
deb http://mirrors.aliyun.com/debian-security bookworm-security main contrib non-free non-free-firmware
中科大源(经典格式):
code复制deb https://mirrors.ustc.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.ustc.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.ustc.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
如果你的源文件是deb822格式,需要修改的是/etc/apt/sources.list.d/debian.sources。以清华为例:
code复制Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/debian
Suites: bookworm bookworm-updates bookworm-backports
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/debian-security
Suites: bookworm-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
这里有个投机取巧的办法:如果你不习惯deb822格式,可以把这个文件备份后直接删除,然后创建经典格式的/etc/apt/sources.list。Debian 12兼容经典格式,只要配置文件存在,apt就会正常读取。这样你后续跟着网上绝大多数的教程操作,踩坑的概率会小很多。
3.3 用sed一行命令完成批量替换的偷懒方案
如果你确定自己的源文件里只有官方源地址,没有其他镜像站地址,可以用sed快速替换:
code复制sudo sed -i 's|deb.debian.org|mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list
sudo sed -i 's|security.debian.org|mirrors.tuna.tsinghua.edu.cn/debian-security|g' /etc/apt/sources.list
如果是deb822格式:
code复制sudo sed -i 's|deb.debian.org|mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list.d/debian.sources
sudo sed -i 's|security.debian.org|mirrors.tuna.tsinghua.edu.cn/debian-security|g' /etc/apt/sources.list.d/debian.sources
这个命令适用于把官方源一键切换成国内源,但不适用于"从别的镜像源切换过来"的场景。如果原来就是阿里的源,再跑一次sed替换,会把阿里云域名也改掉,造成无法解析。所以用sed之前,务必先cat看一眼源文件的实际内容。
替换完成后,执行:
code复制sudo apt update
正常情况下应该看到类似这样的输出:
code复制Hit:1 http://mirrors.tuna.tsinghua.edu.cn/debian bookworm InRelease
Hit:2 http://mirrors.tuna.tsinghua.edu.cn/debian bookworm-updates InRelease
Hit:3 http://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security InRelease
没有Err和404,就说明源基本正常了。此时不要急着apt full-upgrade,先做下一节的验证,确认无误再升级。
4. apt update后的验证套路:怎么确认你用的真的是国内源
很多人换完源就跑个apt update,看到没报错就觉得完事了。但"没报错"和"确实走国内源"是两回事。尤其在你有多个源文件共存的情况下,很可能主源已经换成了国内,但某个附加源还留在官方源,apt update速度照样慢。
4.1 从apt update的输出判断源是否正常
apt update执行时,每一行最前面的状态码非常有信息量:
Get:正在下载新的索引,说明源有更新。Hit:索引没有变化,直接命中缓存,说明源能正常访问。Ign:忽略某个可选文件(比如翻译文件不存在),通常无害。Err:出错。后面会跟具体的错误原因。
看到Err就要停下来查。最常见的是404、Failed to fetch、NO_PUBKEY三类。只要出现任意一个Err,apt update的结果就是不完整的,此时安装软件可能会命中问题。
如果你在输出里看到http://deb.debian.org这个域名,说明至少有一个源文件还在用官方源。回头检查一下sources.list.d/目录里是不是还有残留的.list文件或者.sources文件,别只盯着主文件看。
4.2 用apt policy和apt download实测检验
apt update只能证明源可访问,不能直接证明你安装包时真的从国内源拉取。想验证候选包来自哪个仓库,用apt policy:
code复制apt policy bash
输出里会有一个Candidate行,显示系统会安装哪个版本的bash。在这个输出中,你能看到对应的仓库来源。如果候选版本来自mirrors.tuna.tsinghua.edu.cn/debian,那没毛病。
更直观的验证方法是实际下载一个包试试速度:
code复制time apt download bash
这个命令会把bash的deb包下载到当前目录,并打印耗时。国内源通常几秒钟就完成了。如果你的网络环境是家庭宽带,下载速度对比会很明显。下载完后把当前目录下的bash_*.deb删掉,别污染目录。
4.3 更底层的验证:--print-uris直接看包来源URL
想确切知道apt会从哪个URL下载包,有个冷门但好用的参数:
code复制apt-get download --print-uris bash
它会直接打印出apt将要下载的实际URL,而不执行下载。看到URL里的域名是国内镜像站,就百分百确认了。这个方法在排查"为什么apt下载还是慢"时特别好用,能明确判断是源的问题还是网络链路的问题。
5. 换源后的常见连锁问题排查
换源这件事,90%的人改完配置就一路顺利,但剩下的10%会遇到各种报错。这些报错大多有规律可循,我把最常见的几种情况整理出来。
5.1 NO_PUBKEY和ca-certificates
现象:apt update的时候出现:
code复制W: GPG error: http://mirrors.tuna.tsinghua.edu.cn/debian bookworm InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 605D66D0E9F8B40B
原因:你新使用的源仓库的GPG公钥没有导入到系统。Debian 12用的签名密钥是debian-archive-keyring,如果这个包缺失或版本过旧,就会触发NO_PUBKEY。
解决:先尝试安装/更新密钥包:
code复制sudo apt-get install -y debian-archive-keyring
如果连这个包都装不上(因为源本身就报错),可以去Debian官网手动下载这个包再安装,或者从你能访问的源地址直接下载deb文件安装。
如果是第三方源(比如Docker源、MySQL源)报NO_PUBKEY,那就得单独导入该源的key。新版方法是用gpg把key放到系统的keyrings目录:
code复制sudo gpg --keyserver keyserver.ubuntu.com --recv-keys <KEY_ID>
sudo gpg --export <KEY_ID> | sudo tee /usr/share/keyrings/<your-key>.gpg > /dev/null
然后在对应的源文件里加上Signed-By字段指向这个keyring文件。我建议不要再用apt-key add,Debian 12已经显示apt-key is deprecated,它虽然在短期内还能用,但迟早会被移除。
另外还有一个和https相关的坑:如果你用的是https://开头的国内源,但系统是最小化安装,可能缺少ca-certificates包,导致apt连接时证书校验失败。这时可以先把源临时改成http的,apt update后安装ca-certificates,再改回https。这是个"先有鸡还是先有蛋"的情况,只能这样绕一下。
5.2 404 Release文件找不到
现象:
code复制Err:2 http://mirrors.xxx/debian bookworm-updates InRelease
404 Not Found [IP: x.x.x.x 443]
原因可以分成几类:
- 版本代号写错。最常见的是把
bookworm写成了bullseye或者sid。注意stable、testing这种滚动代号虽然官方源支持,镜像站不一定完整同步,建议写死bookworm。 - Component拼写错误。注意是
non-free-firmware,不是non-free-firm-ware,多一个横杠就会404。 - security仓库路径不对。安全源在镜像站上通常是独立的
/debian-security目录,如果你写成了/debian bookworm-security,就会404。 - 个别镜像站同步滞后。当你用了刚发布的新版本代号时,某些镜像站可能还没建好对应目录。这种情况换一个成熟的镜像站即可。
排查时先curl一下报错的URL,看能不能直接访问。比如:
code复制curl -I http://mirrors.xxx/debian/dists/bookworm/Release
如果返回404,说明路径确实不对,对照镜像站首页帮助文档重新写。
5.3 sources.list.d下的第三方源在拖后腿
/etc/apt/sources.list.d/目录下往往有一堆第三方源,比如Docker、VS Code、Kubernetes等软件自己添加的。这些源在apt update时会一起被加载,如果它们中间的某一个不可用,就会让整个apt update报错。
排查方法:仔细看apt update输出里Err的那一行域名或路径,找到对应的源文件,再用mv把它临时移出去:
code复制sudo mv /etc/apt/sources.list.d/xxx.list /etc/apt/sources.list.d/xxx.list.bak
再跑一次apt update。如果错误消失,说明问题就在那个文件上。这种场景很常见,比如某些第三方源已经停止维护、或者
