2019 字
10 分钟
Qcow2
QCOW2(QEMU Copy-On-Write version 2)是一种虚拟磁盘镜像文件格式,由QEMU虚拟化平台开发并广泛使用。它在虚拟化环境中用于存储虚拟机的磁盘数据,支持多种高级功能,比如动态分配存储空间、快照、压缩和加密等。以下是对 QCOW2 的详细说明:
QCOW2 的核心概念
- 虚拟磁盘镜像:
QCOW2 文件充当虚拟机的磁盘,用来模拟物理硬盘存储数据。虚拟机可以将其视为真实的硬盘使用。 - Copy-On-Write 机制:
数据写入操作采用“写时复制”策略,即在修改数据时,不直接覆盖原始数据,而是将新数据写入新的存储位置,并更新对应的元数据。这种机制实现了快照和增量存储功能。
QCOW2 的主要功能
- 动态分配存储空间
- QCOW2 文件在创建时可以指定一个逻辑容量(虚拟磁盘大小),但实际存储空间根据写入的数据量动态分配。
- 例如,一个创建了 100GB 的 QCOW2 文件,初始可能只占用几十 KB,只有当数据写入时,文件才逐渐增长。
- 快照功能
- 快照是虚拟机磁盘的状态保存点。QCOW2 可以支持多个快照,记录磁盘在不同时刻的状态。
- 快照功能依赖于 Copy-On-Write 机制:对磁盘的修改写入新位置,同时保留旧数据不变,方便回滚到之前的状态。
- 增量存储和链式存储
- QCOW2 支持引用一个基础镜像文件(backing file),称为基础文件。新创建的 QCOW2 文件仅记录与基础文件的差异,而不是复制所有数据。
- 例如:多个虚拟机基于同一个操作系统基础镜像创建增量磁盘,这样可以节省存储空间。
- 压缩
- QCOW2 支持将数据块进行压缩存储,进一步减少磁盘空间占用。
- 加密
- QCOW2 支持对磁盘数据进行加密,确保数据安全。其加密功能使用 AES 算法。
- 支持稀疏文件
- 未使用的数据块不分配物理存储空间,仅记录为稀疏区域。
QCOW2 的文件结构
QCOW2 的文件结构由以下几部分组成:
- 文件头(Header)
- 包含文件的元信息,例如文件大小、版本、集群大小、加密标志等。
- 元数据(Metadata)
- QCOW2 使用一个两级表结构(L1 表和 L2 表)来管理地址映射:
- L1 表:记录 L2 表的位置。
- L2 表:记录数据块的具体地址。
- QCOW2 使用一个两级表结构(L1 表和 L2 表)来管理地址映射:
- 数据块(Data Clusters)
- 用于存储虚拟磁盘的实际数据。QCOW2 支持稀疏存储,未写入数据的块不会分配实际存储空间。
- 快照区域
- 用于存储快照信息,包括快照的元数据和差异数据。
QCOW2 的工作原理
1. 数据写入过程
- 虚拟机向 QCOW2 磁盘写入数据时:
- QCOW2 首先检查对应的数据块是否已经分配。
- 如果未分配,则在磁盘文件中分配新的存储空间。
- 写入数据后,更新 L1/L2 表的映射信息。
2. 快照实现
- 当创建快照时:
- 当前 QCOW2 文件冻结,成为只读状态。
- 新的数据写入到快照区域或增量文件中。
- 读取时,根据 L1/L2 表判断是访问原始数据还是快照数据。
3. 链式存储
- QCOW2 支持基础镜像(backing file)。创建新的 QCOW2 文件时,可以指定一个基础镜像:
- 数据读取时,先从增量文件读取;如果未找到,再查找基础镜像。
QCOW2 的优缺点
优点
- 高效的存储管理:支持动态分配和稀疏存储,节省磁盘空间。
- 灵活性强:支持快照、增量存储和链式存储,方便虚拟机管理。
- 功能丰富:原生支持压缩和加密。
缺点
- 性能略低:相比于原始磁盘格式(raw),QCOW2 的元数据管理增加了性能开销。
- 复杂性高:由于支持多层存储和快照,文件的管理和修复较为复杂。
常见应用场景
- 虚拟机磁盘管理:
- 为 QEMU/KVM 虚拟机提供虚拟磁盘文件。
- 快照与备份:
- 创建快照用于备份或测试环境的回滚。
- 基础镜像管理:
- 在多虚拟机共享基础操作系统镜像时,使用增量 QCOW2 文件记录差异。
QCOW2 与其他格式的对比
| 功能 | QCOW2 | RAW | VMDK(VMware) |
|---|---|---|---|
| 动态分配存储空间 | ✅ | ❌ | ✅ |
| 支持快照 | ✅ | ❌ | ✅ |
| 性能 | 中等 | 高 | 中等 |
| 支持压缩 | ✅ | ❌ | ✅ |
| 支持加密 | ✅ | ❌ | 部分支持 |
| 兼容性 | QEMU/KVM | 所有虚拟化平台 | VMware 平台 |
删除大文件
当在QCOW2 镜像文件的虚拟磁盘内部删除大文件时,实际存储空间的变化依赖于文件系统和 QCOW2 格式的工作机制。以下是详细说明:
1. 虚拟机内部文件删除的行为
在虚拟机的操作系统内部,当删除文件时:
- 文件系统的行为:
文件系统(如 ext4、NTFS)通常只标记文件所占用的存储块为“可用”,而不会真正擦除数据或释放磁盘上的物理空间。 - 数据仍然存在:
从磁盘的底层视角(包括 QCOW2 镜像),被删除文件的数据仍然存在,除非被新的数据覆盖。
因此,仅在虚拟机中删除文件,不会自动导致 QCOW2 文件的大小减少。
2. QCOW2 的存储机制
QCOW2 使用动态分配和稀疏存储机制:
- 动态分配:QCOW2 文件只为实际写入的数据分配存储空间。
- 稀疏存储:未使用的空间在物理存储中不占用空间。
然而,删除文件并不会触发 QCOW2 的稀疏机制,因为底层存储块仍包含“无效数据”。
3. 实际存储空间变化
情况 1:仅删除文件
- 虚拟机内部删除文件后,QCOW2 文件的实际大小保持不变,因为:
- 虚拟机的文件系统只标记块为“未使用”。
- QCOW2 文件仍然记录这些数据块。
情况 2:写入新数据覆盖已删除区域
- 如果删除文件后写入新数据:
- QCOW2 文件会动态分配新的存储空间。
- 如果启用了稀疏机制,未覆盖的数据块可能仍被保留,导致文件大小增长。
情况 3:手动压缩和清理(释放空间)
- 为了减少 QCOW2 文件的实际占用空间,需要通过以下步骤:
- 在虚拟机内部清理文件系统:
- 使用
fstrim或zerofree工具将未使用的磁盘空间标记为零。 fstrim:对支持 TRIM 的文件系统有效,直接向底层存储设备通知释放空间。zerofree:将文件系统未使用的区域填充为零,便于后续压缩。
- 使用
- 压缩 QCOW2 文件:
- 使用
qemu-img convert工具重新生成 QCOW2 文件:这样会去除未使用的空间,减小文件大小。Terminal window qemu-img convert -O qcow2 --compress old.qcow2 new.qcow2
- 使用
- 在线压缩:
- 使用
qemu-img rebase或其他支持的工具,在线释放空间(部分平台支持)。
- 使用
- 在虚拟机内部清理文件系统:
4. 示例:清理并压缩 QCOW2 文件
假设虚拟机使用 ext4 文件系统,删除大文件后,以下是具体操作:
在虚拟机中操作:清理文件系统
-
删除文件:
Terminal window rm -rf /path/to/large/files -
运行 fstrim:
Terminal window sudo fstrim -v /或 使用 zerofree:
- 挂载虚拟磁盘为只读模式。
- 运行
zerofree:Terminal window zerofree /dev/sda1
在宿主机中操作:压缩 QCOW2 文件
-
使用 qemu-img 工具:
Terminal window qemu-img convert -O qcow2 old.qcow2 new.qcow2或直接使用压缩标志:
Terminal window qemu-img convert -O qcow2 -c old.qcow2 new.qcow2
总结
- 仅在虚拟机内删除文件不会减少 QCOW2 文件的实际存储空间,因为底层数据块仍然存在。
- 要释放存储空间,需要:
- 在虚拟机中清理未使用的空间(如使用
fstrim或zerofree)。 - 使用宿主机工具(如
qemu-img)压缩或重新生成 QCOW2 文件。
- 在虚拟机中清理未使用的空间(如使用