LabHub
学习 学习路径 课程

虚拟化与 QEMU/KVM

qcow2 与后备链

在 LabHub 中继续学习

一句话总结

qcow2 真正强大的地方不在压缩或加密,而在于后备文件。在一个黄金镜像上叠加轻量覆盖层,就能创建数十台 VM。

概念图: 后备文件 · 从后备文件读取,只向覆盖层写入。 · virtual size · disk size

为什么需要了解这些

需要启动 100 台 VM,每台都要有 20GB 磁盘。直接创建就需要 2TB。但这 100 台 VM 都从同一个 OS 镜像启动,每台真正不同的部分只有几百 MB。

qcow2 的后备文件解决了这个问题:从后备文件读取,只向覆盖层写入。 100 台 VM 共享一个 20GB 黄金镜像,各自只保存自己的变更。

工作原理

基本操作

qemu-img create -f qcow2 base.qcow2 20G        # 씬 프로비저닝: 실제 점유는 거의 0
qemu-img info base.qcow2
qemu-img info --output=json base.qcow2         # 스크립트로 파싱하기 좋다
qemu-img convert -f raw -O qcow2 in.raw out.qcow2
qemu-img check base.qcow2

查看 qemu-img info 时要关注两个值。

两者之差就是精简配置。刚创建的 20G 镜像,其 disk size 只有约 200KB。监控时若只看 virtual size,就会漏掉过量分配风险。 宿主机磁盘只有 500GB、所有镜像的 virtual size 合计却达到 2TB,这种状态完全可以正常存在;但客户机开始真正写满空间时,问题才会爆发。

后备文件

qemu-img create -f qcow2 -b /var/lib/libvirt/base.qcow2 -F qcow2 vm01.qcow2
qemu-img info --backing-chain vm01.qcow2

必须使用 -F 明确指定后备文件格式。过去可以省略,但现在会出现警告或直接被拒绝,因为允许程序猜测格式可能带来安全问题。

后备链有以下规则。

  1. 绝对不能修改后备文件。 覆盖层以“后备文件中的这个块未发生变化”为前提,因此后备文件一旦改变,覆盖层就会在无明显提示的情况下损坏。惯例是将黄金镜像设为只读。
  2. 路径会记录在镜像内部。 移动后备文件后,覆盖层将无法找到它。可以通过 qemu-img rebase -u -b <새경로> <오버레이> 只修改记录(-u 表示 unsafe——不实际移动数据,只更改引用)。
  3. 链越长,读取性能越差。 为了找到一个块,需要逐层向上查询多个文件。定期使用 qemu-img convert 将链扁平化(flatten),是一项常规维护工作。

两种快照

内部快照(internal)——在一个 qcow2 文件中同时保存多个时间点。

qemu-img snapshot -c before-upgrade disk.qcow2   # 생성
qemu-img snapshot -l disk.qcow2                  # 목록
qemu-img snapshot -a before-upgrade disk.qcow2   # 적용(되돌리기)
qemu-img snapshot -d before-upgrade disk.qcow2   # 삭제

它只需管理一个文件,使用方便,但文件会持续变大,而且VM 运行期间绝不能使用 qemu-img 操作镜像(修改正在使用的镜像会导致损坏)。运行中的快照必须通过 QEMU 监视器或 libvirt 创建。

外部快照(external)——以当前镜像作为后备文件,创建新的覆盖层。

qemu-img create -f qcow2 -b disk.qcow2 -F qcow2 disk.snap1.qcow2

原始镜像会冻结在该时间点,后续写入都进入新文件。备份工具因此可以安全复制原始镜像,所以它是备份工作流中的标准方式。回滚只需丢弃覆盖层即可,但文件数量会增加,也需要管理后备链。

项目 内部快照 外部快照
文件数量 1 个 每个时间点 1 个
回滚方式 -a 删除覆盖层
备份友好度 (原始镜像保持固定)
运行中创建 需要监视器/libvirt 需要监视器/libvirt
链管理 不需要 需要

cluster_size

它是 qcow2 的分配单位,默认值为 64KB。

qemu-img create -f qcow2 -o cluster_size=1M big.qcow2 100G

设置得较大可以减少元数据,有利于顺序 I/O;设置得较小则能减少随机写入造成的浪费。对于大容量镜像,常见的调优方式是将其提高到 1M。

生产现场中的常见情况

误修改后备文件,导致数十台 VM 损坏。 为给黄金镜像打补丁而直接启动它的那一刻,叠加在其上的所有覆盖层都会失去一致性。应当先创建黄金镜像的副本,在副本上应用补丁,再将它作为新一代镜像发布。

宿主机磁盘突然写满。 多个精简配置镜像同时增长时,最先出故障的是宿主机。VM 会遇到磁盘错误,文件系统也可能损坏。必须同时监控 virtual size 总量和实际剩余空间。

下一次实验要做什么

创建 qcow2、读取其信息并转换格式,建立后备链,再使用 rebase 修正路径。在后续实验中,还会分别操作内部和外部快照并制作对照表。