Ubuntu 20.04 LTS (Focal Fossa) 的扩展支持(ESM)虽然还在,但主流支持已经结束了。对于生产环境来说,直接 do-release-upgrade 到 24.04 LTS (Noble Numbat) 是个高风险操作,尤其是当你跑着数据库、中间件或者自定义编译的软件时。
我经历过几次从 18.04/20.04 到 22.04/24.04 的大版本迁移,踩过不少坑。以下是基于实战经验整理的注意事项,按优先级排序:
1. 核心风险:不要在生产环境直接做在线升级
绝对原则:除非是测试机或无状态应用,否则严禁在运行中的生产服务器执行 sudo do-release-upgrade。
- 为什么? 大版本升级涉及内核更新、glibc 升级、Python 版本变更、系统服务重启等。一旦中间出错(比如磁盘空间不足、依赖冲突),系统可能无法启动,且很难回滚。
- 正确姿势:
- 快照/备份:如果是云服务器(AWS EC2, 阿里云 ECS, 腾讯云 CVM 等),先打镜像快照。
- 新建实例:购买一台全新的 Ubuntu 24.04 实例。
- 数据同步:将旧服务器的数据、配置、代码通过 rsync、数据库 dump + restore、或 CI/CD 流水线部署到新实例。
- 割接:验证新实例正常后,切换 DNS 或负载均衡流量。
这是最稳妥的方案,成本最低(只是多花一点时间配置新机器),风险最小。
2. Python 环境的剧变
如果你用 Python 开发,这是最大的痛点。
- Python 版本:20.04 默认 Python 3.8,24.04 默认 Python 3.12。
- 影响:
pip install的预编译 wheel 包可能不再提供 3.8/3.9/3.10 的支持,你需要重新编译源码包(需要安装build-essential,python3-dev等)。- 一些老旧库(如
pycurl,lxml的某些旧版本)可能需要手动处理依赖。 - 虚拟环境:强烈建议在迁移前检查所有项目的
requirements.txt或Pipfile.lock。很多项目锁定的是低版本 Python 的兼容包。
- 建议:在新 24.04 服务器上,使用
conda或pyenv管理多版本 Python,避免直接依赖系统自带的 python3。
3. 内核与硬件驱动
24.04 使用的是较新的 Linux 内核(6.8.x),而 20.04 通常是 5.4.x 或 5.15.x。
- 闭源驱动:如果你使用了 NVIDIA 显卡驱动(非开源 nouveau),老版本的专有驱动可能不支持新内核。你需要去 NVIDIA 官网下载最新版的
.run文件或 DKMS 包进行安装。 - WiFi/蓝牙:部分老旧网卡芯片的驱动在新内核中可能有变化,需确认兼容性。
- 云厂商特殊注意:
- 阿里云、腾讯云等通常提供定制内核。确保你选择的是官方提供的标准 Ubuntu 24.04 镜像,而不是社区版或修改版,以避免驱动缺失导致无法联网或挂载云盘。
4. 系统服务与 systemd
- systemd 版本升级:从 24.04 开始,systemd 行为有一些细微调整。检查你的自定义 service 文件是否符合最新规范。
- 日志系统:24.04 默认更深度集成
journald。如果你之前依赖syslog或rsyslog做日志收集,需要确认配置是否依然生效,或者是否需要切换到journalctl查询方式。 - 防火墙:
ufw依然存在,但底层 netfilter/nftables 可能有变化。升级后务必检查sudo ufw status verbose,确保规则未被重置。
5. 数据库与中间件
- MySQL/MariaDB:
- MySQL 8.0 是 24.04 的默认仓库版本。如果你的应用强依赖 MySQL 5.7 的特性(如某些 SQL 模式、函数),可能会报错。
- 重要:升级前必须对数据库进行全量备份。
- PostgreSQL:
- 24.04 默认 PG 16。PG 16 弃用了许多旧特性,且 WAL 格式可能变化。如果从 PG 12/14 升级,建议使用
pg_upgrade工具,而不是直接覆盖二进制文件。
- 24.04 默认 PG 16。PG 16 弃用了许多旧特性,且 WAL 格式可能变化。如果从 PG 12/14 升级,建议使用
- Redis:
- Redis 7.x 引入了一些安全默认值(如
rename-command被禁用,改用 ACL)。检查你的客户端连接配置,特别是认证方式和命令别名。
- Redis 7.x 引入了一些安全默认值(如
- Docker/Podman:
- Docker CE 在 24.04 上依然可用,但建议卸载旧版 docker-ce 并安装最新版,以获取对新内核特性的支持(如 cgroup v2 的更好兼容)。
- Cgroup v2:24.04 默认启用 cgroup v2。如果你的容器运行时(如旧版 Docker 或某些 Kubernetes kubelet)不支持 cgroup v2,会导致容器无法启动。确保你的容器镜像和运行时版本足够新。
6. 软件包依赖冲突
- Apt 源清理:
- 升级前,运行
sudo apt update && sudo apt full-upgrade确保 20.04 已是最新状态。 - 检查
/etc/apt/sources.list和/etc/apt/sources.list.d/下是否有第三方 PPA 或自定义源。有些 PPA 可能还没有提供 24.04 的包,会导致升级失败。提前注释掉这些源,或在 24.04 上重新添加对应的新版本源。
- 升级前,运行
- Snap 包:
- 24.04 对 Snap 的支持更紧密。如果你之前禁用了 snapd,升级后可能会被重新启用。检查
/etc/snapd.conf和你的 cron 任务。
- 24.04 对 Snap 的支持更紧密。如果你之前禁用了 snapd,升级后可能会被重新启用。检查
7. 网络与安全策略
- IPv6:24.04 默认可能启用更多 IPv6 功能。如果你的网络环境不支持 IPv6,可能导致某些服务绑定地址失败。检查
/etc/sysctl.conf中的net.ipv6.conf.all.disable_ipv6设置。 - SSH:OpenSSH 升级到 9.6p1。旧的 SSH 协议(v1)已被彻底移除,确保客户端支持 SSHv2。密钥交换算法也可能有默认值变化,老旧设备可能连不上。
8. 云厂商特定注意事项(国内环境)
- 阿里云/腾讯云/华为云:
- 初始化脚本:云厂商的 cloud-init 脚本可能在 24.04 上有不同表现。检查
/var/lib/cloud/scripts/per-boot/下的自定义脚本是否仍能执行。 - 元数据服务:确保 metadata service 访问正常,以便获取实例 IP、标签等信息。
- 监控XX:如果你安装了云监控 Agent(如 CloudMonitor, Tencent Cloud Monitor),升级后可能需要重装或重启 Agent,因为路径或依赖库变了。
- 安全组:虽然安全组是网络层,但升级后主机内的防火墙规则(iptables/nftables)可能被清空或重置,务必在割接前确认入站/出站规则。
- 初始化脚本:云厂商的 cloud-init 脚本可能在 24.04 上有不同表现。检查
9. 迁移 checklist(简化版)
- [ ] 备份:系统快照 + 数据库 dump + 配置文件归档。
- [ ] 评估:列出所有关键软件及其版本,查阅官方文档确认 24.04 兼容性。
- [ ] 测试:在相同配置的测试机上模拟升级或全新部署。
- [ ] 清理:移除不必要的第三方源和 PPA。
- [ ] 执行:优先采用“新机器+数据迁移”方案。
- [ ] 验证:
- 服务是否正常启动?
- 日志有无报错?
- 性能基准测试是否达标?
- 外部依赖(API 调用、数据库连接)是否正常?
- [ ] 割接:灰度发布,观察 24 小时。
总结
Ubuntu 24.04 是一个优秀的 LTS 版本,内核新、性能更好、安全性更强。但“迁移”不是简单的“升级”,而是“重建”。
记住:在 IT 运维中,可预测性比新技术更重要。 如果业务不能停机,就规划好维护窗口;如果能停机,就用最笨但最可靠的方法——新装系统,导数据。别为了省那点时间,把整个生产环境搞挂。
云技术博客