直接说结论:Ubuntu Server 的 LTS(长期支持版)跨版本升级,如果操作不当,极大概率会导致服务中断、配置丢失甚至系统无法启动。
但如果你遵循正确的流程,风险是可控的。这里的“安全”不是指零风险,而是指风险可预期、可回滚、有备份。
下面我从生产环境实战的角度,拆解核心风险和标准操作流程。
一、 为什么升级会出问题?(核心风险点)
很多人觉得升级就是 apt update && apt upgrade,这在同大版本内没问题。但如果是 20.04 -> 22.04 这种跨大版本升级,本质上是整个操作生态的重置,主要雷区如下:
-
内核与驱动断裂
- Ubuntu 跨版本升级通常会更换新版内核。如果你的业务强依赖特定硬件驱动(如老旧网卡、特殊 USB 设备),新内核可能没有对应模块,导致服务起不来或网络不通。
- 云厂商特例:AWS EC2、阿里云 ECS 等通常使用定制内核。直接通过
do-release-upgrade升级可能会覆盖云厂商提供的优化内核,导致性能下降或监控失效。
-
软件源与依赖地狱
- 旧版本的
.deb包和新版本的二进制文件不兼容。例如,Python 3.8 升级到 3.10,很多第三方库需要重新编译。 - 自定义安装的软件(非 apt 管理,如从源码编译的 Nginx、Redis、MySQL)在升级后路径、配置文件位置、Systemd 服务名都可能发生变化,极易被忽略。
- 旧版本的
-
配置文件的冲突处理
- 升级过程中,系统会询问是否保留旧配置文件还是安装新版本默认配置。选错一个关键服务的配置(如
/etc/nginx/nginx.conf或/etc/mysql/my.cnf),重启后服务就挂了。
- 升级过程中,系统会询问是否保留旧配置文件还是安装新版本默认配置。选错一个关键服务的配置(如
-
LVM/磁盘挂载问题
- 极少数情况下,新内核对 LVM 或文件系统驱动的加载顺序变化,可能导致根分区挂载失败,进入 initramfs 救援模式。
二、 如何安全升级?(标准SOP)
在生产环境中,严禁直接在主节点上执行 do-release-upgrade。请严格遵循以下步骤:
第一步:评估与备份(最重要的一步)
-
确认当前状态
lsb_release -a uname -r # 记录当前内核版本 dpkg -l | grep linux-image # 检查已安装的内核 -
完整备份
- 云盘快照:这是最可靠的回滚手段。在升级前,务必对系统盘和数据盘打快照。
- 配置文件备份:手动复制所有自定义配置文件到
/opt/backup/conf_$(date +%F)。 - 数据库导出:如果有 MySQL/PostgreSQL,建议先 dump 一份数据。
-
应用兼容性测试
- 查看你运行的关键软件(如 Java 版本、PHP 扩展、Nginx 模块)在新版本 Ubuntu 上的官方支持文档。
- 例如:某些老版本的 Docker 插件可能在 22.04 上不再支持。
第二步:预升级检查
# 1. 清理无用包
sudo apt autoremove --purge
# 2. 更新当前版本的所有补丁(确保基础干净)
sudo apt update && sudo apt full-upgrade
# 3. 检查是否有未完成的升级
sudo do-release-upgrade -c
# 这会告诉你当前版本是否可以直接升级到下一个 LTS
# 4. 检查第三方仓库(PPA)
# PPA 往往不支持跨版本,建议临时禁用
sudo nano /etc/apt/sources.list.d/*.list
# 注释掉所有非官方 Ubuntu 源的行
第三步:选择升级策略
策略 A:小步快跑(推荐用于大多数服务器)
不要直接从 16.04 跳到 22.04。必须逐级升级:
16.04 -> 18.04 -> 20.04 -> 22.04
每级之间都要验证服务正常。
策略 B:原地升级(In-place Upgrade)
仅适用于 20.04 -> 22.04 这种相邻 LTS 版本,且经过充分测试。
# 执行升级命令
sudo do-release-upgrade
# 注意:
# 1. 全程保持 SSH 连接稳定,建议使用 tmux 或 screen。
# 2. 遇到配置文件冲突提示时,务必对比差异(diff),不要盲目选 Y 或 N。
# 3. 升级完成后,重启系统:sudo reboot
策略 C:重建实例(最安全,推荐用于核心业务)
对于极其重要的生产服务器,最佳实践是新建一台相同配置的云服务器,部署新系统,迁移数据和配置,切换流量,然后下线旧机器。
- 优点:零风险,无历史包袱,性能最好。
- 缺点:工作量大,需要停机窗口。
第四步:升级后验证
重启后,立即执行以下检查:
- 系统状态
cat /etc/os-release df -h # 检查磁盘挂载是否正常 ip a # 检查 IP 地址是否漂移 - 关键服务状态
systemctl status nginx mysql docker redis journalctl -xe # 查看是否有报错日志 - 业务连通性
- 从外部访问你的 Web 服务、API 接口。
- 检查数据库连接池是否正常。
- 检查定时任务(cron)是否正常运行。
三、 给运维/开发者的特别建议
-
云厂商的坑
- 如果你在 AWS、阿里云、腾讯云等公有云上,优先使用云厂商提供的“镜像替换”或“系统重装”功能,而不是 OS 内部的升级命令。
- 云厂商的内核通常针对虚拟化做了优化,手动升级可能破坏这些优化。
- 很多云厂商提供“一键升级”工具(如阿里云的 EAS),它们会在底层处理好内核和驱动问题,比你自己搞更靠谱。
-
Docker 容器化优势
- 如果你的服务都跑在 Docker 里,操作系统升级的影响会小很多。因为容器内的应用依赖是隔离的。
- 但仍需注意:Docker 守护进程本身、主机上的 iptables/nftables 规则、以及宿主机上的XX层(如 Envoy、Nginx Ingress)可能需要适配新内核。
-
自动化测试
- 在升级前,编写一个简单的脚本,模拟核心业务流程(如调用 API、查询 DB),在升级后立即运行。如果失败,立即回滚快照。
总结
- 能不能升? 能,但要有心理准备。
- 怎么升最安全? 快照 + 逐级升级 + 配置文件比对。
- 什么情况下别升? 核心业务高峰期、没有备份、不懂 Linux 底层机制、使用非标准定制内核。
记住:在 Linux 世界里,备份不是选项,是前提。
云技术博客