有没有办法缩小 qcow2 图像而不将其转换为原始图像?

YOU*_*YOU 21 hard-drive convert qemu qcow2 kvm-virtualization

有没有办法缩小 qcow2 图像而不将其转换为原始图像?

我无法将其转换为原始图像,因为我没有足够的磁盘空间来存储原始图像。

小智 27

Noop 转换(qcow2-to-qcow2)去除稀疏空间:

qemu-img convert -O qcow2 source.qcow2 shrunk.qcow2
Run Code Online (Sandbox Code Playgroud)

您还可以尝试-c向输出图像添加压缩 ( ):

qemu-img convert -c -O qcow2 source.qcow2 shrunk.qcow2
Run Code Online (Sandbox Code Playgroud)

在运行上述命令之前,请务必关闭 VM。在您对结果感到满意后,您可以将 shrunk.qcow2 重命名为您的 VM 配置想要的原始名称。

  • qemu-img convert -c -O 中的 -c 标志用于压缩,而不是收缩......它可以降低磁盘速度...... (4认同)
  • 需要注意的是:此过程不会保留内部 qcow2 快照(如果有)。在删除原始文件后,我经历了惨痛的教训。 (3认同)

dya*_*sny 13

尝试virt-sparsify- 它将对图像中未使用的块进行零填充,然后对零进行去重。

  • @YOU 当前版本的 virt-sparsify 可以就地工作,而无需为磁盘映像的完整副本分配空间。 (2认同)

小智 8

我用virt-sparsify

virt-sparsify /path/to/source.qcow2 --compress /path/to/output.qcow2
Run Code Online (Sandbox Code Playgroud)


小智 6

首先,从虚拟机内部缩小分区和文件系统。Windows 客户机可以通过磁盘管理来执行此操作。Linux 可以使用 resize2fs 和 fdisk 来做到这一点。如果您对此过程不满意,请改用gparted等可启动 ISO 。

完成后,磁盘末尾应该有未使用的空间。例如,在 Windows 中,磁盘末尾看起来有 11MB 的可用空间(在实际示例中,您应该有超过 11MB): 磁盘管理显示磁盘末尾有 11mb 未分配空间

现在我们已将所有数据移至磁盘的前面,我们将砍掉末尾部分。您应该 100% 确定您不会删除真实数据。有些工具以不同的方式计算 GB/GiB,因此您可能应该给自己一些填充(例如将分区缩小 60GB,然后砍掉 50GB)。您始终可以在切碎后重新生长分区。

此命令会将大小调整myhd.qcow2为 200GB,并删除前 200GB 之后的所有数据:

qemu-img resize --shrink myhd.qcow2 200G
Run Code Online (Sandbox Code Playgroud)


小智 5

我已经多次成功地使用这个程序。简而言之,首先在虚拟客户中用零填充所有分区上的所有可用空间:

dd if=/dev/zero of=zerofile bs=1M
Run Code Online (Sandbox Code Playgroud)

完成后,使用 清空磁盘缓存sync,删除零文件并关闭客户机。在主机端转换图像(在本例中将 raw 转换为 qcow2):

qemu-img convert -f raw -O qcow2 guest.img guest-copy.qcow2
Run Code Online (Sandbox Code Playgroud)

这将自动稀疏图像。如果映像文件后缀发生更改,还请记住更新 vm 定义文件。

这种方法的一个好处virt-sparsify是,在这种方法中,客户机可以在写入零的同时启动,因此停机时间更短。如果您可以承受更长的停机时间,请使用virt-sparsify,因为它只需一个命令即可处理整个过程,并在此过程中提供有用的反馈。