用归档源救活一台 EOL 的 Debian 11
一台还在正常工作的机器,某天突然装不上任何东西了。不是磁盘满、不是网络断,而是 apt 告诉你它想要的每一个文件都不存在。原因很简单:Debian 11 已经过了生命周期,镜像站把它的目录移走了。
先确认是源的问题
症状非常有辨识度:所有仓库地址,包括安全更新,一起返回 404。
apt-get update
# Err:1 http://deb.debian.org/debian bullseye InRelease
# 404 Not Found [IP: 151.101.2.132 80]
# Err:2 http://security.debian.org/debian-security bullseye-security InRelease
# 404 Not Found [IP: 151.101.2.132 80]
# E: The repository ... does not have a Release file.
如果只是某一个源 404,那多半是拼错了发行版代号;全部同时 404,基本可以断定是这个版本已经被移出常规镜像。
为什么会这样
Debian 的发布周期里,一个稳定版在结束常规支持后,会先进入 LTS,再彻底停止维护;此时它的仓库目录会从 deb.debian.org 迁移到 archive.debian.org。老机器上的源列表还是老地址,于是全部指向已经不存在的路径。
关键在于:迁移不等于没了。归档站上历史版本是完整的,包都还在,只是不再有安全更新。
把源指向归档站
改之前先留一份原文件,这是我在这类操作上唯一坚持的习惯——出问题时能一眼看出我动了什么。
cp -a /etc/apt/sources.list /etc/apt/sources.list.bak-$(date +%F)
cat > /etc/apt/sources.list <<'EOF'
deb [check-valid-until=no] http://archive.debian.org/debian bullseye main contrib non-free
deb [check-valid-until=no] http://archive.debian.org/debian-security bullseye-security main contrib non-free
EOF
apt-get update
注意 deb.debian.org 换成了 archive.debian.org,路径 /debian 和 /debian-security 保持不变。
那个必须先加的参数
如果只改地址,更新会停在另一种错误上:
E: Release file for http://archive.debian.org/debian/dists/bullseye/Release
is not valid yet (invalid for another 214d 3h).
或者反过来,提示已经过期。原因是归档站上的 Release 文件保留了当年的签名和时间戳,而 apt 默认会检查有效期。
两种写法都可以关掉这个检查:
# 写法一:写在源列表里,只对该源生效
deb [check-valid-until=no] http://archive.debian.org/debian bullseye main
# 写法二:全局参数,临时用
apt-get -o Acquire::Check-Valid-Until=false update
别用 --allow-unauthenticated。 那会连签名一起跳过,等于把「装的是什么」这件事交给网络。关有效期检查和关签名验证,安全性差了一个量级。
可能还会遇到的签名问题
有些版本切换之后会报 NO_PUBKEY,这是因为归档签名密钥已经不在系统里,或者本地的密钥环太旧。缺哪个补哪个:
# 从归档站取旧密钥环,重装到系统信任目录
apt-get install -y debian-archive-keyring
apt-get update
验证是否恢复:随便装一个肯定存在的包,看它能不能正常下载和配置。
apt-get install -y --reinstall ca-certificates
# 能走完 Reading / Building / Unpacking 就算通了
修好之后要清楚代价
归档源只解决「装得上」,不解决「安全」。这类机器现在收到的补丁停留在停止维护的那一天,之后的漏洞一个都不会有。
- 只把它当作临时手段,用来争取迁移时间
- 不要在这类机器上跑对外服务,尤其不要处理凭据
- 如果必须短期保留,把不需要的网络端口关掉,减少暴露面
正规做法还是重装成受支持的版本。如果业务不能停机,就先起一台新的、把服务搬过去、最后切流量——顺序别反。
顺带一个观察
这台机器上还有另一个隐藏问题:时间同步没开。EOL 的系统往往也缺了后装的组件,而时间不准会让证书校验直接失败,看起来像是「网站坏了」。修完源之后,我顺手确认了 timedatectl 的同步状态,这部分写在另一篇里。