跳转至

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

实践任务

  1. 在测试虚拟机上完整执行 Debian 12 → 13 升级,记录每步骤的输出和耗时
  2. 升级完成后检查:内核版本、关键服务状态、systemctl --failed 输出
  3. 编写升级预检脚本:检查当前版本、可用空间、dpkg --audit、是否需要重启,并额外检查是否存在 /etc/sysctl.conf 中的自定义参数和 DSA 类型的 SSH 密钥
  4. 模拟 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 的存量环境应尽快完成迁移。