跳到主要内容

快照管理

快照管理模块提供虚拟机磁盘与内存状态的快照能力,支持创建、恢复、删除快照,以及批量清理全部快照。系统同时支持内部快照(libvirt 原生)和外部快照(磁盘 overlay),并针对 UEFI NVRAM、VirtFS 共享目录等特殊场景提供了兼容性检查与自动修复机制。

功能概述

核心能力

功能说明
快照创建支持仅磁盘快照和包含内存状态的快照,兼容运行中和关机状态
快照恢复内部快照直接恢复,外部快照通过 blockpull/blockcopy 恢复
快照删除支持单个删除和批量删除,处理复杂的外部快照链与 overlay 合并
快照配额基于角色的快照数量限制,防止资源滥用
NVRAM 兼容自动检测 UEFI pflash NVRAM 格式兼容性,支持自动修复
并发保护通过快照锁防止并发操作冲突

快照类型

内部快照 vs 外部快照

特性内部快照外部快照
存储方式快照数据保存在原磁盘文件中创建新的 overlay 磁盘文件
恢复速度慢(需要合并 overlay)
磁盘空间随修改量增长overlay 文件增长
适用场景关机状态、少量快照运行中、频繁快照
恢复支持virsh snapshot-revert 直接恢复需要特殊处理

快照创建策略

系统根据虚拟机状态和用户选择自动选择快照策略:

VM 状态包含内存快照类型说明
关机-内部快照默认行为,保存磁盘状态
运行中内部快照可选暂停模式,保存内存+磁盘状态
运行中外部快照--disk-only,创建 overlay 磁盘

创建快照

创建流程

内存快照模式

模式说明优点缺点
暂停模式先 suspend → 创建快照 → resume一致性更好业务暂停
非暂停模式由 libvirt/QEMU 自行管理暂停窗口更短行为因版本而异

创建参数

参数类型说明
namestring快照名称(支持英文、数字、下划线、点、短横线)
descriptionstring快照描述
include_memoryboolean是否保存内存状态(仅运行中有效)
auto_fix_nvramboolean是否自动修复 NVRAM 格式
pause_for_memory_snapshotboolean是否暂停 VM 创建内存快照

恢复快照

恢复流程

恢复注意事项

  1. 内部快照:直接使用 virsh snapshot-revert 恢复
  2. 外部快照:需要通过 blockpull/blockcopy 处理
  3. 暂停状态:恢复到暂停时创建的快照后,VM 可能处于 paused 状态,系统会自动 resume

删除快照

删除流程

删除限制

限制说明解决方案
子快照保护有子快照的快照不能直接删除从叶子节点开始删除
磁盘不匹配活动磁盘与快照所在磁盘不一致先合并 overlay 或切回原始磁盘
外部快照链复杂的 overlay 依赖关系使用批量删除功能

批量删除

批量删除功能会从快照树的叶子节点逐步清理:

  1. 获取所有快照列表
  2. 找到叶子节点(无子快照的快照)
  3. 删除叶子节点
  4. 重复步骤 2-3 直到所有快照删除完成
  5. 清理残留的 overlay 文件

NVRAM 兼容性

检测机制

系统会自动检测 UEFI pflash NVRAM 格式是否兼容内部快照:

  • 兼容:直接创建快照
  • 不兼容:提示用户选择是否自动修复

自动修复

修复流程:

  1. 检查 NVRAM 格式
  2. 用户确认修复
  3. 执行 NVRAM 格式转换
  4. 可能需要重启 VM
  5. 重新创建快照

快照配额

配额规则

角色配额限制说明
管理员无限制可创建任意数量快照
普通用户按配置限制防止资源滥用

配额信息

返回的配额信息包括:

{
"scope": "vm",
"used_snapshots": 3,
"max_snapshots": 10,
"remaining_snapshots": 7
}

故障排查

常见问题

问题原因解决方案
"当前虚拟机正在挂载 9p/VirtFS 共享目录"libvirt 禁止在挂载 VirtFS 时创建内存快照先卸载共享目录或创建仅磁盘快照
"快照名称包含不支持的字符"名称格式不合法使用英文、数字、下划线、点、短横线
恢复后 VM 处于暂停状态快照在暂停时创建系统会自动 resume,或手动 virsh resume
"当前快照还有子快照"存在依赖关系从叶子节点开始删除
"当前活动磁盘与内部快照所在磁盘不一致"使用了外部快照 overlay先合并或切回原始磁盘

手动恢复

如果自动恢复失败,可以手动操作:

# 查看快照列表
virsh snapshot-list <vm-name>

# 恢复快照
virsh snapshot-revert <vm-name> <snapshot-name>

# 删除快照
virsh snapshot-delete <vm-name> <snapshot-name>

最佳实践

  1. 命名规范:使用有意义的快照名称,如 before_update_20240101
  2. 定期清理:删除不再需要的快照,释放磁盘空间
  3. 内存快照:仅在需要完整状态保存时使用,内存快照耗时较长
  4. 外部快照:运行中创建仅磁盘快照时使用,注意管理 overlay 文件
  5. NVRAM 修复:UEFI VM 创建内存快照时,建议启用自动修复