Debian一键更新软件源脚本

debian一键更新源文件

什么是软件源

软件源(Repository)是 Linux 系统下载和安装软件的服务器地址。Debian 系统默认的软件源位于国外,国内服务器访问速度慢、容易超时,因此需要更换为国内镜像源来加速 apt 安装和更新。

Debian 把软件源写在 /etc/apt/sources.list 以及 /etc/apt/sources.list.d/ 目录下的 .list 或 .sources 文件里。一行经典的 deb 记录由四部分组成:类型(deb 表示二进制包,deb-src 表示源码包)、镜像地址、发行版代号(如 bookworm)、以及组件列表(main、contrib、non-free、non-free-firmware)。安全更新单独走 security.debian.org 这一条记录,换源时必须一并替换,否则系统补丁仍然从国外下载。

Apt 的工作流程是:执行 apt update 时从每条源的 Release 文件与 Packages 索引中拉取元数据,缓存到 /var/lib/apt/lists/ 目录,之后 apt install 或 apt upgrade 再根据元数据去下载 deb 包。所以换源之后一定要重新 apt update,否则 apt 用的还是旧源留下的索引,看起来“换了源却没效果”。

sources.list 与 Deb822 新格式

Debian 12(bookworm)仍默认使用单行格式,但 Debian 13(trixie)及以后的安装器默认改用 deb822 格式,文件通常是 /etc/apt/sources.list.d/debian.sources,内容形如:

Types: deb
URIs: https://mirrors.aliyun.com/debian
Suites: trixie trixie-updates trixie-backports
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

行格式与 deb822 格式在功能上等价,apt 都支持。判断当前系统用哪种格式,可以先看一眼文件列表:

cat /etc/os-release
ls -l /etc/apt/sources.list /etc/apt/sources.list.d/

如果你是脚本化换源,务必先判断系统版本代号来确定 Suites/发行版字段,写错代号的直接后果就是 404 Not Found。

为什么国内服务器要换源

默认的 deb.debian.org 与 security.debian.org 都在境外,实测中常见的现象包括:apt update 卡在 “Reading package lists” 几十秒到数分钟;下载速度只有几十 KB/s;出现 “Connection timed out”“Could not resolve”“Connection reset by peer”;以及在批量部署时因为超时导致自动化脚本失败。换成同城或同云厂商的镜像源后,速度通常能提升一个数量级,apt update 从分钟级降到秒级。

另外还有一个容易忽略的点:云主机访问同厂商的内网镜像(例如阿里云 ECS 使用 mirrors.cloud.aliyuncs.com)不消耗公网流量,也不受带宽峰值影响,是大规模扩容场景下最稳的选择。

linuxmirrors.cn 介绍

linuxmirrors.cn 是 Linux 镜像站列表网站,提供 Debian、Ubuntu、CentOS 等主流发行版的一键换源脚本。脚本会自动检测系统版本,备份原源文件,并支持选择阿里云、腾讯云、华为云等国内镜像,全程无需手动编辑 sources.list。

它的价值在于两点:一是把“发行版代号 → 镜像目录结构”的对应关系固化在脚本里,避免手工写错 bookworm、jammy 这类代号;二是换源前会备份原文件,出问题时可以一键还原,比手工编辑安全得多。网站上同时列出了各镜像站的地址、是否支持 IPv6、是否提供内网地址等信息,即便不用脚本,也可以把它当作选源参考。

使用方法

在 Debian/Ubuntu 服务器执行以下命令即可自动完成换源:

bash <(curl -sSL https://linuxmirrors.cn/main.sh)

脚本为交互式界面:先选择发行版与镜像源,再确认是否同时更换安全源、是否使用 https 协议,最后自动写入配置文件并执行 apt update。整个过程不需要记忆任何参数,适合首次部署或临时装机的场景。如果只需要给单一发行版换源,站内也提供对应发行版的独立脚本(如 debian.sh、ubuntu.sh、centos.sh),以及给 Docker 换镜像加速地址的 docker.sh;具体可用的脚本名与参数以官网当前文档为准。

脚本运行前建议确认三点:当前用户有 root 权限(或在命令前加 sudo);服务器能解析并访问外网;系统时间正确,否则 https 校验会失败。

手动换源的完整步骤

在生产环境里,手工换源往往比脚本更可控,因为你能看到每一行改了什么。第一步永远是备份:

cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
cp -a /etc/apt/sources.list.d /etc/apt/sources.list.d.bak
cat /etc/os-release | grep VERSION_CODENAME

第二步,把旧的域名整体替换成镜像站域名,这是最快也最不容易出错的做法:

sed -i 's@deb.debian.org@mirrors.aliyun.com@g' /etc/apt/sources.list
sed -i 's@security.debian.org@mirrors.aliyun.com/debian-security@g' /etc/apt/sources.list
grep -n . /etc/apt/sources.list

第三步,如果原文件里存在无效记录,直接重写一份干净的更放心(把 bookworm 换成自己系统实际的代号):

cat > /etc/apt/sources.list <<'EOF'
deb https://mirrors.aliyun.com/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free non-free-firmware
EOF

第四步,刷新索引并验证:

apt update
apt-cache policy | head -20
apt list --upgradable | head

如何选择合适的镜像源

选择镜像的基本原则有三条:优先同云厂商的内网地址;优先地理距离近、有本地节点的公共镜像;优先带宽与同步频率都有保证的大型镜像站。常用的国内 Debian 镜像地址包括 mirrors.aliyun.com/debian、mirrors.cloud.tencent.com/debian、repo.huaweicloud.com/debian、mirrors.ustc.edu.cn/debian、mirrors.tuna.tsinghua.edu.cn/debian、mirrors.163.com/debian。

不要凭感觉选,测一下更快。用 curl 分别下载同一个索引文件,比较耗时:

for m in mirrors.aliyun.com mirrors.cloud.tencent.com repo.huaweicloud.com mirrors.ustc.edu.cn; do
  echo -n "$m  "
  curl -o /dev/null -s -w '%{time_total}s  %{speed_download} B/s\n' \
    "https://$m/debian/dists/bookworm/Release"
done

同时注意镜像站是否完整镜像了 debian-security。有些站点的 debian 目录同步很快,但安全源路径不同(例如阿里云为 debian-security,其他站点可能直接放在 debian-security 目录下),写错路径同样会 404。

换源后的验证与常用命令

apt update
apt upgrade
apt full-upgrade
apt policy nginx
apt list --installed | wc -l
apt clean
apt autoremove

验证要点:apt update 的尾部应该全部是 “Hit” 或 “Get”,不应该出现 “Ign”“Err”“W:” 开头的警告行;apt policy 输出的站点域名应该是你新配置的镜像;对某个常用包执行 apt policy 可以看到各源的优先级与候选版本,确认没有把 backports 或第三方源写到优先级冲突的位置。

常见报错与处理方法

换源过程中遇到问题,绝大多数可以归入下面几类:

1)GPG 报错 “NO_PUBKEY ... The following signatures couldn't be verified”:缺少公钥。先确认换的是官方镜像而不是第三方混入的源,然后导入缺失的公钥,或重新安装官方 keyring 包。不要使用 --allow-unauthenticated 绕过校验,那等于关掉软件包签名验证。

2)“Release file ... is not valid yet” 或 “has expired”:服务器时间不对。执行 timedatectl status 检查时间同步,用 chrony 或 systemd-timesyncd 校正后重试。

3)“Hash Sum mismatch”:通常是中间有透明代理或 CDN 缓存了旧的索引文件,也可能是镜像站正在同步中。先 apt clean 再 apt update,仍然失败就换一个镜像站。

4)“404 Not Found”:发行版代号写错,或镜像站没有该目录(例如把源码包 deb-src 指向了不提供源码的镜像)。用浏览器或 curl 直接访问改后的 URL 验证一下目录是否存在最快。

5)“Temporary failure resolving” 或 “Could not connect”:DNS 或网络出口问题,与换源本身无关,先用 dig 或 nslookup 检查域名解析,再检查安全组与防火墙策略。

6)apt update 之后依赖关系混乱:多数情况是混用了不同发行版的源(例如 Debian 系统里加了 Ubuntu 的源)。立刻改回去并执行 apt --fix-broken install,必要时用 apt-cache policy 定位是哪个包版本被污染。

企业内网、离线与自建镜像

如果服务器集群规模较大或不允许访问公网,换源的目标就不是公共镜像站,而是内网镜像。常见方案有三种:部署 apt-cacher-ng 或 squid 作为 apt 缓存代理,在 sources.list 里指向内网代理地址;用 apt-mirror 或 reprepro 在内部同步一份完整的 Debian 仓库并对外提供服务;或者在云环境中直接使用厂商的内网 VPC 端点。离线环境下还需要预先下载依赖包,可以在一台同版本同架构的机器上用 apt-get -d install 或 apt download 收集 deb 包,再拷入内网安装。需要历史版本时,snapshot.debian.org 提供了按时间点冻结的官方仓库,适合复现旧环境与回滚测试。

还原与回滚

换源失败或想改回官方源时,按备份恢复即可:

cp -a /etc/apt/sources.list.bak /etc/apt/sources.list
rm -rf /etc/apt/lists/*
apt update

如果之前是用脚本换的源,脚本的交互菜单里也提供还原选项,或者按备份文件名(.bak、.backup)与时间戳手工恢复。恢复后记得清一次 /var/lib/apt/lists/,避免新旧索引混在一起造成 Hash Sum mismatch。

注意事项

1. 换源完成后建议执行 apt update 更新软件索引,再执行 apt upgrade 升级系统软件;2. 脚本会自动备份原源文件,如需还原可恢复备份;3. 选择镜像时可优先使用同云厂商的镜像(如阿里云服务器选阿里云镜像),速度最快;4. 适用于 Debian 9/10/11/12 及 Ubuntu 18.04/20.04/22.04/24.04 等主流版本。

补充三条来自运维实践的经验:不要在业务高峰期做全量 apt upgrade,内核与 libc 的升级需要重启或重启相关服务;生产服务器升级前先在测试机验证,或者至少用 apt list --upgradable 看清楚将要升级哪些包;任何换源与升级操作之前,确认已有可用的快照或备份,这是唯一能让你在十分钟内回退的保障。

相关阅读

同站相关文章:Linux 服务器运维实战:从选型到故障排查全攻略Linux 运维常见故障排查与处理 33 个技巧汇总Linux 网络故障排查:从网卡到路由的完整思路。需要排查换源后的网络连通性问题,可参考 tcpdump 抓包指南:BPF 过滤与排障