Ubuntu系统升级全攻略:从准备到灾备

Ubuntu系统升级全攻略:从准备到灾备

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 备份策略实施

我采用三级备份方案确保升级可回退:

  1. 系统级快照(适用于虚拟化环境):

    # VMware环境创建快照 vmware-toolbox-cmd snapshot create "Pre-Upgrade-16.04-to-18.04" # LXC容器备份 lxc-stop -n 容器名 && lxc-snapshot -n 容器名
  2. 关键配置文件备份

    # 创建备份目录 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
  3. 应用数据备份

    # 数据库备份示例(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-certificates

3.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 openssl

4. 升级后的必要调优工作

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 = 10

5. 灾难恢复方案

当升级导致系统无法启动时,按此流程恢复:

  1. 使用Live CD/USB启动
  2. 挂载原系统分区:
    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
  3. chroot到原系统:
    chroot /mnt/rescue /bin/bash
  4. 修复关键包:
    apt install --reinstall ubuntu-minimal linux-image-generic
  5. 重建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验证步骤。