Debian系Linux软件源配置详解与常用的国内软件源汇总

4,324 阅读15分钟

在安装Linux之后,我们通常会先配置起国内软件源加速我们的软件包的安装。今天我将常用的Debian系Linux的国内软件源汇总一下。

1,Debian系软件源格式说明

通常Debian系的Linux配置软件源都是修改/etc/apt/sources.list文件,或者是在/etc/apt/sources.list.d中加入一些第三方的软件源文件等等。但是两者文件中格式都是统一的如下:

deb 软件源地址 发行版代号 软件分支1 软件分支2 ...
deb-src 软件源地址 发行版代号 软件分支1 软件分支2 ...

配置项语法很简单,由deb开头的是表示二进制可执行软件的软件源,而deb-src开头的是软件源代码。文件中以#开头的是注释。

通常配置了软件源之后,执行sudo apt update即可更新软件列表索引。

例如Debian的软件源配置某一行如下:

# Debian 11阿里镜像源某片段
deb https://mirrors.aliyun.com/debian bullseye main non-free contrib

image.png

(1) 版本代号/水平划分部分

在上述紧接着配置的地址后的bullseye就表示该系统版本代号,当前系统版本代号可以通过命令lsb_release -a查看,输出结果中的Codename就是当前系统版本代号。

image.png

若提示找不到lsb_release命令,则通过以下命令安装lsb-release包:

sudo apt install lsb-release

知道了当前系统版本代号之后,我们可以先在浏览器打开镜像源地址,打开后通常是目录形式,在里面我们可以找到所有软件包:

image.png

进入其中的dists文件夹,在里面可以看到所有的系统代号(这个目录中存放的是每个系统代号对应的软件列表索引):

image.png

我们这里Debian 11的代号是bullseye,因此我们可以先在这找到bullseye代号及其相关部分

image.png

可见包含该系统代号的主要软件包及其水平划分一共有5个,这些是都要加进镜像源的,这五个包含的软件范畴不一样,有的是主要软件,有的是更新软件等等。这说明一个系统代号下的所有软件包会先被水平划分为几个分类

现在就可以先编辑软件源配置如下:

# 阿里镜像源
deb https://mirrors.aliyun.com/debian bullseye
deb https://mirrors.aliyun.com/debian bullseye-updates
deb https://mirrors.aliyun.com/debian bullseye-proposed-updates
deb https://mirrors.aliyun.com/debian bullseye-backports
deb https://mirrors.aliyun.com/debian bullseye-backports-sloppy
deb-src https://mirrors.aliyun.com/debian bullseye
deb-src https://mirrors.aliyun.com/debian bullseye-updates
deb-src https://mirrors.aliyun.com/debian bullseye-proposed-updates
deb-src https://mirrors.aliyun.com/debian bullseye-backports
deb-src https://mirrors.aliyun.com/debian bullseye-backports-sloppy

好了我们把每个配置项的地址部分代号部分写完了,但是还没有写软件分支部分,我们接下来看。

(2) 软件分支/垂直划分部分

配置中在紧接着系统代号后的几项就都是软件分支部分了!

还是打开镜像源网址,进入pool文件夹(这个文件夹就存放的是所有软件包):

image.png

image.png

可见pool中有三个目录,这三个目录就代表着Debian三个软件的垂直划分,可见Debian的软件包被划分为下列三种:

  • main Debian中符合自由软件规范的软件包
  • contrib 本身属于自由软件但是可能部分依赖非自由软件的软件包
  • non-free 非自由软件

在最新的Debian 12中,增加了non-free-firmware这个垂直划分,表示非自由固件。

好了,我们现在可以将上述的软件源配置的分支部分补齐了如下:

# 阿里镜像源
deb https://mirrors.aliyun.com/debian bullseye main non-free contrib
deb https://mirrors.aliyun.com/debian bullseye-updates main non-free contrib
deb https://mirrors.aliyun.com/debian bullseye-proposed-updates main non-free contrib
deb https://mirrors.aliyun.com/debian bullseye-backports main non-free contrib
deb https://mirrors.aliyun.com/debian bullseye-backports-sloppy main non-free contrib
deb-src https://mirrors.aliyun.com/debian bullseye main non-free contrib
deb-src https://mirrors.aliyun.com/debian bullseye-updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian bullseye-proposed-updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian bullseye-backports main non-free contrib
deb-src https://mirrors.aliyun.com/debian bullseye-backports-sloppy main non-free contrib

OK,到这里就配置完成了!可见知道了软件源配置格式以及软件源地址,我们就可以自己配置软件源了!

有的发行版每个系统代号对应不同的软件包划分,因此除了查看pool目录中的软件包划分之外,还可以直接点进dist目录中的对应的系统代号部分查看:

image.png

进入dist中对应代号的目录,查看其中的目录名即可(文件不管)。

可见Debian发行版的系统代号下的软件包划分是和pool中的是对应的,如果说不对应则以dist中每个代号中的垂直划分为准

Debian除了配置上述主要软件源以外,还有安全更新源,下面会贴出。

其余系统的系统代号部分和软件包划分可能有所不同,例如Ubuntu源中,distspool中如下:

image.png

image.png

可见Ubuntu和Debian不同,软件包划分为四个分支,意义也不一样,具体大家可以自行了解。

对于Deepin就很简单了,其没有水平划分

image.png

可见即使是不同的系统,软件源配置方式及其划分方式都是几乎一样的,总结而来如下:

  • 水平划分:每个Linux系统的某个版本都有其对应的代号,而该代号版本的系统的所有软件包通常会先按照功能水平划分,例如Debian的bullseye代号下所有软件包先被水平划分为了5个类别:bullseyebullseye-updatesbullseye-proposed-updatesbullseye-backportsbullseye-backports-sloppy水平划分部分可以在软件源网址中的dists目录中看到,当然不是每个系统的软件包都会水平划分,例如Deepin 20的软件包就没有进行水平划分,那么就直接在dists中找到其版本代号即可
  • 垂直划分:每个水平划分下的软件包通常又会根据软件包自由程度进行垂直划分,而通常一个系统中的每个水平划分下的垂直划分都是一样的。例如Debian中每个水平划分下都垂直划分为了3类:maincontribnon-free在软件源网址中的pool目录中可以看到垂直划分

2,sources.listsources.list.d

如果大家观察/etc/apt目录会发现,除了我们的sources.list文件之外,还有个sources.list.d目录,这个目录干什么的呢?

事实上,我们的软件源除了配置在sources.list文件中之外,还可以编写为多个单独的文件保存在sources.list.d目录中,当我们执行apt update命令时,系统会同时读取sources.list文件和sources.list.d目录下全部文件中配置的软件源内容,并从中拉取软件列表信息,这种设计提供了更大的灵活性和可管理性,使得管理多个软件源变得更加方便。

比如说我这里的sources.list.d中文件及其内容如下:

image.png

这样当我执行apt update时,除了会从sources.list中配置的官方软件源中拉取软件列表索引之外,还会从这个/etc/apt/sources.list.d/shells:fish:release:3.list文件中定义的软件源里面拉取索引,并使得后面我可以下载这个软件源中的软件。

事实上,很多第三方软件都有自己的仓库,如果大家安装过Chrome或者VSCode就会发现它们也在sources.list.d目录下添加了自己的仓库软件源,使得后续便于更新它们。

总的来说:

  • sources.list文件通常配置官方的软件源仓库
  • sources.list.d目录下通常配置第三方软件的软件源仓库

3,新版deb822格式

在上面第一部分我们就认识了软件源配置的格式,不过从Debian 11开始,官方就推出了一种新的软件源配置格式deb822,这种格式更加简洁、结构化,从Ubuntu 24.04版本开始,官方也推荐使用deb822格式来配置软件源。

我们先来看一个Ubuntu软件源的示例:

# 新版deb822格式
Types: deb deb-src
URIs: https://mirror.tuna.tsinghua.edu.cn/ubuntu
Suites: noble noble-backports noble-proposed noble-security noble-updates
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

这个配置就等效于我们传统格式的如下配置:

# 传统配置格式
deb https://mirror.tuna.tsinghua.edu.cn/ubuntu noble main multiverse restricted universe
deb https://mirror.tuna.tsinghua.edu.cn/ubuntu noble-backports main multiverse restricted universe
deb https://mirror.tuna.tsinghua.edu.cn/ubuntu noble-proposed main multiverse restricted universe
deb https://mirror.tuna.tsinghua.edu.cn/ubuntu noble-security main multiverse restricted universe
deb https://mirror.tuna.tsinghua.edu.cn/ubuntu noble-updates main multiverse restricted universe
deb-src https://mirror.tuna.tsinghua.edu.cn/ubuntu noble main multiverse restricted universe
deb-src https://mirror.tuna.tsinghua.edu.cn/ubuntu noble-backports main multiverse restricted universe
deb-src https://mirror.tuna.tsinghua.edu.cn/ubuntu noble-proposed main multiverse restricted universe
deb-src https://mirror.tuna.tsinghua.edu.cn/ubuntu noble-security main multiverse restricted universe
deb-src https://mirror.tuna.tsinghua.edu.cn/ubuntu noble-updates main multiverse restricted universe

可见新的格式配置极大地简化了传统格式中组合情况,我们来看一下:

  • Types 表示软件源类型deb表示二进制包,deb-src表示源代码
  • URIs 表示软件源地址
  • Suites 表示要加入使用的版本代号/水平划分部分
  • Components 表示要加入使用的软件分支/垂直划分部分
  • Signed-By 表示软件源秘钥文件,通常:
    • Ubuntu系统的软件源配置秘钥为/usr/share/keyrings/ubuntu-archive-keyring.gpg
    • Debian系统的软件源配置秘钥为/usr/share/keyrings/debian-archive-keyring.gpg

大家对比一下事实上就知道了!可见:

  • 在传统的格式中,一行只能配置一个水平划分代号,因此我们平时要使用多个水平划分代号时,就需要再写一行
  • 在新的deb822格式中,我们直接将要使用的水平划分代号全部声明在Suites字段即可

除此之外,使用新版deb822格式还有下列注意事项:

  • 几乎每个字段多个值都是使用空格隔开,对于Types如果我们只需要下载软件二进制包,不需要源码,则只声明一个deb即可
  • 使用deb822格式配置软件源时,必须要将配置文件命名为xxx.sources并放在/etc/apt/sources.list.d目录下才行,也就是说文件扩展名要是sources而不是list,且deb822格式只能放在/etc/apt/sources.list.d目录下,而/etc/apt/sources.list不支持deb822格式,只能使用传统格式
  • 一个sources文件中可以声明多个deb822格式的软件源配置组合

4,软件源更新问题

(1) 无法使用https软件源

如果新安装的Linux,在根据上述操作配置软件源后,执行sudo apt update时报错如下:

image.png

这是由于系统缺少软件包ca-certificates导致。

解决办法是,先编辑软件源配置/etc/apt/sources.list文件,将其中所有的地址前面的https改成http,可以执行下列命令一键替换软件源配置中的httpshttp如下:

# 替换软件源文件中https为http
sudo sed -i 's/https/http/g' /etc/apt/sources.list

再执行下列命令安装证书文件:

sudo apt update
sudo apt install ca-certificates

最后,再把软件源配置文件中的所有的地址前面的http重新改回https,并再次执行sudo apt update即可,可通过下列命令完成一键替换和更新工作:

sudo sed -i 's/http/https/g' /etc/apt/sources.list
sudo apt update

(2) 缺少公钥

有时候我们添加了第三方软件源,执行sudo apt update更新时出现下列错误:

image-20250811140550923

仓库 “xxx” 没有数字签名的错误。

① 软件源数字签名验证机制浅析

在解决这个问题之前,我们还是首先来了解一下apt包管理器的数字签名验证机制。在Debian以及其它Debian系的系统中,会使用GPG密钥用于验证APT软件包来源(通常是第三方仓库)的真实性,确保你下载的软件来自可信的发布者,且未被篡改。

这个过程基于非对称加密(GPG/PGP),总体来说:

  • 发布者使用私钥对仓库元数据或软件包进行签名,私钥由软件源发布者所持有
  • 你的系统使用对应的公钥来验证这个签名是否合法,公钥通常被分发并存放在我们的系统中

很显然,上述错误说明我们系统中缺少了对应的公钥用于验证对应仓库元数据。那么公钥一般存放在哪里呢?通常有下列两个目录下:

  • /etc/apt/trusted.gpg.d 存放全局信任的GPG公钥
  • /etc/apt/keyrings 新版本Debian系统(Debian 9及其以上)才有的,用于存放特定仓库的GPG密钥,不会被默认全局信任,需要在.list.sources文件中显式引用密钥文件

老版本系统使用apt-key add命令将密钥添加到单个密钥文件/etc/apt/trusted.gpg中,也是被全局信任的,不过这种方法现在已经被弃用了。

GPG公钥可以以文本形式(asc文件)存在,也可以以二进制形式(gpg文件)存在。

② 软件源公钥读取机制

上面我们已经了解了有两个存放公钥的目录,因此也可以确定apt更新时读取公钥的方式也有两种:

  • 从全局信任目录/etc/apt/trusted.gpg.d中自动查找
  • 软件源配置时手动指定

比如下列软件源:

deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main

该软件源为Google Chrome官方的软件仓库,为第三方软件源,且其中没有使用signed-by显式配置公钥位置,因此就可以确定加载该软件源的时候,是从/etc/apt/trusted.gpg.d/etc/apt/trusted.gpg中查找是否有该仓库匹配的公钥的。

还有下列软件源:

deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu noble stable

或者deb822格式的:

Types: deb deb-src
URIs: https://qgis.org/ubuntu-ltr
Suites: noble
Architectures: amd64
Components: main
Signed-By: /etc/apt/keyrings/qgis-archive-keyring.gpg

其中都使用了signed-by显式指定了公钥位置,因此就可以判断加载该软件源时,读取的是signed-by指定的公钥文件。

事实上,signed-by可以指定位于任何位置的公钥文件,不仅仅是局限于/etc/apt/keyrings,只不过为了符合规范与统一管理,仍然建议平时将公钥文件都放在/etc/apt/keyrings目录下。

许多软件源在我们添加时,官方文档也都会指导我们下载公钥到/etc/apt/keyrings目录下,然后再配置软件源,因此如果按照正常流程添加一些第三方软件源的话,是不会出现该问题的。此外,在新版本系统中,更加推荐使用/etc/apt/keyrings目录加上显式指定公钥的方式,更加安全。

③ 解决问题

好的,我们来看下上述问题,可以从上述报错截图确定:

  • 是Google Chrome的仓库缺少公钥
  • 缺少的公钥值是0F06FF86BEEAF4E71866EE5232EE5355A6BC6E42

我们首先在/etc/apt/sources.list.d目录下找到对应的软件源文件,查看:

image-20250811143142370

可见没有显式指定公钥位置,那么把公钥从公钥服务器下载下来到/etc/apt/trusted.gpg.d目录下即可。

首先是使用临时目录创建密钥库并接收密钥:

# 使用临时目录,避免影响当前用户的.gnupg
TMP_GPG_DIR=$(mktemp -d)
chmod 700 "$TMP_GPG_DIR"

# 接收密钥到临时密钥环
gpg --homedir "$TMP_GPG_DIR" --keyserver keyserver.ubuntu.com --recv-keys 0F06FF86BEEAF4E71866EE5232EE5355A6BC6E42

然后导出到/etc/apt/trusted.gpg.d目录下即可,可以导出为OpenGPG二进制或者ASCII文本格式,文件名可以自定义,选择其一即可:

# 导出为二进制格式,gpg后缀
gpg --homedir "$TMP_GPG_DIR" --export 0F06FF86BEEAF4E71866EE5232EE5355A6BC6E42 | sudo tee /etc/apt/trusted.gpg.d/google-chrome.gpg > /dev/null

# 导出为ASCII文本格式,asc后缀
gpg --homedir "$TMP_GPG_DIR" --export --armor 0F06FF86BEEAF4E71866EE5232EE5355A6BC6E42 | sudo tee /etc/apt/trusted.gpg.d/google-chrome.asc > /dev/null

最后,执行sudo apt update即可!

对于使用了signed-by手动指定公钥位置的软件源,通常则报错如下:

image-20250811145449775

没有显示缺少的公钥是什么,只提示公钥文件不存在。对于这种情况,我们还是先找到对应软件源配置,将其中的signed-by先删掉:

image-20250811145624724

再次sudo apt update,就能够显示缺失公钥值:

image-20250811145722569

我们同样是根据上述步骤先下载公钥到临时目录,然后到处公钥文件到其指定的位置即可:

# 使用临时目录
TMP_GPG_DIR=$(mktemp -d)
chmod 700 "$TMP_GPG_DIR"

# 接收密钥到临时密钥环
gpg --homedir "$TMP_GPG_DIR" --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8

# 导出到/etc/apt/keyrings/docker.asc
# 导出为二进制也可以
gpg --homedir "$TMP_GPG_DIR" --export --armor 7EA0A9C3F273FCD8 | sudo tee /etc/apt/keyrings/docker.asc > /dev/null

下载完成后,重新编辑其软件源配置文件,signed-by配置加回去即可,指向下载的GPG公钥文件位置。

对于deb822格式也是同理,可以首先注释掉Signed-By那一行配置并更新索引,然后下载公钥,最后取消注释即可。

如果gpg命令下载公钥失败,提示无可用密钥服务器服务器故障,则可以浏览器访问https://keyserver.ubuntu.com/网站,手动搜索并下载公钥,放到对应位置。

(3) 不支持的架构警告

有时候我们可能看到下列警告:

image-20250811151145807

鉴于仓库 'xxx' 不支持 'xxx' 体系结构,跳过配置文件 'xxx' 的获取,该警告是由于我们之前使用dpkg --add-architecture添加了其它架构例如i386,但是对应软件源没有适用于i386的软件包元数据导致。

这个警告不会影响我们使用,不过要想消除也很简单,修改该软件源的配置文件,指定其架构即可,通常是amd64,需根据自己的机器来定。

对于list格式软件源,我们在deb后面的方括号配置中,加入arch=amd64即可(没有方括号就加上):

image-20250811151510041

对于deb822格式的配置,检查Architectures字段是否有多余的架构配置,有多余的则删除,若没有Architectures则加上,并指定为当前支持的架构:

image-20250811151828552

再次sudo apt update,发现警告就消失了。

5,常用Debian系Linux国内镜像源

常见的Debian系发行版及其多个镜像源配置,均可在该在线仓库查看:传送门

6,更新系统

如果你现在使用的是Debian 11的版本,想更新到Debian 12版本,并不需要重装系统,只需要将你的软件源配置文件sources.list中的内容换成Debian 12的软件源配置,再执行更新命令即可!

替换完成内容后,执行下列命令完成系统更新:

sudo apt update
sudo apt full-upgrade
sudo apt autopurge
sudo apt clean

最后重启系统。

最后,这里也推荐一个一键更换镜像源的脚本:传送门

参考: