Ubuntu 20.04 LTS生产环境升级实战指南
1. 服务端Ubuntu 20.04 LTS升级全记录上周刚完成公司三台生产环境服务器的Ubuntu 18.04 LTS到20.04 LTS的升级整个过程踩了不少坑也积累了些实战经验。这次升级涉及Nginx、MySQL和Redis等核心服务必须确保业务零中断。下面就把完整操作流程和关键注意事项整理出来给需要做类似升级的同行参考。重要提示LTS版本升级不同于常规apt update操作涉及内核更换、依赖链重构等底层变更必须做好完整预案。我们采用分批次灰度升级策略先在一台非核心业务机器上验证通过后再推广。2. 升级前准备阶段2.1 环境检查清单执行以下命令确认当前系统状态# 查看当前版本 lsb_release -a # 检查磁盘空间建议至少保留10GB空闲 df -h # 验证关键服务状态 systemctl list-units --typeservice --staterunning实测发现几个典型问题/var目录只剩3.2GB空间需清理日志有自定义编译的PHP扩展需记录编译参数第三方仓库添加了Oracle JDK需备份仓库配置2.2 关键数据备份方案采用组合备份策略确保万无一失系统级备份使用tar -zcvf /backup/system_backup_$(date %Y%m%d).tar.gz --exclude/proc --exclude/sys --exclude/backup /数据库备份MySQL执行mysqldump --single-transaction --all-databases /backup/mysql_full.sql配置备份rsync -av /etc/ /backup/etc_snapshot/服务状态快照记录dpkg --get-selections /backup/package_list.txt3. 正式升级流程3.1 前置依赖处理先解决已发现的隐患# 清理旧内核和日志 sudo apt autoremove --purge sudo journalctl --vacuum-size200M # 禁用第三方仓库 sudo mv /etc/apt/sources.list.d/* /tmp/ # 更新现有系统 sudo apt update sudo apt dist-upgrade -o APT::Get::Always-Include-Phased-Updatestrue3.2 执行升级命令通过screen会话启动升级过程screen -S ubuntu_upgrade sudo do-release-upgrade遇到典型交互场景处理当提示/etc/ssh/sshd_config配置冲突时选择D查看差异后保留自定义配置GRUB配置选择安装维护者版本旧内核清理选择保留1个备用内核3.3 升级后验证步骤基础功能检查uname -a # 确认内核版本 systemctl --failed # 检查服务状态 netstat -tulnp # 验证端口监听性能基准测试sysbench cpu run sysbench memory run服务兼容性验证Nginx 1.18 → 1.23 配置语法检查MySQL 5.7 → 8.0 权限系统变更测试PHP 7.2 → 8.0 扩展兼容性验证4. 问题排查与优化4.1 常见故障处理案例1MySQL服务启动失败# 错误日志显示 [ERROR] [MY-010119] [Server] Aborting解决方案sudo mysqld --initialize-insecure sudo chown -R mysql:mysql /var/lib/mysql案例2Nginx的stream模块缺失 需手动重新编译sudo apt install libnginx-mod-stream sudo nginx -t sudo systemctl restart nginx4.2 性能调优建议内核参数优化# 编辑/etc/sysctl.conf vm.swappiness 10 net.core.somaxconn 65535服务专用配置MySQL启用innodb_io_capacity参数Redis关闭透明大页echo never /sys/kernel/mm/transparent_hugepage/enabled5. 升级后维护要点监控策略调整新增内核OOM事件监控项设置MySQL 8.0特有的性能指标告警回滚方案设计准备Live USB启动盘编写自动化回滚脚本实测需18分钟完成回滚长期维护计划每月检查/var/lib/update-notifier/updates-available使用ubuntu-advantage-tools管理ESM更新这次升级最大的教训是一定要在测试环境完整模拟生产环境的服务拓扑。我们因为漏测了某个微服务的gRPC依赖导致升级后出现了协议不兼容的情况。后来通过编译时指定-D_GLIBCXX_USE_CXX11_ABI0才临时解决这个坑值得大家注意。