Ubuntu 20.04 LTS升级实战:从准备到调优全指南 1. 服务端Ubuntu 20.04 LTS升级全记录作为运维工程师服务器系统的稳定升级是必修课。上周刚完成生产环境从Ubuntu 18.04 LTS到20.04 LTS的升级整个过程踩了不少坑也积累了些实战经验。这次升级涉及8台物理服务器和12台云主机包括MySQL集群、Redis缓存和Nginx前端服务记录下完整操作流程和避坑指南。重要提示LTS版本间升级必须按顺序进行若当前系统是16.04需先升级到18.04才能继续升级到20.04直接跨版本升级会导致严重兼容性问题。1.1 升级前的关键准备在控制台执行do-release-upgrade命令前这些准备工作直接影响升级成功率磁盘空间检查通过df -h确认/分区至少有10GB剩余空间。实测升级过程会下载约2.8GB的包文件解压后需要额外空间。曾遇到/var/cache/apt/archives爆满导致升级中断的情况建议提前执行sudo apt clean sudo journalctl --vacuum-size200M服务状态备份特别提醒要备份这些关键数据MySQL的/var/lib/mysql目录Nginx的/etc/nginx配置自定义Systemd服务文件Crontab任务列表建议用crontab -l cron_backup.txt第三方源处理通过ls /etc/apt/sources.list.d/检查PPA源用ppa-purge工具禁用非必要源。某次升级因Docker CE源冲突导致apt锁死教训深刻。1.2 分阶段升级操作流程阶段一基础环境更新sudo apt update sudo apt full-upgrade -y sudo apt autoremove --purge必须确认无任何报错后再继续遇到过因unattended-upgrades服务锁住apt导致升级卡住的情况可通过sudo lsof /var/lib/dpkg/lock-frontend检查。阶段二正式升级执行sudo do-release-upgrade -d关键交互点处理技巧当提示Configuring openssh-server时选择install the maintainers version避免SSH连接中断出现Restart services提示时建议逐个确认服务重启遇到Remove obsolete packages?选择Yes前先用Details查看具体列表阶段三升级后验证lsb_release -a uname -a dpkg -l | grep -iE mysql|nginx|php systemctl list-units --failed重点检查内核版本是否更新到5.4.0-xx-generic以及关键服务的systemd单元状态。2. 核心组件兼容性处理2.1 MySQL 5.7到8.0的过渡Ubuntu 20.04默认安装MySQL 8.0需要特别注意sudo apt install mysql-server-8.0 sudo mysqldump --all-databases full_backup.sql sudo systemctl stop mysql sudo apt purge mysql-server-5.7升级后常见问题解决认证插件变更执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY new_password;组复制配置需要更新group_replication_group_seeds参数格式2.2 PHP版本切换默认从7.2升级到7.4扩展需要重新编译sudo apt install php7.4-fpm php7.4-mysql php7.4-redis sudo update-alternatives --config php特别注意php.ini中session.save_path的权限变更遇到过502错误就是因为www-data用户无法访问新目录。3. 网络服务适配调整3.1 Netplan新配置20.04使用Netplan 0.99与18.04的语法差异network: version: 2 renderer: networkd ethernets: enp3s0: dhcp4: no addresses: [192.168.1.10/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 1.1.1.1]应用配置时务必执行sudo netplan generate sudo netplan apply sudo systemctl restart systemd-networkd3.2 防火墙规则迁移从iptables迁移到nftables的注意事项sudo iptables-save rules.v4 sudo ip6tables-save rules.v6 sudo apt install nftables sudo iptables-restore-translate -f rules.v4 rules.nft sudo nft -f rules.nft遇到过Docker服务与nftables冲突的情况需要在/etc/docker/daemon.json中添加{ iptables: false }4. 典型故障排除实录4.1 案例一升级后网卡命名变更现象eth0变成enp3s0导致网络中断 解决方法在GRUB_CMDLINE_LINUX中添加net.ifnames0 biosdevname0更新/etc/netplan/*.yaml中的接口名执行sudo update-grub4.2 案例二Nginx无法加载PHP错误日志显示Primary script unknown原因是php-fpm.sock路径从/run/php/php7.2-fpm.sock变为/run/php/php7.4-fpm.sock需要同步修改Nginx配置中的fastcgi_pass参数4.3 案例三定时任务失效排查发现是/etc/crontab格式变化旧版允许省略用户名20.04必须明确指定修正为格式* * * * * username /path/to/command5. 升级后的性能调优5.1 内核参数优化编辑/etc/sysctl.conf添加net.core.rmem_max4194304 net.core.wmem_max4194304 vm.swappiness10 fs.file-max2097152应用配置sudo sysctl -p5.2 服务启动加速使用systemd-analyze定位启动慢的服务systemd-analyze blame systemd-analyze critical-chain针对MySQL等服务的优化方案[Service] TimeoutSec300 LimitNOFILE65535 PrivateTmptrue升级过程中最大的体会是每个生产环境都有其特殊性官方文档无法覆盖所有场景。建议先在测试环境完整演练做好回滚方案比如提前准备Live CD关键服务采用蓝绿部署方式逐步切换。最后提醒升级完成后建议观察48小时再投入正式使用某些兼容性问题可能在特定负载下才会暴露。