努力
加油

Ubuntu 20.04 EOL后,迁移到24.04有哪些需要注意的问题?

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 版本变更、系统服务重启等。一旦中间出错(比如磁盘空间不足、依赖冲突),系统可能无法启动,且很难回滚。
  • 正确姿势:
    1. 快照/备份:如果是云服务器(AWS EC2, 阿里云 ECS, 腾讯云 CVM 等),先打镜像快照。
    2. 新建实例:购买一台全新的 Ubuntu 24.04 实例。
    3. 数据同步:将旧服务器的数据、配置、代码通过 rsync、数据库 dump + restore、或 CI/CD 流水线部署到新实例。
    4. 割接:验证新实例正常后,切换 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 工具,而不是直接覆盖二进制文件。
  • Redis:
    • Redis 7.x 引入了一些安全默认值(如 rename-command 被禁用,改用 ACL)。检查你的客户端连接配置,特别是认证方式和命令别名。
  • 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 任务。

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)可能被清空或重置,务必在割接前确认入站/出站规则。

9. 迁移 checklist(简化版)

  1. [ ] 备份:系统快照 + 数据库 dump + 配置文件归档。
  2. [ ] 评估:列出所有关键软件及其版本,查阅官方文档确认 24.04 兼容性。
  3. [ ] 测试:在相同配置的测试机上模拟升级或全新部署。
  4. [ ] 清理:移除不必要的第三方源和 PPA。
  5. [ ] 执行:优先采用“新机器+数据迁移”方案。
  6. [ ] 验证:
    • 服务是否正常启动?
    • 日志有无报错?
    • 性能基准测试是否达标?
    • 外部依赖(API 调用、数据库连接)是否正常?
  7. [ ] 割接:灰度发布,观察 24 小时。

总结

Ubuntu 24.04 是一个优秀的 LTS 版本,内核新、性能更好、安全性更强。但“迁移”不是简单的“升级”,而是“重建”。

记住:在 IT 运维中,可预测性比新技术更重要。 如果业务不能停机,就规划好维护窗口;如果能停机,就用最笨但最可靠的方法——新装系统,导数据。别为了省那点时间,把整个生产环境搞挂。