第 14/30 天(重访·第二季)
引言
在第一季的第 14 天,我们学会了 apt update && apt upgrade 的基础操作、do-release-upgrade 的大版本升级命令,以及用 unattended-upgrades 自动安装安全补丁。但真实的生产环境里,事情远没有「敲一条命令」那么简单——为什么有些服务器宁可带着已知漏洞运行几个月也不升级?为什么每次 do-release-upgrade 都像一场赌博?内核漏洞到底怎么在不重启的情况下修补?升级升挂了,怎么把系统拉回升级前的状态?
本篇文章是第二季的重访,我们把视角从「学会命令」切换到「构建生产环境的升级管理体系」:把更新分级分类、用 Ubuntu Pro / ESM 应对 EOL 后的安全补丁、把 do-release-upgrade 从「随缘操作」变成「有检查、有备份、有回滚预案的标准化流程」、用 Canonical Livepatch 实现内核热补丁、最后构建一套可回滚的升级方案。如果你已经在用 apt 和 do-release-upgrade,本文会告诉你如何让每次升级「有把握、可回滚、不停机」。
一、更新 ≠ 升级:先给变更分级
生产环境最大的误区是把所有 apt 变更混为一谈。不同变更的风险和操作窗口完全不同,先分级再动手:
| 级别 | 内容 | 示例 | 风险 | 建议频率 |
|---|---|---|---|---|
| P0 安全补丁 | 修复 CVE 的包 | openssl、libc、nginx 安全修复 | 中 | 即时(hours) |
| P1 常规更新 | 同版本内的 bug 修复 | 同 apt 源的常规 upgrade | 低 | 每周 |
| P2 功能升级 | 大版本跳跃 | do-release-upgrade、内核主线 |
高 | 季度/半年度 |
| P3 架构变更 | 影响配置的变更 | 数据库大版本、PHP 主版本 | 极高 | 规划窗口执行 |
# 只看安全更新(不升级功能),列出待处理的安全补丁
sudo apt update
sudo apt list --upgradable | grep -i security
# 模拟升级,先看会发生什么,绝不盲目 upgrade
sudo apt upgrade --simulate
# 输出示例(节选)
# Reading package lists... Done
# Building dependency tree... Done
# The following packages will be upgraded:
# libssl3 openssl ca-certificates curl
# 4 upgraded, 0 newly installed, 0 to remove, 0 not upgraded
铁律:生产服务器上,apt upgrade 和 do-release-upgrade 之前必须先跑 --simulate / --dry-run 看清楚变更清单,并在变更窗口内执行,绝不在业务高峰期「顺手升级」。
二、apt 安全补丁策略:unattended-upgrades 与 Ubuntu Pro
2.1 unattended-upgrades:让安全补丁「自动且克制」
安全补丁应该在漏洞披露后尽快应用,但生产环境又不希望每次升级都人工介入。unattended-upgrades 的定位是:只自动装安全补丁,不自动做功能升级。
# 安装
sudo apt install -y unattended-upgrades apt-listchanges
# 配置:仅启用安全更新来源(默认已配置)
sudo dpkg-reconfigure --priority=low unattended-upgrades
# 查看实际生效的配置
cat /etc/apt/apt.conf.d/50unattended-upgrades | grep -E 'Allowed-Origins|Automatic-Reboot' | head -20
关键配置项(编辑 /etc/apt/apt.conf.d/50unattended-upgrades):
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
// 不要放开 -updates / -proposed,避免功能更新混入自动安装
};
// 自动删除不再需要的依赖
Unattended-Upgrade::Remove-Unused-Dependencies "true";
// 内核安全更新后自动重启(可选,夜间维护窗口可开)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";
验证与日志:
# 手动触发一次(模拟自动流程,输出所有动作)
sudo unattended-upgrades --dry-run --debug
# 日志位置
sudo tail -30 /var/log/unattended-upgrades/unattended-upgrades.log
2.2 Ubuntu Pro 与 ESM:EOL 后的「最后一道防线」
标准版 Ubuntu LTS 只提供 5 年免费安全更新。到第 6 年起,普通用户会收到「系统已结束标准支持」的提示。此时有两条路:
# 查看当前系统支持状态
sudo pro status
# 输出示例(节选)
# SERVICE ENTITLED STATUS DESCRIPTION
# esm-infra yes enabled Expanded Security Maintenance for Infrastructure
# livepatch yes enabled Canonical Livepatch service
# ua-infra yes enabled Common Criteria EAL2 provisioning
# 个人使用可免费订阅 Ubuntu Pro(最多 5 台机器)
sudo pro attach <free-token>
# ESM 让安全更新延长到 10 年(24.04 LTS 为 12 年)
# 启用后即可继续 apt upgrade 拿到安全补丁
实践要点:不要等到 EOL 才想办法。在标准支持期的最后一年就开始规划 ESM 订阅或计划迁移到新 LTS;pro status 应纳入季度巡检清单。
三、do-release-upgrade:从「随缘」到「标准化流程」
大版本升级(如 22.04 → 24.04)是风险最高的操作。标准流程应该是「检查 → 备份 → 升级 → 验证 → 回滚预案」五步,而不是直接 do-release-upgrade -d。
3.1 升级前检查(半小时内完成)
# 1. 确认当前版本与升级通道
lsb_release -a
do-release-upgrade -c # 检查是否有可用的新版本
# 2. 确认没有未完成的 dpkg 操作
sudo dpkg --audit
sudo dpkg --configure -a
# 3. 检查磁盘空间(升级需要 5-10GB 可用)
df -h /
# 4. 检查第三方源兼容性(PPA 在升级后常失效)
grep -rh '^deb ' /etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/null
3.2 升级前备份:可回滚的底气
# 方案 A:LVM 快照(若根分区在 LVM 上,秒级完成)
sudo lvcreate -L 20G -s -n root-snap /dev/vg00/root
# 方案 B:etc 配置全量备份
sudo tar czf /root/etc-backup-$(date +%F).tar.gz /etc
# 方案 C:dpkg 包列表快照(用于升级后对比包版本)
dpkg --get-selections > /root/pkg-selections-$(date +%F).txt
3.3 执行升级
# 正式升级(不要加 -d,-d 是开发版通道)
sudo do-release-upgrade
升级过程会多次询问(是否重启服务、是否删除废弃包等),建议在 screen/tmux 会话中执行,避免 SSH 断开导致升级中断:
tmux new -s upgrade
sudo do-release-upgrade
# 中途断开可重新附着:tmux attach -t upgrade
3.4 升级后验证
# 版本确认
lsb_release -a
# 包一致性检查(对比升级前的清单)
diff <(dpkg --get-selections | sort) /root/pkg-selections-$(date +%F).txt | head -20
# 核心服务健康检查
systemctl --failed --no-pager
sudo apt-get check
四、内核 Livepatch:安全补丁「不重启」的黑科技
内核 CVE(尤其本地提权类)需要重启才能生效,但生产服务器重启窗口难求。Canonical Livepatch(基于 Kernel Live Patching)可以把内核补丁热加载进运行中的内核,零重启修复高危漏洞。
# 启用(Ubuntu Pro 免费订阅即可)
sudo pro enable livepatch
sudo canonical-livepatch status
# 输出示例
# last check: 5 minutes ago
# kernel: 6.8.0-51-generic
# livepatch: 6.8.0-51-generic.27
# state: ✓ active
# version: 117.1
# 查看当前已应用的热补丁
sudo canonical-livepatch status --verbose | grep -E 'state|version'
# 手动触发一次检查
sudo canonical-livepatch refresh
要点:Livepatch 只覆盖「已发布的内核安全修复」——日常 kernel 升级仍可通过 apt upgrade 安装,在下一个自然重启时生效;Livepatch 保证的是「在无法重启的窗口期,安全洞不是敞开的」。
五、升级回滚方案:让「升挂了」可逆
没有任何升级是 100% 安全的,所以回滚能力必须前置。按从轻到重排序:
5.1 回滚单个包(轻度异常)
# 查询包的历史版本(snapshots 源)
apt-cache madison nginx
# 降级到指定版本
sudo apt install nginx=1.18.0-0ubuntu1.4 --allow-downgrades
# 或者更保险:从 Ubuntu 官方快照仓库取历史版本
# https://snapshot.ubuntu.com/ubuntu/
5.2 LVM 快照回滚(重度异常,内核级回到过去)
# 若升级前做了 LVM 快照,升级后出问题可直接回滚
# 方法:挂载快照 → 替换根 → 重启
sudo umount /dev/vg00/root-snap 2>/dev/null || true
sudo mkdir /mnt/rollback
sudo mount /dev/vg00/root-snap /mnt/rollback
# 之后 rsync 回根分区并重启(细节依赖具体引导方式,务必在升级前写好回滚手册)
5.3 兜底:Live Server 重装 + 配置恢复
真到不可恢复的地步,配合 day-13 的备份体系(restic + etc 备份 + pkg-selections),可以「重装同版本系统 + 恢复配置 + 重建服务」在 2 小时内恢复业务。这就是为什么 day-13 的备份体系是 day-14 升级的底气。
# 重装后快速恢复软件清单
sudo apt update
sudo dpkg --set-selections < /root/pkg-selections-*.txt
sudo apt dselect-upgrade
总结与下期预告
生产环境的升级管理不是「敢不敢升级」,而是「变更可控、补丁及时、回滚有路」:先给变更分级(P0 安全补丁即时、P2 功能升级规划窗口),用 unattended-upgrades 让安全补丁自动且克制、用 Ubuntu Pro / ESM 覆盖 EOL 后的补丁缺口,把 do-release-upgrade 变成「检查 → 备份 → 升级 → 验证 → 回滚预案」的标准流程,用 Canonical Livepatch 在内核层做到「不重启修漏洞」,最后用 LVM 快照 + 包版本快照 + 备份体系撑起回滚的底气。记住三个立即可用的要点:升级前必跑 --simulate、升级必在 tmux 里做并先打快照、把回滚手册写进文档而不是临时抱佛脚。
下期预告:第 15 天(重访·第二季)将带来《SSH 远程管理——安全加固进阶》,深入 SSH 密钥认证最佳实践、基于主机的访问控制、MFA 二次认证、SSH CA 与堡垒机方案。敬请期待!
系列目录
| 天数 | 主题 | 状态 |
|---|---|---|
| 第 1 天 | Ubuntu 简介与版本选择 | ✅ |
| 第 2 天 | 手把手安装 Ubuntu | ✅ |
| 第 3 天 | Ubuntu 桌面环境初探 | ✅ |
| 第 4 天 | Ubuntu 终端基础 | ✅ |
| 第 5 天 | 用户与权限管理 | ✅ |
| 第 6 天 | 软件包管理 | ✅ |
| 第 7 天 | 文件与文本操作 | ✅ |
| 第 8 天 | 系统服务管理 | ✅ |
| 第 9 天 | 磁盘与文件系统管理 | ✅ |
| 第 10 天 | 网络配置与管理 | ✅ |
| 第 11 天 | 进程管理与监控 | ✅ |
| 第 12 天 | 计划任务与自动化 | ✅ |
| 第 13 天 | 备份与恢复策略 | ✅ |
| 第 14 天 | 系统更新与升级管理 | ✅ |
| 第 15 天 | SSH 远程管理与安全加固 | ✅ |
| 第 16 天 | Web 服务器搭建 | ✅ |
| 第 17 天 | 数据库服务器部署 | ✅ |
| 第 18 天 | Docker 容器化管理 | ✅ |
| 第 19 天 | 文件共享服务 | ✅ |
| 第 20 天 | 监控与告警系统 | ✅ |
| 第 21 天 | 邮件服务器基础 | ✅ |
| 第 22 天 | 系统安全加固 | ✅ |
| 第 23 天 | 性能调优与内核参数 | ✅ |
| 第 24 天 | 虚拟化技术 | ✅ |
| 第 25 天 | 容器编排入门 | ✅ |
| 第 26 天 | 高可用与负载均衡 | ✅ |
| 第 27 天 | Ubuntu 自动部署 | ✅ |
| 第 28 天 | 故障排查实战 | ✅ |
| 第 29 天 | Ubuntu 社区与文档 | ✅ |
| 第 30 天 | 30 天回顾总结 | ✅ |
| 第 23 天(重访) | 性能调优与内核参数——生产环境基准测试与踩坑实战 | ✅ |
| 第 24 天(重访) | KVM 虚拟化高级实战——生产级配置与性能调优 | ✅ |
| 第 25 天(重访) | 容器编排进阶——Docker Compose 生产实践与 Kubernetes 单节点集群实战 | ✅ |
| 第 26 天(重访) | 高可用与负载均衡生产实战——Keepalived + HAProxy 深度调优与故障排查 | ✅ |
| 第 27 天(重访) | 自动部署生产实践——PXE + Preseed + Cloud-init 深度进阶与企业级流水线 | ✅ |
| 第 28 天(重访) | 故障排查实战——深度内核调试、文件系统救援与生产级排障 | ✅ |
| 第 29 天(重访) | Ubuntu 社区与文档——从使用者到贡献者深度实践 | ✅ |
| 第 30 天(重访) | 30 天系列完结篇——学习路线图与成长行动指南 | ✅ |
| 第 1 天(重访·第二季) | Ubuntu 新篇章——2026 年生态全景与版本选择 | ✅ |
| 第 2 天(重访·第二季) | 手把手安装 Ubuntu——2026 年全新安装体验与自动化部署 | ✅ |
| 第 3 天(重访·第二季) | Ubuntu 桌面环境深度探索——GNOME 46 新特性与个性化定制 | ✅ |
| 第 4 天(重访·第二季) | Ubuntu 终端与 Shell 高级技巧——现代 CLI 工具链 | ✅ |
| 第 5 天(重访·第二季) | 用户与权限管理——从 ACL 到 PAM 企业级权限体系 | ✅ |
| 第 6 天(重访·第二季) | 软件包管理——apt、dpkg、snap、flatpak 深入对比 | ✅ |
| 第 7 天(重访·第二季) | 文件与文本操作——现代化 CLI 工具链 | ✅ |
| 第 8 天(重访·第二季) | 系统服务管理——systemd 深度剖析与企业级服务治理 | ✅ |
| 第 9 天(重访·第二季) | 磁盘与文件系统管理——LVM 与存储进阶 | ✅ |
| 第 10 天(重访·第二季) | 网络配置与管理——netplan 高级网络、策略路由与生产级防火墙 | ✅ |
| 第 11 天(重访·第二季) | 进程管理与监控——性能分析与调优 | ✅ |
| 第 12 天(重访·第二季) | 计划任务与自动化——进阶自动化 | ✅ |
| 第 13 天(重访·第二季) | 备份与恢复策略——企业级备份方案 | ✅ |
| 第 14 天(重访·第二季) | 系统更新与升级管理——生产环境升级策略 | 🟢 今日 |
| 第 15 天(重访·第二季) | SSH 远程管理——安全加固进阶 | ⏳ |
| 第 16 天(重访·第二季) | Web 服务器搭建——高性能 Nginx 调优 | ⏳ |
| 第 17 天(重访·第二季) | 数据库服务器部署——生产级数据库运维 | ⏳ |
| 第 18 天(重访·第二季) | Docker 容器化——生产级容器管理 | ⏳ |
| 第 19 天(重访·第二季) | 文件共享服务——高性能存储方案 | ⏳ |
| 第 20 天(重访·第二季) | 监控与告警系统——可观测性平台 | ⏳ |
| 第 21 天(重访·第二季) | 邮件服务器基础——企业邮件方案 | ⏳ |
| 第 22 天(重访·第二季) | 系统安全加固——深度安全策略 | ⏳ |
| 第 23 天(重访·第二季) | 性能调优与内核参数——生产环境优化 | ⏳ |
| 第 24 天(重访·第二季) | 虚拟化技术——KVM 高级虚拟化 | ⏳ |
| 第 25 天(重访·第二季) | 容器编排入门——Docker Compose 与 K8s | ⏳ |
| 第 26 天(重访·第二季) | 高可用与负载均衡——集群方案 | ⏳ |
| 第 27 天(重访·第二季) | Ubuntu 自动部署——自动化运维 | ⏳ |
| 第 28 天(重访·第二季) | 故障排查实战——深度排障 | ⏳ |
| 第 29 天(重访·第二季) | Ubuntu 社区与文档——开源贡献 | ⏳ |
| 第 30 天(重访·第二季) | 30 天回顾总结——第二季完结篇 | ⏳ |















暂无评论内容