1. 项目概述:Ubuntu系统升级的典型痛点
作为Linux系统管理员,Ubuntu LTS版本的跨版本升级是每个运维人员都会遇到的常规操作。从Ubuntu 16.04 LTS(Xenial Xerus)升级到18.04 LTS(Bionic Beaver)看似是一个简单的do-release-upgrade命令,但实际操作中总会遇到各种依赖冲突、源配置错误和软件包问题。我在管理超过200台生产服务器时,曾因忽视升级前的准备工作导致整个集群出现apt锁死的情况,这个教训让我总结出一套完整的升级检查清单。
2. 升级前的关键准备工作
2.1 系统状态检查清单
在按下回车键执行升级命令前,这些检查项能避免80%的升级失败:
# 1. 检查当前系统版本和内核 lsb_release -a uname -r # 2. 确认磁盘空间(至少需要5GB空闲空间) df -h / # 3. 检查已安装的第三方PPA(可能造成依赖冲突) ls /etc/apt/sources.list.d/ # 4. 验证网络代理设置(企业环境常见问题) cat /etc/apt/apt.conf.d/* | grep -i proxy # 5. 检查自动更新服务状态 systemctl status unattended-upgrades重要提示:如果发现系统使用了自定义内核(如linux-image-extra),务必记录下当前内核版本,升级后可能需要手动重新安装对应版本。
2.2 备份策略实施
我采用三级备份方案确保升级可回退:
系统级快照(适用于虚拟化环境):
# VMware环境创建快照 vmware-toolbox-cmd snapshot create "Pre-Upgrade-16.04-to-18.04" # LXC容器备份 lxc-stop -n 容器名 && lxc-snapshot -n 容器名关键配置文件备份:
# 创建备份目录 mkdir ~/ubuntu_upgrade_backup # 备份apt源列表 cp -r /etc/apt/sources.list* ~/ubuntu_upgrade_backup/ # 备份重要配置文件 tar czvf ~/ubuntu_upgrade_backup/etc_backup.tar.gz /etc/ssh/sshd_config /etc/network/interfaces /etc/fstab应用数据备份:
# 数据库备份示例(MySQL) mysqldump -u root -p --all-databases > ~/ubuntu_upgrade_backup/mysql_all.sql # Web应用备份 tar czvf ~/ubuntu_upgrade_backup/var_www.tar.gz /var/www/
3. 升级过程中的典型问题解决方案
3.1 更新源配置问题修复
当执行sudo apt update出现"Failed to fetch"错误时,按以下步骤处理:
# 首先替换为国内镜像源(以阿里云为例) sudo sed -i 's|http://.*archive.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list sudo sed -i 's|http://.*security.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list # 清理旧的软件包列表 sudo rm -rf /var/lib/apt/lists/* sudo apt clean # 重新生成缓存 sudo apt update如果仍然报错,可能是SSL证书问题,尝试:
# 临时使用HTTP协议(仅测试用) sudo sed -i 's|https|http|g' /etc/apt/sources.list sudo apt update # 安装CA证书 sudo apt install --reinstall ca-certificates3.2 依赖冲突的深度处理
遇到"held broken packages"错误时,这个组合命令通常有效:
# 尝试自动修复 sudo apt --fix-broken install sudo apt dist-upgrade # 如果仍失败,显示详细依赖树 apt-cache depends <冲突包名> # 强制降级特定包(示例) sudo apt install <包名>=<版本号>我曾遇到libssl1.0.0与openssl的冲突,解决方案是:
# 记录当前版本 apt-cache policy libssl1.0.0 openssl # 手动指定版本安装 sudo apt install libssl1.0.0=1.0.2g-1ubuntu4.20 openssl=1.0.2g-1ubuntu4.20 # 标记为手动保留 sudo apt-mark hold libssl1.0.0 openssl4. 升级后的必要调优工作
4.1 服务兼容性验证清单
升级完成后,必须检查这些关键服务:
# 网络服务 ip a # 检查网卡命名规则是否变化(可能从eth0变为ens192) systemctl restart networking # SSH服务 sshd -t # 配置文件语法检查 systemctl restart sshd # 数据库服务 mysql_upgrade -u root -p # MySQL特定命令 sudo -u postgres psql -c "SELECT version();" # PostgreSQL检查4.2 性能调优建议
18.04默认使用systemd-resolved处理DNS,在企业环境中可能需调整:
# 禁用systemd-resolved(如使用本地DNS缓存) sudo systemctl disable systemd-resolved sudo systemctl stop systemd-resolved # 恢复传统resolv.conf sudo rm /etc/resolv.conf sudo echo "nameserver 8.8.8.8" > /etc/resolv.conf对于高负载服务器,建议调整内核参数:
# 编辑sysctl配置 sudo nano /etc/sysctl.conf # 添加以下优化参数(根据服务器角色调整) net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 4096 vm.swappiness = 105. 灾难恢复方案
当升级导致系统无法启动时,按此流程恢复:
- 使用Live CD/USB启动
- 挂载原系统分区:
mkdir /mnt/rescue mount /dev/sda1 /mnt/rescue # 根据实际分区调整 mount --bind /dev /mnt/rescue/dev mount --bind /proc /mnt/rescue/proc mount --bind /sys /mnt/rescue/sys - chroot到原系统:
chroot /mnt/rescue /bin/bash - 修复关键包:
apt install --reinstall ubuntu-minimal linux-image-generic - 重建GRUB:
grub-install /dev/sda update-grub
6. 自动化升级脚本示例
对于需要批量升级的环境,我使用如下Ansible playbook:
--- - name: Ubuntu 16.04 to 18.04 Upgrade hosts: all become: yes vars: target_release: "bionic" tasks: - name: Check current release command: lsb_release -cs register: current_release changed_when: false - name: Verify upgrade condition fail: msg: "Target release must be newer than current" when: current_release.stdout == target_release - name: Install update manager core apt: name: update-manager-core state: present - name: Configure release upgrade prompt lineinfile: path: /etc/update-manager/release-upgrades regexp: '^Prompt=' line: 'Prompt=lts' - name: Perform dist-upgrade command: apt dist-upgrade -y args: warn: no - name: Start system upgrade command: do-release-upgrade -f DistUpgradeViewNonInteractive async: 3600 poll: 30注意:自动化升级前必须确保playbook中包含完善的pre-task检查项和post-task验证步骤。