qcow2 快照创建、恢复、删除与快照链管理
两种快照
QEMU 里有两种完全不同的快照机制:
| 类型 | 存储位置 | 内容 | 体积 | 恢复速度 |
|---|---|---|---|---|
| qcow2 磁盘快照 | qcow2 文件内部 | 仅磁盘状态 | 小 | 中等 |
| QEMU VM 快照(savevm) | qcow2 文件内部或外部 | CPU + 内存 + 磁盘 | 大 | 快 |
两种快照都用 savevm / loadvm / delvm 命令管理,但存储内容不同。
快照创建
在 QEMU Monitor 里
虚拟机运行时按 Ctrl+Alt+2(默认组合键)切换到 Monitor:
(qemu) savevm clean-install
(qemu) savevm before-upgrade
(qemu) savevm after-patch-v2
(qemu) info snapshots
Ctrl+Alt+1 切回图形窗口。
命令行
# 创建快照(需要先启动虚拟机,或用 qemu-img)
qemu-img snapshot -c snapshot-name disk.qcow2
virt-manager 图形界面
virt-manager 打开虚拟机 → 菜单栏「View」→「Snapshots」→ 添加。
快照恢复
(qemu) loadvm before-upgrade
恢复快照后虚拟机状态完全回到该快照时的样子,包括内存、CPU 寄存器、磁盘。注意:恢复是破坏性操作,恢复后的状态会覆盖恢复前的状态。如果不想丢当前状态,先创建一个新快照。
快照删除
(qemu) delvm after-patch-v2
删除快照后对应的磁盘空间会慢慢回收(qcow2 的空间回收是异步的,不会立即缩小文件)。
也可以用 qemu-img:
qemu-img snapshot -d snapshot-name disk.qcow2
快照的磁盘占用
快照会占用磁盘空间——每个快照存储的是"当前时刻的磁盘状态"。但 qcow2 用 COW 只存增量:
base (初始) ──────── 干净的 Ubuntu
│
└── snap1 (改了包管理器配置)
│
└── snap2 (装了 nginx + 配置)
│
└── 当前状态 (改了 nginx 虚拟主机)
快照是链式的,每个快照只存和上一个快照的差异。如果基础层写了很多数据再创建快照,快照本身也会比较大。
安全管理快照
规则一:不要运行时删快照
❌ 虚拟机运行中 delvm
某些 QEMU 版本下运行中删除快照会损坏 qcow2 内部结构。先关机再操作快照。
规则二:快照不要太多
一张 qcow2 镜像里塞 50 个快照是能跑的,但:
- 启动变慢(要遍历整个快照链)
- COW 效率降低(每次写入要检查更多层)
- 坏一个快照整个链都有风险
建议每个虚拟机不超过 5~10 个快照。旧快照删除后定期合并后端链。
规则三:生产环境慎用
qcow2 快照是面向开发/测试的。生产环境的虚拟机应该用外部备份(rsync、快照、云盘快照),不要依赖 qcow2 内部快照——一旦 qcow2 损坏,内部快照链无法恢复。
规则四:快照不等于备份
快照是恢复点,不是备份。备份是独立的文件副本。正确做法:
- 在虚拟机里创建快照作为快速恢复点
- 定期用
qemu-img convert把镜像完整复制一份作为备份
后端链与快照的关系
带后端文件的增量镜像自动具备"隐式快照"效果:
qemu-img create -f qcow2 -b base.qcow2 work.qcow2
修改都写在 work.qcow2 里,base.qcow2 保持只读。如果搞坏了,删掉 work.qcow2 重建一个就行。这种方式比 savevm 更轻量,适合快速实验。
清理与压缩
删除快照后 qcow2 文件不会立即变小。压缩:
# 先在 Guest 里释放空空间
fstrim -a
# 宿主机压缩
qemu-img convert -c -O qcow2 old.qcow2 new.qcow2
mv new.qcow2 old.qcow2