29 - 系统迁移与升级(存量 Debian 12 → Debian 13)
前提条件
- 当前系统为 Debian 12(Bookworm,本教程的历史基线)或更早版本,具有 root 权限
- 所有关键服务数据已完整备份(数据库、Web 文件、
/etc、/home) - 虚拟机环境:VMware Workstation Pro(升级前必须创建快照)
- 网络稳定,apt 源已配置为国内镜像
- 无正在进行的 dpkg / apt 事务(
dpkg --audit输出为空)
全局参数
主机名 linuxdc,IP 192.168.1.100/24,SSH 端口 2222,运维用户 ops
本章定位
本教程(第 1–34 章)已以 Debian 13 Trixie 为基准编写。本章面向仍在运行 Debian 12 或更早版本的存量服务器,介绍如何原地升级至本教程的 Debian 13 基线;若系统已是 Debian 13,可跳过本章。
生产环境升级原则
生产服务器应优先使用蓝绿部署(新版本机器并行运行,验证后切流量),而非就地升级。就地升级仅适合实验环境或在明确维护窗口内操作的小型系统。就地升级前必须完成:快照 / 全量备份 → 升级前全量测试 → 制定回滚计划。
升级路径说明
| 升级路径 | 状态 | 推荐程度 |
|---|---|---|
| Debian 12 (Bookworm) → Debian 13 (Trixie) | 正式 stable,官方支持 | 生产可用 |
| Debian 11 (Bullseye) → Debian 13 (Trixie) | 跨版本升级 | 官方不支持,必须先升级至 12 再升级至 13(Debian 官方明确 Skip-upgrades 不受支持) |
对比历史版本:Trixie 已转正
本教程此前版本曾将 Debian 12 → 13 标注为"仍处于 testing、仅限测试环境"。Debian 13 已于 2025 年 8 月 9 日正式发布为 stable,本节流程已按正式发布版本核实更新,可在生产环境的升级维护窗口中执行。
详细步骤
1. 升级前全面准备
# 1. 创建 VMware 快照(关机状态更安全)
# VM → Snapshot → Take Snapshot → 命名为 "pre-upgrade-YYYYMMDD"
# 2. 备份关键目录
mkdir -p /backup/pre-upgrade
tar -czf /backup/pre-upgrade/etc-$(date +%Y%m%d).tar.gz /etc
rsync -aq /var/www/ /backup/pre-upgrade/www/
mysqldump -u root -p --all-databases --single-transaction \
> /backup/pre-upgrade/all-databases-$(date +%Y%m%d).sql
# 3. 确认当前版本
lsb_release -a
cat /etc/debian_version
# 4. 将当前系统升级到最新 patch
apt update && apt full-upgrade -y && apt autoremove -y
# 5. 检查是否需要重启(内核更新等)
[ -f /var/run/reboot-required ] && echo "需要重启" || echo "无需重启"
# 6. 清理磁盘空间
apt clean
journalctl --vacuum-time=30d
df -h / # 确认根分区有至少 5 GB 可用空间
# 7. 检查 dpkg 健康状态
dpkg --audit # 无输出表示正常
检查点
dpkg --audit 无输出;/var/run/reboot-required 不存在(或已重启);根分区可用空间 ≥ 5 GB;备份文件可正常读取。
Debian 11 已弃用:需先升级至 Debian 12
若当前系统仍是 Debian 11(Bullseye),Debian 官方明确不支持跨两个大版本直接升级("Skip-upgrades are not supported")。必须先按 Debian 12 的升级文档完成 11 → 12,重启验证无误后,再执行本章 12 → 13 的步骤,不可合并跳过。
2. Debian 12 (Bookworm) → Debian 13 (Trixie)
修改 apt 源(推荐完整替换,避免 sed 遗漏):
# 备份原始 sources.list
cp /etc/apt/sources.list /etc/apt/sources.list.bak-$(date +%F)
cp -r /etc/apt/sources.list.d/ /etc/apt/sources.list.d.bak-$(date +%F)/
# 替换主 sources.list
tee /etc/apt/sources.list << 'EOF'
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security trixie-security main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-updates main contrib non-free non-free-firmware
EOF
# 将 sources.list.d 下所有文件中的 bookworm 替换为 trixie
# 注意:第三方源(如 Docker、NodeSource)需手动确认兼容性
for f in /etc/apt/sources.list.d/*.list; do
sed -i.bak 's/bookworm/trixie/g' "$f"
done
第三方源需单独处理
/etc/apt/sources.list.d/ 中的第三方源(Docker、NodeSource、HashiCorp 等)在替换 codename 前,需先确认该第三方软件是否提供 trixie 版本。若不确定,先注释该源,升级完成后再逐一恢复。
执行升级:
# 第一阶段:更新包列表
apt update
# 第二阶段:执行升级(可能需要较长时间,建议在 screen 或 tmux 中运行)
apt full-upgrade -y
# 清理废弃包
apt autoremove -y
apt clean
重启并验证:
reboot
# 重启后验证
cat /etc/debian_version # 应显示 13.x
lsb_release -a
uname -r # 确认新内核(6.12 系列)已加载
systemctl --failed # 确认无服务启动失败
检查点
lsb_release -a 显示 Codename: trixie,systemctl --failed 无条目,关键业务服务(Nginx、MariaDB 等)正常运行。
升级后需重点验证的变更点(Debian 官方发布说明核实数据):
| 组件 | Bookworm (12) 版本 | Trixie (13) 版本 | 注意事项 |
|---|---|---|---|
| Linux 内核 | 6.1 系列 | 6.12 系列 | 驱动兼容性,尤其是 DKMS 模块 |
| Python 3 | 3.11 | 3.13 | 检查 Python 脚本兼容性;pip install 全局安装需加 --break-system-packages |
| PHP | 8.2 | 8.4 | WordPress / Nextcloud 等 PHP 应用需回归测试 |
| PostgreSQL | 15 | 17 | 见第 21 章数据库章节的数据目录迁移步骤 |
| MariaDB | 10.11 | 11.8 | 大版本跨越,建议先在测试环境验证应用兼容性 |
| OpenSSH | 9.2p1 | 10.0p1 | DSA 密钥支持已彻底移除,存量 DSA 密钥需提前更换 |
| OpenSSL | 3.0 | 3.5 | TLS 配置、证书格式一般向后兼容,个别老旧加密套件可能被拒绝 |
/tmp、/var/tmp |
磁盘目录 | 默认 tmpfs + 定期清理 | 见第 1 章说明,大文件临时写入场景需评估 |
/etc/sysctl.conf |
生效 | 不再被读取 | 所有自定义内核参数须已迁移至 /etc/sysctl.d/(见第 11 章) |
Debian 12 已弃用:/etc/sysctl.conf 与旧版 SSH DSA 密钥
升级前建议提前排查两项已知的弃用/移除项:① 确认业务是否仍在依赖 /etc/sysctl.conf(Debian 13 起失效,需迁移至 /etc/sysctl.d/);② 确认 SSH 服务与自动化脚本中是否还有基于 ssh-keygen -t dsa 生成的密钥(Debian 13 的 OpenSSH 已彻底移除 DSA 支持),若有需提前更换为 ed25519 或 rsa。
3. 回滚与故障恢复
场景一:升级过程中断(网络中断、超时等)
# 尝试恢复 dpkg 中断的事务
dpkg --configure -a
apt install -f
apt full-upgrade -y
场景二:升级后服务无法启动
# 检查失败服务的详细日志
systemctl status <服务名>
journalctl -u <服务名> -xe --no-pager
# 检查 AppArmor 是否阻断
journalctl | grep "apparmor.*DENIED" | tail -20
场景三:系统完全不可用,从快照恢复
通过 VMware 控制台 → Snapshot Manager → 选择升级前快照 → Revert。
场景四:无快照,从 live USB 恢复
# 从 live USB 启动,挂载根分区
mount /dev/sda1 /mnt
chroot /mnt
# 将 sources.list 改回 bookworm
vim /etc/apt/sources.list
apt update
apt full-upgrade -y
4. 升级后清理
# 清除已删除包的残留配置文件
dpkg -l | grep '^rc' | awk '{print $2}' | xargs apt purge -y
# 更新 GRUB
update-grub
# 重新加载 systemd 单元(处理单元文件变更)
systemctl daemon-reload
# 最终全系统状态检查
systemctl --failed
df -h
free -h
实践任务
- 在测试虚拟机上完整执行 Debian 12 → 13 升级,记录每步骤的输出和耗时
- 升级完成后检查:内核版本、关键服务状态、
systemctl --failed输出 - 编写升级预检脚本:检查当前版本、可用空间、
dpkg --audit、是否需要重启,并额外检查是否存在/etc/sysctl.conf中的自定义参数和 DSA 类型的 SSH 密钥 - 模拟 sources.list.d 中有第三方源的情况,实践手动处理第三方源兼容性的流程
自测问题
1. 为什么升级 Debian 时只需一次 apt full-upgrade 而不是两次?
现代 APT 版本能在单次 apt full-upgrade 中正确解析所有依赖关系和包替换逻辑。唯一仍需注意的是:若第一次 full-upgrade 后有新包被安装并带来额外依赖,再次运行 apt full-upgrade 确保所有依赖均已满足——但这只是确保性操作,而非必须。重要的是升级前先做 apt full-upgrade 确保当前系统处于最新 patch 状态。
2. 从 Debian 11 能否直接升级到 Debian 13?
不能。Debian 官方明确不支持跨两个大版本的"跳级升级"(Skip-upgrades),必须先完成 11 → 12 的升级并重启验证,再执行本章 12 → 13 的步骤。直接修改 sources.list 跳过 12 尝试一步到位极可能导致依赖解析失败或系统不可用。
3. /etc/apt/sources.list 中 non-free-firmware 的作用是什么?
Debian 12 (Bookworm) 起将部分非自由固件(网卡、无线网卡、GPU 驱动等的闭源固件 blob)从 non-free 单独拆分为 non-free-firmware 组件,Debian 13 延续这一设计。若不包含此组件,某些硬件(尤其是 Wi-Fi 网卡、Intel 网卡)可能在安装或升级后无法正常工作。在服务器环境(VMware 虚拟机)中通常不受影响,但物理服务器上的网卡固件可能需要此组件。
4. 升级到 Debian 13 后,为什么原本写在 /etc/sysctl.conf 里的内核参数全部失效?
Debian 13 的 systemd-sysctl 不再读取 /etc/sysctl.conf 这一传统全局配置文件(Debian 12 及更早版本仍会加载它,只是官方一直建议改用 /etc/sysctl.d/)。升级前必须将其中的自定义参数迁移到 /etc/sysctl.d/ 下的独立文件(如 99-production.conf),否则升级后这些参数会在系统层面"消失"而不产生任何报错提示,容易被忽视。
5. 如果升级过程中出现依赖冲突,最快速的排查方式是什么?
# 1. 查看具体冲突信息
apt full-upgrade 2>&1 | grep -A5 "has broken"
# 2. 尝试自动修复
apt install -f
# 3. 找出冲突包并单独处理
apt-cache show <package> | grep -E "Depends|Conflicts|Replaces"
# 4. 临时跳过问题包(仅当确认安全时)
apt full-upgrade --ignore-hold
# 5. 查看 dpkg 日志了解历史操作
tail -100 /var/log/dpkg.log
总结
Debian 就地升级路径清晰,核心流程是:备份 + 快照 → 替换 sources.list → apt full-upgrade → 重启验证。关键在于升级前的充分准备(备份、快照、空间检查、排查 /etc/sysctl.conf 与 DSA 密钥等已知弃用项)和升级后的系统验证(服务状态、日志审查)。Debian 13 (Trixie) 已于 2025 年 8 月正式发布为 stable,是本教程当前的标准基线;Debian 12 的 Full Support 已于 2026 年 7 月结束(现处于 LTS 阶段,至 2028 年 6 月),仍运行 Debian 12 的存量环境应尽快完成迁移。