快照的两种方式
目标
分别创建 qcow2 的内部快照和外部快照,并通过实际的文件结构确认两种方式的差别。
为什么重要
内部快照只用一个文件管理,很方便,但不易备份——因为原始镜像一直在变化。外部快照会创建一个以当前镜像为后备文件的新覆盖层,让原始镜像冻结在那个时间点。所以备份工具可以安全地复制原始镜像,这也是实际备份工作流的标准做法。回滚也只需丢弃覆盖层即可,很简单。代价是文件会增多,需要管理链。
注意:VM 运行期间不能用 qemu-img 触碰镜像。 本实验只在停止状态下进行。
步骤
- 创建
/root/snap目录,并把/root/snap/disk.qcow2创建为 1G 的 qcow2。 - 创建名为
before-upgrade的内部快照。 - 把快照列表保存到
/root/snap/list1.txt。必须能看到before-upgrade。 - 再创建
after-patch和rollback-point两个,并把列表保存到/root/snap/list3.txt。快照必须恰好是 3 个。 - 应用(回滚到)
before-upgrade快照,并把该命令的退出码以rc=0的格式写入/root/snap/applied.txt。 - 删除
after-patch快照,并把剩余列表保存到/root/snap/list2.txt。快照必须恰好是 2 个。 - 创建外部快照。创建以
disk.qcow2为后备文件的/root/snap/disk.ext1.qcow2,并把后备链输出保存到/root/snap/chain.txt。 - 把
/root/snap/compare.txt写成以下 4 行。INTERNAL_COUNT=<6번 이후 남은 내부 스냅샷 개수>/EXTERNAL_FILES=2/BACKUP_FRIENDLY=external/ROLLBACK_INTERNAL=-a(占位符为第 6 步之后剩余的内部快照个数)
参考
- 内部快照只需
qemu-img snapshot -c <이름> <파일>/-l/-a <이름>/-d <이름>这四个就够了(占位符依次为名称、文件名)。 - 外部快照是
qemu-img create -f qcow2 -b <현재이미지> -F qcow2 <새오버레이>(占位符依次为当前镜像、新覆盖层)。 -l的输出有两行表头,计数时要排除。- 常见错误 1:在第 6 步用
-a代替-d。这会变成应用而不是删除。 - 常见错误 2:在第 7 步删除的是后备文件一侧而不是覆盖层,整条链就会损坏。
准备实验镜像
创建 /root/snap 目录,并把 /root/snap/disk.qcow2 创建为 1G 的 qcow2。
使用与前一个实验无关的新镜像。大小小一点也可以。
创建内部快照
创建名为 before-upgrade 的内部快照。
qemu-img snapshot 的 -c 是创建。把名称作为参数给出。
快照列表
把快照列表保存到 /root/snap/list1.txt。必须能看到 before-upgrade。
-l 会以表格显示 ID、TAG、大小和时间。有表头行,计数时要注意。
创建多个时间点
再创建 after-patch 和 rollback-point 两个,并把列表保存到 /root/snap/list3.txt。快照必须恰好是 3 个。
只换名称,重复同一条命令即可。列表中必须能看到三个。
回滚快照
应用(回滚到)before-upgrade 快照,并把该命令的退出码以 rc=0 的格式写入 /root/snap/applied.txt。
-a 会把镜像内容回滚到指定快照的时间点。列表本身会保留。
删除快照
删除 after-patch 快照,并把剩余列表保存到 /root/snap/list2.txt。快照必须恰好是 2 个。
用 -d 删除一个,它就会从列表中消失。请确认剩余个数。
创建外部快照
创建外部快照。创建以 disk.qcow2 为后备文件的 /root/snap/disk.ext1.qcow2,并把后备链输出保存到 /root/snap/chain.txt。
创建一个以当前镜像为后备文件的新覆盖层,就是外部快照。
两种方式的对比表
把 /root/snap/compare.txt 写成以下 4 行。
INTERNAL_COUNT=<6번 이후 남은 내부 스냅샷 개수> / EXTERNAL_FILES=2 / BACKUP_FRIENDLY=external / ROLLBACK_INTERNAL=-a(占位符为第 6 步之后剩余的内部快照个数)
这些值必须是在前面步骤中实际确认过的。备份友好度要看原始镜像是否被固定。