Ubuntu Server 18.04 (Bionic Beaver) 到 20.04 (Focal Fossa) 的升级,虽然官方支持 do-release-upgrade 工具进行原地升级(In-place Upgrade),但在生产环境或云服务器场景中,强烈不建议直接执行原地升级。
以下是基于运维最佳实践、技术细节和风险控制的专业建议:
一、 核心原则:备份与测试先行
- 快照/镜像备份
- 云服务器用户:在操作前,务必对云盘制作系统盘快照或创建自定义镜像。这是最后的救命稻草。
- 物理机/虚拟机用户:确保有完整的磁盘镜像备份(如使用
dd或 LVM snapshot)。
- 验证备份可用性
- 不要只相信“有备份”,要尝试在一个隔离环境中恢复该备份,确认能正常启动和数据完整。
- 应用层兼容性测试
- 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:全新部署 + 数据迁移(最推荐)
- 在一台新服务器(或新实例)上安装纯净的 Ubuntu 20.04。
- 配置好操作系统、安全策略、监控XX。
- 通过 rsync、数据库导出导入、API 同步等方式迁移数据和配置。
- 切换 DNS 或负载均衡指向新服务器。
- 旧服务器保留观察期,无误后下线。
优点:零风险、干净、无残留配置垃圾、易于回滚。
缺点:工作量稍大,需停机窗口。
⚠️ 方案 B:原地升级(仅限非关键系统或测试环境)
如果必须原地升级,请严格按以下步骤操作:
- 更新当前系统至最新状态
sudo apt update && sudo apt upgrade -y sudo apt dist-upgrade -y sudo reboot - 清理无用包
sudo apt autoremove sudo apt clean - 修改 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 - 执行分发版升级
sudo do-release-upgrade -d # 加 -d 可强制进行开发版升级,有时更稳定注意:过程中会提示是否保留配置文件,建议选择“保留原配置文件”以避免服务中断。
- 重启并验证
sudo reboot - 后续清理
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 测试 |
五、 升级后必查清单
- 服务状态:
systemctl list-units --type=service --state=failed - 磁盘空间:
df -h,确认/boot和/分区无异常占用。 - 日志审查:
journalctl -xe查看是否有启动错误或警告。 - 功能测试:
- 网站能否访问?
- 数据库读写是否正常?
- 定时任务(cron)是否生效?
- SSL 证书是否仍有效且正确加载?
- 安全加固:
- 更新防火墙规则。
- 检查是否有多余的监听端口。
- 确认 fail2ban 或类似防护工具正常运行。
六、 总结
对于生产环境的 Ubuntu Server,“新建实例 + 数据迁移”是远比“原地升级”更安全、更高效的选择。原地升级容易遗留历史包袱、引发难以排查的依赖冲突,且在出现严重问题时回滚成本极高。
若因资源限制必须原地升级,请务必:
- 做好完整备份。
- 在非高峰时段操作。
- 预留充足的时间应对故障排除。
- 优先关注数据库和关键服务的兼容性。
最后提醒:Ubuntu 18.04 已于 2023 年 5 月结束标准支持(ESM 扩展支持至 2028 年),建议尽快规划向 22.04 LTS 或 24.04 LTS 的演进路线,以获得长期安全性和新技术支持。
云技术博客