努力
加油

Ubuntu Server 18.04升级到20.04有哪些注意事项?

Ubuntu Server 18.04 (Bionic Beaver) 到 20.04 (Focal Fossa) 的升级,虽然官方支持 do-release-upgrade 工具进行原地升级(In-place Upgrade),但在生产环境或云服务器场景中,强烈不建议直接执行原地升级。

以下是基于运维最佳实践、技术细节和风险控制的专业建议:

一、 核心原则:备份与测试先行

  1. 快照/镜像备份
    • 云服务器用户:在操作前,务必对云盘制作系统盘快照或创建自定义镜像。这是最后的救命稻草。
    • 物理机/虚拟机用户:确保有完整的磁盘镜像备份(如使用 dd 或 LVM snapshot)。
  2. 验证备份可用性
    • 不要只相信“有备份”,要尝试在一个隔离环境中恢复该备份,确认能正常启动和数据完整。
  3. 应用层兼容性测试
    • Ubuntu 20.04 更换了更多底层组件(见下文)。你的业务代码、依赖库、中间件是否与新的 Python 3.8、PostgreSQL 12、MySQL 8.0 等版本兼容?
    • 建议在测试环境中先模拟升级流程。

二、 关键变更与技术风险点

1. 内核与硬件驱动

  • HWE Kernel:20.04 默认启用 HWE(Hardware Enablement)内核系列,可能比 18.04 的新内核更新。这通常有利于新硬件支持,但可能导致旧专有驱动(如某些 NVIDIA GPU 闭源驱动)失效。
  • 注意:如果使用 DKMS 模块(如 VirtualBox Guest Additions、NVIDIA 驱动),升级后需重新构建模块。

2. 软件包版本大跳变

  • Python:从 3.6 → 3.8。若你使用虚拟环境(venv/virtualenv),需重建;若使用系统级 Python 脚本,需检查语法和库兼容性。
  • PostgreSQL:从 10 → 12。重要:PostgreSQL 不支持跨主版本就地升级。若数据库服务运行中,必须手动导出数据或使用 pg_upgrade 工具在新集群间迁移,不能依赖 apt 自动处理。
  • MySQL/MariaDB:MySQL 从 5.7 → 8.0。同样存在重大不兼容项(如密码认证插件、默认排序规则)。需提前查阅 MySQL 8.0 升级指南。
  • Apache/Nginx:版本更新较小,但配置语法可能有细微变化,需检查配置文件语法。
  • OpenSSH:升级到 8.2+,默认禁用部分弱加密算法。若客户端较老,可能需要临时调整 /etc/ssh/sshd_config 中的 Ciphers 和 MACs。

3. 网络管理变更

  • Netplan:18.04 已引入 Netplan,但 20.04 更彻底地弃用了 ifupdown(除非显式安装并配置)。确保你的网络配置是通过 Netplan YAML 文件管理的,而非传统的 /etc/network/interfaces。
  • Cloud-init:20.04 的 cloud-init 版本更新,可能在首次启动时行为略有不同,尤其在 AWS/Aliyun/Tencent Cloud 等云平台中。

4. 安全与合规

  • AppArmor:策略更严格,某些自定义应用可能被意外拦截。
  • Firewall:UFW 仍是默认防火墙,但需注意 iptables/nftables 后端的变化(20.04 默认使用 nftables 作为 iptables 的后端实现,虽兼容,但调试时需留意)。

三、 推荐升级路径(按优先级排序)

✅ 方案 A:全新部署 + 数据迁移(最推荐)

  1. 在一台新服务器(或新实例)上安装纯净的 Ubuntu 20.04。
  2. 配置好操作系统、安全策略、监控XX。
  3. 通过 rsync、数据库导出导入、API 同步等方式迁移数据和配置。
  4. 切换 DNS 或负载均衡指向新服务器。
  5. 旧服务器保留观察期,无误后下线。

优点:零风险、干净、无残留配置垃圾、易于回滚。
缺点:工作量稍大,需停机窗口。

⚠️ 方案 B:原地升级(仅限非关键系统或测试环境)

如果必须原地升级,请严格按以下步骤操作:

  1. 更新当前系统至最新状态
    sudo apt update && sudo apt upgrade -y
    sudo apt dist-upgrade -y
    sudo reboot
  2. 清理无用包
    sudo apt autoremove
    sudo apt clean
  3. 修改 sources.list
    确保 /etc/apt/sources.list 中的代号从 bionic 改为 focal。可使用 sed 命令批量替换:

    sudo sed -i 's/bionic/focal/g' /etc/apt/sources.list
    sudo sed -i 's/bionic/focal/g' /etc/apt/sources.list.d/*.list
  4. 执行分发版升级
    sudo do-release-upgrade -d  # 加 -d 可强制进行开发版升级,有时更稳定

    注意:过程中会提示是否保留配置文件,建议选择“保留原配置文件”以避免服务中断。

  5. 重启并验证
    sudo reboot
  6. 后续清理
    sudo apt autoremove --purge
    sudo apt autoclean

四、 常见陷阱与解决方案

问题 原因 解决方案
E: Sub-process /usr/bin/dpkg returned an error code 依赖冲突或未完成的包事务 运行 sudo dpkg --configure -a 和 sudo apt install -f 修复
SSH 无法登录 密钥格式或权限变更 检查 /var/log/auth.log;确保 root 登录未被禁止;检查 UFW 规则
Web 服务报错 500 PHP/Python 版本不匹配 重新编译扩展或更换对应版本的解释器
数据库连接失败 认证插件变更(MySQL 8.0) 在 MySQL 中创建新用户或使用 mysql_native_password 插件
网络不通 Netplan 配置错误 检查 /etc/netplan/ 下的 YAML 文件缩进和语法;使用 netplan apply 测试

五、 升级后必查清单

  1. 服务状态:systemctl list-units --type=service --state=failed
  2. 磁盘空间:df -h,确认 /boot 和 / 分区无异常占用。
  3. 日志审查:journalctl -xe 查看是否有启动错误或警告。
  4. 功能测试:
    • 网站能否访问?
    • 数据库读写是否正常?
    • 定时任务(cron)是否生效?
    • SSL 证书是否仍有效且正确加载?
  5. 安全加固:
    • 更新防火墙规则。
    • 检查是否有多余的监听端口。
    • 确认 fail2ban 或类似防护工具正常运行。

六、 总结

对于生产环境的 Ubuntu Server,“新建实例 + 数据迁移”是远比“原地升级”更安全、更高效的选择。原地升级容易遗留历史包袱、引发难以排查的依赖冲突,且在出现严重问题时回滚成本极高。

若因资源限制必须原地升级,请务必:

  1. 做好完整备份。
  2. 在非高峰时段操作。
  3. 预留充足的时间应对故障排除。
  4. 优先关注数据库和关键服务的兼容性。

最后提醒:Ubuntu 18.04 已于 2023 年 5 月结束标准支持(ESM 扩展支持至 2028 年),建议尽快规划向 22.04 LTS 或 24.04 LTS 的演进路线,以获得长期安全性和新技术支持。