KVM 虚拟化技术实战指南 - 第五部分:虚拟机快照管理

文档信息

  • 系列: KVM 虚拟化技术实战指南
  • 部分: 第五部分 - 虚拟机快照管理
  • 版本: V1.0
  • 创建日期: 2026 年 3 月 9 日
  • 对应视频: 10-10 (03:13)
  • 预计阅读时间: 1-2 小时

目录

  1. 快照基础概念
  2. 快照类型详解
  3. 快照创建与管理
  4. 快照链管理
  5. 快照性能优化
  6. 快照故障排查
  7. 快照最佳实践
  8. 实战案例

快照基础概念

什么是虚拟机快照?

定义:
虚拟机快照是 VM 在某个时间点的完整状态记录,包括:

  • 磁盘数据
  • 内存状态 (可选)
  • CPU 状态
  • 设备状态
  • 配置信息

作用:

┌─────────────────────────────────────────────────────────┐
│              快照的主要用途                              │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  1. 备份与恢复                                          │
│     - 系统更新前创建快照                                │
│     - 配置更改前创建快照                                │
│     - 快速恢复到已知状态                                │
│                                                         │
│  2. 开发与测试                                          │
│     - 测试前保存基准状态                                │
│     - 测试失败后快速恢复                                │
│     - 多版本对比测试                                    │
│                                                         │
│  3. 灾难恢复                                            │
│     - 系统故障后恢复                                    │
│     - 数据损坏后恢复                                    │
│     - 误操作后恢复                                      │
│                                                         │
│  4. 培训与演示                                          │
│     - 保存演示环境状态                                  │
│     - 快速重置实验环境                                  │
│                                                         │
└─────────────────────────────────────────────────────────┘

快照工作原理

写时复制 (Copy-on-Write, COW):

创建快照前:
┌─────────────────────────────┐
│      原始磁盘 (qcow2)        │
│  ┌─────────────────────┐   │
│  │  数据块 A, B, C, D    │   │
│  └─────────────────────┘   │
└─────────────────────────────┘

创建快照后:
┌─────────────────────────────┐
│      原始磁盘 (只读)         │
│  ┌─────────────────────┐   │
│  │  数据块 A, B, C, D    │   │ ← 快照点
│  └─────────────────────┘   │
│            ↓               │
│  ┌─────────────────────┐   │
│  │  增量磁盘 (可写)      │   │
│  │  新数据:E, F        │   │
│  └─────────────────────┘   │
└─────────────────────────────┘

读取数据流程:
1. 先读取增量磁盘
2. 如果不存在,读取原始磁盘
3. 合并返回

内存快照原理:

内存状态保存:
┌─────────────────────────────┐
│      VM 运行状态             │
│  ┌─────────────────────┐   │
│  │  CPU 寄存器          │   │
│  │  内存内容 (4GB)      │   │
│  │  设备状态           │   │
│  └─────────────────────┘   │
│         ↓                   │
│  保存到文件:                │
│  vm-name-snapshot.mem       │
│  (内存大小 = 文件大小)       │
└─────────────────────────────┘

快照类型详解

按状态分类

1. 内存快照 (带状态快照)

特点:

  • 保存 VM 运行状态 (内存内容)
  • VM 保持运行
  • 恢复时回到精确时间点
  • 文件较大 (等于内存大小)

使用场景:

✓ 保存应用运行状态
✓ 调试中的程序
✓ 需要精确恢复的场景
✗ 长期保存 (占用空间大)
✗ 频繁创建 (性能影响)

创建命令:

# 创建内存快照
virsh snapshot-create-as vm-name \
  snapshot-001 \
  "内存快照 - 应用运行状态" \
  --live \
  --disk-only

# 查看快照
virsh snapshot-list vm-name

# 输出:
# Name       Creation Time             State
# ------------------------------------------------------------
# snapshot-001 2026-03-09 10:30:00 +0800 running

恢复命令:

# 恢复到内存快照
virsh snapshot-revert vm-name snapshot-001

# VM 将回到创建快照时的精确状态
# 包括内存中的数据和运行的程序
2. 磁盘快照 (无状态快照)

特点:

  • 仅保存磁盘数据
  • VM 可以运行或关闭
  • 不保存内存状态
  • 文件较小

使用场景:

✓ 系统备份
✓ 配置更改前
✓ 软件更新前
✓ 长期保存
✓ 频繁创建

创建命令:

# 创建磁盘快照 (VM 运行)
virsh snapshot-create-as vm-name \
  disk-snapshot-001 \
  "磁盘快照 - 更新前" \
  --disk-only

# 创建磁盘快照 (VM 关闭)
virsh shutdown vm-name
virsh snapshot-create-as vm-name \
  disk-snapshot-002 \
  "磁盘快照 - 关机状态"

按技术分类

1. QCOW2 格式快照

QCOW2 特性:

  • 写时复制 (COW)
  • 支持快照链
  • 压缩存储
  • 加密支持

创建方法:

# 方法 1: 使用 virsh
virsh snapshot-create-as vm-name qcow2-snap-001

# 方法 2: 使用 qemu-img
qemu-img create -f qcow2 \
  -b /var/lib/libvirt/images/vm-name.qcow2 \
  /var/lib/libvirt/images/vm-name-snap1.qcow2

# 查看镜像信息
qemu-img info /var/lib/libvirt/images/vm-name.qcow2

快照链结构:

vm-name.qcow2 (基础镜像,只读)
    ↓
vm-name-snap1.qcow2 (快照 1)
    ↓
vm-name-snap2.qcow2 (快照 2)
    ↓
vm-name-snap3.qcow2 (当前状态)

读取流程:
读取数据 → snap3 → snap2 → snap1 → base
2. LVM 快照

LVM 快照原理:

原始逻辑卷:
/dev/vg0/lv_vm1 (100GB)

创建快照:
lvcreate -L 10G -s -n lv_vm1_snap /dev/vg0/lv_vm1

快照卷:
/dev/vg0/lv_vm1_snap (10GB, 增量)

特点:
- 快照卷大小只需原始卷的一部分
- 实际使用空间取决于数据变化量
- 性能优于 QCOW2

创建 LVM 快照:

# 创建快照
lvcreate -L 20G -s -n vm1_snap \
  /dev/vg0/lv_vm1

# 查看快照
lvs -o +lv_snapshot,origin

# 输出:
# LV          VG   Attr       LSize   Origin
# lv_vm1      vg0  -wi-ao---- 100.00g
# lv_vm1_snap vg0  swi-a-s---  20.00g lv_vm1

恢复 LVM 快照:

# 合并快照 (恢复)
lvconvert --merge /dev/vg0/lv_vm1_snap

# 需要重启 VM
virsh destroy vm-name
# 合并完成后
virsh start vm-name
3. 外部快照 vs 内部快照

内部快照:

特点:
- 快照信息存储在镜像文件内部
- QCOW2 格式支持
- 管理方便
- 快照链在单个文件中

命令:
virsh snapshot-create-as vm-name snap1

外部快照:

特点:
- 创建新的镜像文件
- 基于父镜像
- 可以独立管理
- 支持不同格式

命令:
qemu-img create -f qcow2 \
  -b parent.qcow2 \
  child.qcow2

快照创建与管理

创建快照

方法 1: virsh snapshot-create-as

完整参数示例:

virsh snapshot-create-as vm-name \
  snapshot-20260309-120000 \
  "系统更新前备份" \
  --live \
  --disk-only \
  --atomic \
  --no-metadata

参数说明:

参数说明用途
--liveVM 运行时创建业务不中断
--disk-only仅磁盘快照不保存内存
--atomic原子操作确保一致性
--no-metadata无元数据外部管理
--quiesce冻结文件系统数据库一致性

最佳实践参数组合:

# 生产环境 - 数据库 VM
virsh snapshot-create-as db-vm \
  pre-update-snap \
  "数据库更新前" \
  --live \
  --disk-only \
  --quiesce \
  --atomic

# 开发环境 - Web VM
virsh snapshot-create-as web-vm \
  test-snap \
  "测试前快照" \
  --live \
  --disk-only
方法 2: virsh snapshot-create

使用 XML 配置:

<!-- snapshot.xml -->
<domainsnapshot>
  <description>测试环境快照</description>
  <name>test-snapshot-001</name>
  <creationTime>1678348800</creationTime>
  <state>running</state>
  <memory snapshot='yes' file='/var/lib/libvirt/qemu/snapshot/vm-name/test-snapshot-001.mem'/>
  <disks>
    <disk name='vda' snapshot='yes'/>
  </disks>
</domainsnapshot>
# 从 XML 创建
virsh snapshot-create vm-name snapshot.xml

# 编辑创建
virsh snapshot-edit vm-name
方法 3: 自动化脚本
#!/bin/bash
# create-snapshot.sh

VM_NAME=$1
DESCRIPTION=$2
SNAP_NAME="snap-$(date +%Y%m%d-%H%M%S)"

if [ -z "$VM_NAME" ]; then
  echo "Usage: $0 <vm-name> [description]"
  exit 1
fi

# 检查 VM 是否存在
if ! virsh domstate $VM_NAME &>/dev/null; then
  echo "VM $VM_NAME does not exist"
  exit 1
fi

# 创建快照
echo "Creating snapshot $SNAP_NAME for $VM_NAME..."
virsh snapshot-create-as $VM_NAME \
  $SNAP_NAME \
  "${DESCRIPTION:-Auto snapshot}" \
  --live \
  --disk-only

if [ $? -eq 0 ]; then
  echo "Snapshot created successfully"
  
  # 显示快照信息
  virsh snapshot-info $VM_NAME $SNAP_NAME
else
  echo "Failed to create snapshot"
  exit 1
fi

使用方法:

chmod +x create-snapshot.sh
./create-snapshot.sh web-vm "Web 服务器更新前"

查看快照

查看快照列表
# 列出所有快照
virsh snapshot-list vm-name

# 树形显示快照链
virsh snapshot-list vm-name --tree

# 显示父快照
virsh snapshot-list vm-name --parent

# 显示快照数量
virsh snapshot-list vm-name | wc -l
查看快照详情
# 查看特定快照信息
virsh snapshot-info vm-name snapshot-name

# 输出示例:
# Name:           snapshot-001
# Domain:         vm-name
# Current:        no
# State:          running
# Creation Time:  2026-03-09 10:30:00 +0800
# Description:    系统更新前备份

# 查看快照 XML 配置
virsh snapshot-dumpxml vm-name snapshot-name

# 查看磁盘信息
virsh snapshot-disk vm-name snapshot-name

管理快照

删除快照
# 删除单个快照
virsh snapshot-delete vm-name snapshot-name

# 删除快照并合并磁盘 (释放空间)
virsh snapshot-delete vm-name snapshot-name --children

# 删除所有快照
for snap in $(virsh snapshot-list vm-name --name); do
  virsh snapshot-delete vm-name $snap
done
恢复快照
# 恢复到指定快照
virsh snapshot-revert vm-name snapshot-name

# 恢复并强制 (即使 VM 运行)
virsh snapshot-revert vm-name snapshot-name --running

# 恢复当前快照
virsh snapshot-revert vm-name --current
设置当前快照
# 设置当前快照指针
virsh snapshot-current vm-name snapshot-name

# 查看当前快照
virsh snapshot-current vm-name

快照链管理

理解快照链

快照链结构:

基础镜像 (Base Image)
    ↓
快照 1 (Snapshot 1)
    ↓
快照 2 (Snapshot 2)
    ↓
快照 3 (Current State)

数据流向:
读取:Current → Snap3 → Snap2 → Snap1 → Base
写入:直接写入 Current

查看快照链:

# 树形显示
virsh snapshot-list vm-name --tree

# 输出示例:
# snapshot-001
#    └─ snapshot-002
#       └─ snapshot-003
#          └─ snapshot-004

# 查看镜像 backing 文件
qemu-img info /var/lib/libvirt/images/vm-name.qcow2
qemu-img info /var/lib/libvirt/images/vm-name-snap1.qcow2

快照链操作

合并快照链
# 提交快照到父镜像
virsh blockcommit vm-name vda --active --pivot

# 完整合并流程
# 1. 关闭 VM
virsh shutdown vm-name

# 2. 合并快照
qemu-img commit /var/lib/libvirt/images/vm-name-snap3.qcow2

# 3. 删除快照文件
rm /var/lib/libvirt/images/vm-name-snap3.qcow2

# 4. 更新 VM 配置
virsh edit vm-name
# 修改磁盘路径指向父镜像
合并整个快照链
#!/bin/bash
# merge-snapshot-chain.sh

VM_NAME=$1

echo "Merging snapshot chain for $VM_NAME..."

# 获取快照列表 (从旧到新)
SNAPS=$(virsh snapshot-list $VM_NAME --name | sort)

# 从最新的快照开始合并
for snap in $(echo "$SNAPS" | tac); do
  echo "Committing $snap..."
  
  # 获取快照磁盘文件
  DISK=$(virsh snapshot-disk $VM_NAME $snap | grep vda | awk '{print $2}')
  
  # 提交到父镜像
  qemu-img commit $DISK
  
  # 删除快照文件
  rm -f $DISK
  
  # 删除快照元数据
  virsh snapshot-delete $VM_NAME $snap
done

echo "Snapshot chain merged successfully"

快照链优化

减少快照链深度

问题:

快照链过长导致:
- 读取性能下降 (需要遍历多层)
- 管理复杂度增加
- 故障风险增加

建议:
- 快照链深度不超过 10 层
- 定期合并快照

优化步骤:

# 1. 检查快照链深度
DEPTH=$(virsh snapshot-list vm-name --tree | grep -c "└")
echo "Snapshot chain depth: $DEPTH"

# 2. 如果过深,进行合并
if [ $DEPTH -gt 10 ]; then
  echo "Snapshot chain too deep, merging..."
  
  # 关闭 VM
  virsh shutdown vm-name
  
  # 合并所有快照
  ./merge-snapshot-chain.sh vm-name
  
  # 创建新的基础镜像
  echo "Created new base image"
fi
性能监控
#!/bin/bash
# monitor-snapshot-performance.sh

VM_NAME=$1

# 获取磁盘信息
DISK=$(virsh domblklist $VM_NAME | grep vda | awk '{print $2}')

# 查看镜像信息
echo "=== Disk Information ==="
qemu-img info $DISK

# 查看实际占用空间
echo -e "\n=== Actual Disk Usage ==="
du -h $DISK

# 查看虚拟大小
echo -e "\n=== Virtual Size ==="
qemu-img info $DISK | grep "virtual size"

# 查看快照数量
echo -e "\n=== Snapshot Count ==="
virsh snapshot-list $VM_NAME | wc -l

快照性能优化

存储优化

选择正确的存储格式

QCOW2 vs RAW:

特性QCOW2RAW
快照支持✅ 优秀❌ 需要 LVM
空间效率✅ 精简配置❌ 预分配
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐
压缩✅ 支持❌ 不支持
加密✅ 支持❌ 需要 LUKS

推荐场景:

QCOW2:
✓ 需要频繁快照
✓ 存储空间有限
✓ 开发测试环境

RAW:
✓ 性能要求极高
✓ 生产数据库
✓ 使用 LVM 管理
预分配 vs 精简配置

预分配 (Preallocation):

# 创建预分配镜像
qemu-img create -f qcow2 \
  -o preallocation=full \
  /var/lib/libvirt/images/vm-name.qcow2 \
  100G

# 优点:
# - 性能最佳
# - 无碎片
# - 空间确定

# 缺点:
# - 创建时间长
# - 占用全部空间

精简配置 (Sparse):

# 创建精简镜像 (默认)
qemu-img create -f qcow2 \
  /var/lib/libvirt/images/vm-name.qcow2 \
  100G

# 实际占用:
# - 初始:几 MB
# - 随使用增长
# - 最大 100G

# 优点:
# - 创建快速
# - 节省空间
# - 按需分配

# 缺点:
# - 性能稍差
# - 可能碎片化

I/O 优化

缓存模式优化
# 查看当前缓存模式
virsh domblklist vm-name

# 修改缓存模式
virsh attach-disk vm-name \
  --source /var/lib/libvirt/images/vm-name.qcow2 \
  --target vda \
  --cache none \
  --io native \
  --config

# 缓存模式对比:
# none:     性能最佳,无缓存
# writeback: 写回缓存,性能好
# writethrough: 直写,安全但慢
使用 SSD 存储
# 检测 SSD
cat /sys/block/sda/queue/rotating
# 0 = SSD, 1 = HDD

# 为 SSD 优化
echo "none" > /sys/block/sda/queue/scheduler

# 在 VM 中使用
virsh edit vm-name
# <driver name='qemu' type='qcow2' cache='none' discard='unmap'/>

内存优化

避免内存快照
# 除非必要,否则使用 --disk-only
virsh snapshot-create-as vm-name \
  snap-001 \
  --disk-only \
  --live

# 内存快照占用:
# 4GB 内存 = 4GB 快照文件
# 8GB 内存 = 8GB 快照文件

# 磁盘快照占用:
# 仅增量数据 (通常几 MB 到几 GB)
快照期间暂停 I/O
# 对于数据库 VM,使用 --quiesce
virsh snapshot-create-as vm-name \
  db-snapshot \
  --live \
  --disk-only \
  --quiesce

# QEMU guest agent 需要运行
# 在 VM 中安装:
# CentOS: yum install qemu-guest-agent
# Ubuntu: apt install qemu-guest-agent

快照故障排查

常见问题 1: 快照创建失败

症状:

virsh snapshot-create-as vm-name snap1
# error: internal error: unable to execute QEMU command 'transaction'

排查步骤:

# 1. 检查磁盘格式
qemu-img info /var/lib/libvirt/images/vm-name.qcow2
# 必须是 qcow2 或其他支持快照的格式

# 2. 检查磁盘空间
df -h /var/lib/libvirt/images/
# 确保有足够空间

# 3. 检查权限
ls -la /var/lib/libvirt/images/
# 确保 libvirt-qemu 有写权限

# 4. 查看 QEMU 日志
tail -f /var/log/libvirt/qemu/vm-name.log

# 5. 检查 VM 状态
virsh domstate vm-name
# 某些状态不支持快照

解决方案:

# 如果是 RAW 格式,转换为 QCOW2
virsh shutdown vm-name
qemu-img convert -f raw -O qcow2 \
  /var/lib/libvirt/images/vm-name.raw \
  /var/lib/libvirt/images/vm-name.qcow2

# 更新 VM 配置
virsh edit vm-name
# 修改磁盘路径

# 启动 VM
virsh start vm-name

常见问题 2: 快照恢复失败

症状:

virsh snapshot-revert vm-name snap1
# error: unable to open file '/path/to/snapshot.qcow2'

排查:

# 1. 检查快照文件是否存在
ls -la /var/lib/libvirt/images/*snap*.qcow2

# 2. 检查快照链完整性
qemu-img check /var/lib/libvirt/images/vm-name-snap1.qcow2

# 3. 查看快照 XML
virsh snapshot-dumpxml vm-name snap1

# 4. 修复快照链
qemu-img rebase -f qcow2 \
  -b /var/lib/libvirt/images/vm-name.qcow2 \
  /var/lib/libvirt/images/vm-name-snap1.qcow2

常见问题 3: 快照占用空间过大

症状:

# 快照文件比预期大很多
du -h vm-name-snap1.qcow2
# 100G (而实际数据变化只有几 GB)

解决:

# 1. 压缩快照
qemu-img convert -f qcow2 -O qcow2 -c \
  vm-name-snap1.qcow2 \
  vm-name-snap1-compressed.qcow2

# 2. 清理未使用块
# 在 VM 中执行
fstrim -av

# 3. 压缩镜像
virsh domfstrim vm-name

# 4. 重新创建快照
virsh snapshot-delete vm-name snap1
virsh snapshot-create-as vm-name snap1 --disk-only

常见问题 4: 快照链损坏

症状:

qemu-img check vm-name-snap2.qcow2
# error: Could not open backing file

修复:

# 1. 检查所有父镜像
for img in /var/lib/libvirt/images/*snap*.qcow2; do
  echo "Checking $img..."
  qemu-img info $img | grep "backing file"
done

# 2. 修复 backing 文件路径
qemu-img rebase -f qcow2 \
  -u \
  -b /correct/path/parent.qcow2 \
  child.qcow2

# 3. 如果父镜像丢失,尝试合并
qemu-img commit child.qcow2

快照最佳实践

快照命名规范

# 推荐格式
<用途>-<日期>-<时间>
# 示例:
pre-update-20260309-120000
post-config-20260309-150000
backup-daily-20260309

# 包含描述
virsh snapshot-create-as vm-name \
  pre-update-20260309-120000 \
  "系统更新前备份 - 包含安全补丁"

快照保留策略

推荐策略:

每日快照:
- 保留最近 7 天
- 自动删除

每周快照:
- 保留最近 4 周
- 自动删除

每月快照:
- 保留最近 12 个月
- 长期归档

事件快照:
- 重大变更前
- 永久保留 (除非确认不需要)

自动化脚本:

#!/bin/bash
# snapshot-retention.sh

VM_NAME=$1
RETENTION_DAYS=7

# 删除超过保留期的快照
CUTOFF=$(date -d "$RETENTION_DAYS days ago" +%Y%m%d-%H%M%S)

for snap in $(virsh snapshot-list $VM_NAME --name); do
  SNAP_DATE=$(echo $snap | grep -oE '[0-9]{8}-[0-9]{6}')
  
  if [[ "$SNAP_DATE" < "$CUTOFF" ]]; then
    echo "Deleting old snapshot: $snap"
    virsh snapshot-delete $VM_NAME $snap
  fi
done

快照监控

监控脚本:

#!/bin/bash
# monitor-snapshots.sh

echo "=== Snapshot Monitor ==="
echo

for vm in $(virsh list --name); do
  SNAP_COUNT=$(virsh snapshot-list $vm --name | wc -l)
  
  if [ $SNAP_COUNT -gt 0 ]; then
    echo "VM: $vm"
    echo "  Snapshots: $SNAP_COUNT"
    
    # 获取最新快照
    LATEST=$(virsh snapshot-list $vm --name | tail -1)
    echo "  Latest: $LATEST"
    
    # 计算总占用空间
    TOTAL_SIZE=0
    for snap in $(virsh snapshot-list $vm --name); do
      DISK=$(virsh snapshot-disk $vm $snap | grep vda | awk '{print $2}')
      if [ -f "$DISK" ]; then
        SIZE=$(du -sm $DISK | cut -f1)
        TOTAL_SIZE=$((TOTAL_SIZE + SIZE))
      fi
    done
    echo "  Total Size: ${TOTAL_SIZE}MB"
    echo
  fi
done

实战案例

案例 1: 数据库更新备份

场景:

生产数据库需要更新
需要确保可以回滚
停机时间最小化

步骤:

# 1. 创建快照前检查
virsh domstate db-vm
# running

# 2. 创建带 quiesce 的快照
virsh snapshot-create-as db-vm \
  pre-update-20260309 \
  "数据库更新前 - MySQL 8.0 到 8.1" \
  --live \
  --disk-only \
  --quiesce

# 3. 验证快照
virsh snapshot-list db-vm
# 确认快照创建成功

# 4. 执行更新
# ... 数据库更新操作 ...

# 5. 验证更新成功
# 如果失败,恢复快照
virsh snapshot-revert db-vm pre-update-20260309

# 6. 如果成功,删除快照 (保留 30 天)
# virsh snapshot-delete db-vm pre-update-20260309

案例 2: 开发环境快速重置

场景:

开发团队需要频繁重置环境
每天多次创建/删除快照
需要自动化

自动化脚本:

#!/bin/bash
# dev-environment-reset.sh

DEV_VMS=("dev-vm1" "dev-vm2" "dev-vm3")
SNAP_NAME="daily-snap-$(date +%Y%m%d)"

echo "Starting environment reset..."

for vm in "${DEV_VMS[@]}"; do
  echo "Processing $vm..."
  
  # 删除旧快照
  for old_snap in $(virsh snapshot-list $vm --name | grep "daily-snap"); do
    virsh snapshot-delete $vm $old_snap
  done
  
  # 创建新快照
  virsh snapshot-create-as $vm \
    $SNAP_NAME \
    "Daily development snapshot" \
    --live \
    --disk-only
  
  echo "$vm completed"
done

echo "Environment reset completed"

定时任务:

# 每天凌晨 2 点执行
crontab -e
0 2 * * * /usr/local/bin/dev-environment-reset.sh >> /var/log/snapshot-reset.log 2>&1

案例 3: 培训环境管理

场景:

培训中心需要管理 20 台学员 VM
每次课程前重置到初始状态
课程中允许学员自由操作
课程后自动恢复

管理脚本:

#!/bin/bash
# training-env-manager.sh

ACTION=$1
CLASS_VMS=$(seq -f "train-vm%g" 1 20)

case $ACTION in
  "reset")
    echo "Resetting all training VMs..."
    for vm in $CLASS_VMS; do
      virsh shutdown $vm
      virsh snapshot-revert $vm initial-state
      virsh start $vm
    done
    echo "Reset completed"
    ;;
  
  "snapshot")
    echo "Creating snapshots..."
    for vm in $CLASS_VMS; do
      virsh snapshot-create-as $vm \
        pre-class-$(date +%Y%m%d-%H%M%S) \
        "Pre-class snapshot" \
        --disk-only
    done
    echo "Snapshots created"
    ;;
  
  "cleanup")
    echo "Cleaning up old snapshots..."
    for vm in $CLASS_VMS; do
      for snap in $(virsh snapshot-list $vm --name | grep "pre-class"); do
        virsh snapshot-delete $vm $snap
      done
    done
    echo "Cleanup completed"
    ;;
esac

总结

快照操作检查清单

创建前:
□ 检查磁盘格式 (QCOW2)
□ 检查存储空间
□ 检查 VM 状态
□ 通知相关人员

创建时:
□ 使用有意义的名称
□ 添加描述信息
□ 选择正确的参数 (--live, --disk-only)
□ 验证创建成功

创建后:
□ 记录快照信息
□ 设置保留策略
□ 定期监控空间使用
□ 测试恢复流程

性能优化要点

✓ 使用 QCOW2 格式
✓ 选择 --disk-only (除非需要内存快照)
✓ 配置正确的缓存模式 (none)
✓ 使用 SSD 存储
✓ 定期合并快照链
✓ 避免过长的快照链

安全建议

✓ 快照文件加密存储
✓ 限制快照访问权限
✓ 定期测试恢复流程
✓ 异地备份快照
✓ 监控快照空间使用
✓ 制定快照保留策略

本文档属于 KVM 虚拟化技术实战系列
对应视频:10-10 (03:13)
最后更新:2026 年 3 月

更多推荐