2019 字
10 分钟
Qcow2
2025-12-10

QCOW2(QEMU Copy-On-Write version 2)是一种虚拟磁盘镜像文件格式,由QEMU虚拟化平台开发并广泛使用。它在虚拟化环境中用于存储虚拟机的磁盘数据,支持多种高级功能,比如动态分配存储空间、快照、压缩和加密等。以下是对 QCOW2 的详细说明:

QCOW2 的核心概念#

  • 虚拟磁盘镜像
    QCOW2 文件充当虚拟机的磁盘,用来模拟物理硬盘存储数据。虚拟机可以将其视为真实的硬盘使用。
  • Copy-On-Write 机制
    数据写入操作采用“写时复制”策略,即在修改数据时,不直接覆盖原始数据,而是将新数据写入新的存储位置,并更新对应的元数据。这种机制实现了快照和增量存储功能。

QCOW2 的主要功能#

  1. 动态分配存储空间
    • QCOW2 文件在创建时可以指定一个逻辑容量(虚拟磁盘大小),但实际存储空间根据写入的数据量动态分配。
    • 例如,一个创建了 100GB 的 QCOW2 文件,初始可能只占用几十 KB,只有当数据写入时,文件才逐渐增长。
  2. 快照功能
    • 快照是虚拟机磁盘的状态保存点。QCOW2 可以支持多个快照,记录磁盘在不同时刻的状态。
    • 快照功能依赖于 Copy-On-Write 机制:对磁盘的修改写入新位置,同时保留旧数据不变,方便回滚到之前的状态。
  3. 增量存储和链式存储
    • QCOW2 支持引用一个基础镜像文件(backing file),称为基础文件。新创建的 QCOW2 文件仅记录与基础文件的差异,而不是复制所有数据。
    • 例如:多个虚拟机基于同一个操作系统基础镜像创建增量磁盘,这样可以节省存储空间。
  4. 压缩
    • QCOW2 支持将数据块进行压缩存储,进一步减少磁盘空间占用。
  5. 加密
    • QCOW2 支持对磁盘数据进行加密,确保数据安全。其加密功能使用 AES 算法。
  6. 支持稀疏文件
    • 未使用的数据块不分配物理存储空间,仅记录为稀疏区域。

QCOW2 的文件结构#

QCOW2 的文件结构由以下几部分组成:

  1. 文件头(Header)
    • 包含文件的元信息,例如文件大小、版本、集群大小、加密标志等。
  2. 元数据(Metadata)
    • QCOW2 使用一个两级表结构(L1 表和 L2 表)来管理地址映射:
      • L1 表:记录 L2 表的位置。
      • L2 表:记录数据块的具体地址。
  3. 数据块(Data Clusters)
    • 用于存储虚拟磁盘的实际数据。QCOW2 支持稀疏存储,未写入数据的块不会分配实际存储空间。
  4. 快照区域
    • 用于存储快照信息,包括快照的元数据和差异数据。

QCOW2 的工作原理#

1. 数据写入过程#

  • 虚拟机向 QCOW2 磁盘写入数据时:
    1. QCOW2 首先检查对应的数据块是否已经分配。
    2. 如果未分配,则在磁盘文件中分配新的存储空间。
    3. 写入数据后,更新 L1/L2 表的映射信息。

2. 快照实现#

  • 当创建快照时:
    • 当前 QCOW2 文件冻结,成为只读状态。
    • 新的数据写入到快照区域或增量文件中。
    • 读取时,根据 L1/L2 表判断是访问原始数据还是快照数据。

3. 链式存储#

  • QCOW2 支持基础镜像(backing file)。创建新的 QCOW2 文件时,可以指定一个基础镜像:
    • 数据读取时,先从增量文件读取;如果未找到,再查找基础镜像。

QCOW2 的优缺点#

优点#

  • 高效的存储管理:支持动态分配和稀疏存储,节省磁盘空间。
  • 灵活性强:支持快照、增量存储和链式存储,方便虚拟机管理。
  • 功能丰富:原生支持压缩和加密。

缺点#

  • 性能略低:相比于原始磁盘格式(raw),QCOW2 的元数据管理增加了性能开销。
  • 复杂性高:由于支持多层存储和快照,文件的管理和修复较为复杂。

常见应用场景#

  1. 虚拟机磁盘管理
    • 为 QEMU/KVM 虚拟机提供虚拟磁盘文件。
  2. 快照与备份
    • 创建快照用于备份或测试环境的回滚。
  3. 基础镜像管理
    • 在多虚拟机共享基础操作系统镜像时,使用增量 QCOW2 文件记录差异。

QCOW2 与其他格式的对比#

功能QCOW2RAWVMDK(VMware)
动态分配存储空间
支持快照
性能中等中等
支持压缩
支持加密部分支持
兼容性QEMU/KVM所有虚拟化平台VMware 平台

删除大文件#

当在QCOW2 镜像文件的虚拟磁盘内部删除大文件时,实际存储空间的变化依赖于文件系统和 QCOW2 格式的工作机制。以下是详细说明:

1. 虚拟机内部文件删除的行为#

在虚拟机的操作系统内部,当删除文件时:

  • 文件系统的行为
    文件系统(如 ext4、NTFS)通常只标记文件所占用的存储块为“可用”,而不会真正擦除数据或释放磁盘上的物理空间。
  • 数据仍然存在
    从磁盘的底层视角(包括 QCOW2 镜像),被删除文件的数据仍然存在,除非被新的数据覆盖。

因此,仅在虚拟机中删除文件,不会自动导致 QCOW2 文件的大小减少

2. QCOW2 的存储机制#

QCOW2 使用动态分配和稀疏存储机制:

  • 动态分配:QCOW2 文件只为实际写入的数据分配存储空间。
  • 稀疏存储:未使用的空间在物理存储中不占用空间。

然而,删除文件并不会触发 QCOW2 的稀疏机制,因为底层存储块仍包含“无效数据”。

3. 实际存储空间变化#

情况 1:仅删除文件#

  • 虚拟机内部删除文件后,QCOW2 文件的实际大小保持不变,因为:
    • 虚拟机的文件系统只标记块为“未使用”。
    • QCOW2 文件仍然记录这些数据块。

情况 2:写入新数据覆盖已删除区域#

  • 如果删除文件后写入新数据:
    • QCOW2 文件会动态分配新的存储空间。
    • 如果启用了稀疏机制,未覆盖的数据块可能仍被保留,导致文件大小增长。

情况 3:手动压缩和清理(释放空间)#

  • 为了减少 QCOW2 文件的实际占用空间,需要通过以下步骤:
    1. 在虚拟机内部清理文件系统
      • 使用 fstrimzerofree 工具将未使用的磁盘空间标记为零。
      • fstrim:对支持 TRIM 的文件系统有效,直接向底层存储设备通知释放空间。
      • zerofree:将文件系统未使用的区域填充为零,便于后续压缩。
    2. 压缩 QCOW2 文件
      • 使用 qemu-img convert 工具重新生成 QCOW2 文件:
        Terminal window
        qemu-img convert -O qcow2 --compress old.qcow2 new.qcow2
        这样会去除未使用的空间,减小文件大小。
    3. 在线压缩
      • 使用 qemu-img rebase 或其他支持的工具,在线释放空间(部分平台支持)。

4. 示例:清理并压缩 QCOW2 文件#

假设虚拟机使用 ext4 文件系统,删除大文件后,以下是具体操作:

在虚拟机中操作:清理文件系统#

  1. 删除文件

    Terminal window
    rm -rf /path/to/large/files
  2. 运行 fstrim

    Terminal window
    sudo fstrim -v /

    使用 zerofree

    • 挂载虚拟磁盘为只读模式。
    • 运行 zerofree
      Terminal window
      zerofree /dev/sda1

在宿主机中操作:压缩 QCOW2 文件#

  1. 使用 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 文件的实际存储空间,因为底层数据块仍然存在。
  • 要释放存储空间,需要:
    1. 在虚拟机中清理未使用的空间(如使用 fstrimzerofree)。
    2. 使用宿主机工具(如 qemu-img)压缩或重新生成 QCOW2 文件。