qcow2 与后备链
一句话总结
qcow2 真正强大的地方不在压缩或加密,而在于后备文件。在一个黄金镜像上叠加轻量覆盖层,就能创建数十台 VM。
为什么需要了解这些
需要启动 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 时要关注两个值。
- virtual size——客户机看到的容量
- disk size——实际占用宿主机磁盘的容量
两者之差就是精简配置。刚创建的 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 明确指定后备文件格式。过去可以省略,但现在会出现警告或直接被拒绝,因为允许程序猜测格式可能带来安全问题。
后备链有以下规则。
- 绝对不能修改后备文件。 覆盖层以“后备文件中的这个块未发生变化”为前提,因此后备文件一旦改变,覆盖层就会在无明显提示的情况下损坏。惯例是将黄金镜像设为只读。
- 路径会记录在镜像内部。 移动后备文件后,覆盖层将无法找到它。可以通过
qemu-img rebase -u -b <새경로> <오버레이>只修改记录(-u表示 unsafe——不实际移动数据,只更改引用)。 - 链越长,读取性能越差。 为了找到一个块,需要逐层向上查询多个文件。定期使用
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 修正路径。在后续实验中,还会分别操作内部和外部快照并制作对照表。