Skip to Content

回滚思路

Ubuntu 的 do-release-upgrade 不支持原生降级。如果升级后出现严重问题,需要依赖事先准备的回滚方案。本文介绍几种实用的回滚策略。

回滚方案对比

方案恢复速度准备复杂度适用场景
Timeshift快(分钟级)低桌面和小型服务器
LVM 快照快(分钟级)中使用 LVM 的系统
Btrfs 快照极快中Btrfs 文件系统
dd 磁盘镜像慢(取决于磁盘大小)低通用方案
备份恢复 + 重装慢高最后手段
云平台快照快低云服务器

Timeshift 快照恢复

Timeshift 是最易用的系统快照工具,支持 RSYNC 和 Btrfs 两种模式。

升级前创建快照

# 安装 Timeshift sudo apt install timeshift -y # 创建快照 sudo timeshift --create --comments "升级前备份" --tags D # 列出快照 sudo timeshift --list

从快照恢复

方法 1:系统仍可启动

# 列出可用快照 sudo timeshift --list # 恢复指定快照 sudo timeshift --restore --snapshot "2026-03-24_10-00-00" # 恢复时会提示确认,选择要恢复的内容 # 恢复完成后重启 sudo reboot

方法 2:系统无法启动

  1. 使用 Ubuntu Live USB 启动
  2. 在 Live 环境中安装并运行 Timeshift:
# 在 Live 环境中 sudo apt update sudo apt install timeshift -y # Timeshift 会自动检测磁盘上的快照 sudo timeshift --list # 恢复快照 sudo timeshift --restore --snapshot "2026-03-24_10-00-00" sudo reboot

Timeshift 注意事项

  • Timeshift 默认不备份 /home 目录(RSYNC 模式),需要单独备份用户数据
  • 快照存储需要足够的磁盘空间
  • RSYNC 模式快照占用空间随时间递增(增量)
  • Btrfs 模式更高效,但需要 Btrfs 文件系统

LVM 快照回滚

如果系统使用 LVM(Ubuntu Server 安装时默认选项),可以利用 LVM 快照实现快速回滚。

升级前创建 LVM 快照

# 查看现有逻辑卷 sudo lvs sudo vgs # 确认卷组有足够的空闲空间 # 为根分区创建快照(需要卷组有空闲空间) sudo lvcreate -L 10G -s -n root-snap /dev/ubuntu-vg/ubuntu-lv # 如果有单独的 /var 分区 sudo lvcreate -L 5G -s -n var-snap /dev/ubuntu-vg/var-lv # 验证快照 sudo lvs

从 LVM 快照回滚

# 方法 1:合并快照(需要卸载或从 Live USB 操作) # 如果可以进入系统 # 标记快照合并(下次激活时生效) sudo lvconvert --merge /dev/ubuntu-vg/root-snap # 重启后合并自动执行 sudo reboot # 方法 2:从 Live USB 操作 # 启动 Live USB sudo apt install lvm2 -y sudo vgchange -ay # 激活卷组 # 执行合并 sudo lvconvert --merge /dev/ubuntu-vg/root-snap sudo reboot

如果没有预留空闲空间

# 查看当前 LVM 使用情况 sudo vgs # 如果 VFree 为 0,可以缩小现有逻辑卷(危险操作,需谨慎) # 先缩小文件系统,再缩小逻辑卷 # 建议从 Live USB 执行 # 检查文件系统 sudo e2fsck -f /dev/ubuntu-vg/ubuntu-lv # 缩小文件系统到 15G sudo resize2fs /dev/ubuntu-vg/ubuntu-lv 15G # 缩小逻辑卷到 16G(留余量) sudo lvreduce -L 16G /dev/ubuntu-vg/ubuntu-lv # 现在有空间创建快照了 sudo lvcreate -L 10G -s -n root-snap /dev/ubuntu-vg/ubuntu-lv

Btrfs 快照回滚

如果使用 Btrfs 文件系统,快照操作几乎是即时的。

创建 Btrfs 快照

# 查看 Btrfs 子卷 sudo btrfs subvolume list / # 创建只读快照 sudo btrfs subvolume snapshot -r / /snapshots/pre-upgrade-$(date +%Y%m%d) # 列出快照 sudo btrfs subvolume list / | grep snapshot

从 Btrfs 快照恢复

# 从 Live USB 启动 # 挂载 Btrfs 分区 sudo mount /dev/sda2 /mnt # 查看子卷 sudo btrfs subvolume list /mnt # 重命名当前根子卷 sudo mv /mnt/@ /mnt/@broken # 从快照创建新的根子卷 sudo btrfs subvolume snapshot /mnt/snapshots/pre-upgrade-20260324 /mnt/@ # 重启 sudo reboot

dd 磁盘镜像恢复

最简单粗暴但通用的方案,适合任何文件系统。

创建磁盘镜像

# 建议从 Live USB 创建,确保分区未挂载 # 完整磁盘镜像 sudo dd if=/dev/sda of=/mnt/external/full-disk.img bs=4M status=progress # 压缩镜像 sudo dd if=/dev/sda bs=4M status=progress | gzip > /mnt/external/full-disk.img.gz # 仅备份特定分区 sudo dd if=/dev/sda2 of=/mnt/external/root-partition.img bs=4M status=progress

从 dd 镜像恢复

# 从 Live USB 启动 # 恢复完整磁盘 sudo dd if=/mnt/external/full-disk.img of=/dev/sda bs=4M status=progress # 恢复压缩镜像 gunzip -c /mnt/external/full-disk.img.gz | sudo dd of=/dev/sda bs=4M status=progress # 恢复单个分区 sudo dd if=/mnt/external/root-partition.img of=/dev/sda2 bs=4M status=progress # 恢复后更新 GRUB sudo mount /dev/sda2 /mnt sudo mount /dev/sda1 /mnt/boot/efi sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo chroot /mnt grub-install /dev/sda update-grub exit sudo reboot

云服务器快照恢复

各云平台操作

# 阿里云 - 使用 CLI 创建快照 aliyun ecs CreateSnapshot --DiskId d-xxx --SnapshotName pre-upgrade # 腾讯云 tccli cbs CreateSnapshot --cli-input-json '{"DiskId":"disk-xxx","SnapshotName":"pre-upgrade"}' # AWS aws ec2 create-snapshot --volume-id vol-xxx --description "pre-upgrade" # 恢复:在各平台控制台中操作"回滚磁盘"或"从快照创建磁盘"

不完全回滚:修复升级问题

有时不需要完全回滚,修复特定问题即可。

修复损坏的包

# 配置未完成的包 sudo dpkg --configure -a # 修复依赖 sudo apt --fix-broken install # 重新安装有问题的包 sudo apt install --reinstall package-name # 强制重新安装 sudo dpkg -i --force-overwrite /var/cache/apt/archives/package-name*.deb

使用旧内核启动

# 在 GRUB 菜单中选择 "Advanced options for Ubuntu" # 选择旧内核版本启动 # 如果 GRUB 菜单不显示(倒计时太短) # 启动时按住 Shift 键(BIOS)或 Esc 键(UEFI) # 进入系统后修复内核问题 sudo apt install --reinstall linux-image-$(uname -r) sudo update-grub

Recovery Mode

# 在 GRUB 中选择 Recovery Mode # 可用选项: # - dpkg 修复损坏的包 # - fsck 检查文件系统 # - network 启用网络 # - root 进入 root shell # 在 root shell 中 mount -o remount,rw / apt --fix-broken install dpkg --configure -a reboot

预防措施总结

升级前的准备直接决定了回滚的可行性:

  1. 必须做:完整数据备份(数据库、配置、用户文件)
  2. 强烈建议:系统快照(Timeshift、LVM、Btrfs)
  3. 云服务器:创建磁盘快照
  4. 虚拟机:创建虚拟机快照
  5. 关键系统:在测试环境先行升级验证

回滚决策流程

升级后发现问题 |-- 问题可修复? | |-- 是 -> 修复特定问题(包修复、配置调整) | +-- 否 -> 继续评估 | |-- 有系统快照? | |-- 是 -> 恢复快照(Timeshift/LVM/Btrfs) | +-- 否 -> 继续评估 | |-- 有磁盘镜像? | |-- 是 -> dd 恢复 | +-- 否 -> 继续评估 | +-- 最后手段 +-- 重新安装系统 + 从备份恢复数据和配置

最重要的是:升级前务必做好备份,不要寄希望于回滚。

Last updated on