qcow2镜像大小压缩

本文拟对qcow2进行压缩进行简单介绍

背景

qcow2镜像在使用一段时间后,总是会不断膨胀变大,所以在导出分享时一般都需要进行压缩以缩减占用空间。

清除空洞

qcow2方式也有稀疏的问题,在磁盘级别上看,镜像会有大量连续的相同空洞,比如刚创建的镜像的swap分区,通过virt-sparsify 我们可以消除这些空洞,从而缩小磁盘大小,便于我们传输磁盘镜像。该方法耗时较久

bash 复制代码
qemu-img create -f qcow2 test2.qcow2 5G   #创建5G的qcow2镜像
# sudo apt install guestfs-tools # 安装工具包
virt-sparsify -x /root/test.qcow2 --convert qcow2 /root/test2.qcow2   #除镜像空洞
# 使用该方法不会降低系统开机速度
virt-sparsify --compress --convert qcow2 centos.img centos.qcow2    #镜像格式转换

fstrim方法

具体流程就是将qcow2镜像挂载出来,随后对每个分区进行fstrim操作。

在导出镜像之前,先在虚拟机系统的内部,对所有未使用,以及所有剩余可使用的磁盘空间进行全面置零填充操作,可以简单理解为将当前所有未存储有效数据的block(含已删除的文件block)全都进行写0覆盖,然后再进行镜像压缩导出,就可以忽略所有这些无用的数据空间了;该方法耗时较久。

bash 复制代码
#dd if=/dev/zero of=/null.dat   //创建一个全0的大文件,占满所有的剩余磁盘空间,需要很久时间
#rm -f /null.dat                //删除这个文件
 
#qemu-img convert -c -p -O qcow2 vm500G.qcow2 vm500G-mini.qcow2

进一步压缩

bash 复制代码
qemu-img convert -p -O qcow2 zero_disk.qcow2 new_disk.qcow2
# 没有使用 -c 选项,单独使用该方法镜像文件不会变小,需要先去空洞再convert
 
# 如果需要压缩,可以加上 -c 选项,文件会变得更小:
qemu-img convert -p -c -O qcow2 zero_disk.qcow2 compress_disk.qcow2
# 使用该方法会降低系统开机速度,原因是每次都到压缩镜像上的文件都需要解压缩,这会影响读性能

不影响性能

参考压缩qcow2镜像带来的性能损失简单分析这里的分析,对qcow2镜像进行压缩会对虚拟机性能产生影响。

第一种:用virt-sparsify -x uos1060-nogt.qcow2 --convert qcow2 uos-spar.qcow2 --tmp ./tmp/来清除空洞

第二种:

  1. 先用fstrim镜像
  2. qemu-img convert -p -O qcow2 src.qcow2 dst.qcow2

经过测试,这两种方法最后缩减镜像大小的效果基本一样。

已经被压缩的镜像如何恢复

重新转换成raw格式或者qcow2格式(不带-c压缩选项)

qemu-img convert -f qcow2 -p -O qcow2 src-c.qcow2 dst-uc.qcow2

参考

Does converting qcow2 without -c remove compression?

Can qemu-img uncompress qcow2 file?

An Overview of QEMU Storage Features

相关推荐
爱喝水的鱼丶3 小时前
SAP-ABAP:SAP性能分析核心工具入门——ST05/SAT/ST12等常用事务码的基础用法解析
性能优化·sap·abap·性能分析·开发交流·交流学习
什仙3 小时前
Maxwell:提取实体表面,用于扫掠。
笔记·学习·ansys·maxwell
小僧景贤3 小时前
嵌入式C语言 第十一篇:成长路线|嵌入式C工程师完整进阶学习路径(从零到工程级落地|含周期+实战项目)
c语言·开发语言·学习
FungLeo4 小时前
Flutter 带 TTL 的多级缓存设计:内存+磁盘+网络三层实战
网络·flutter·缓存·性能优化
人间凡尔赛5 小时前
React Compiler 1.0 正式落地:告别 useMemo / useCallback,2026 前端性能优化的新范式
前端·性能优化·react
啄缘之间5 小时前
5.1 uvm‑component 的层级结构管理? new (name,parent) 参数
开发语言·笔记·学习·ic·uvm·sv
math_hongfan5 小时前
鸿蒙多模态AI交互高级:图文+语音+手势融合交互/多模态大模型端侧适配/跨模态检索高阶实战
人工智能·学习·华为·交互·语音识别·harmonyos·鸿蒙
旖旎夜光5 小时前
C++(类与对象)(下)
开发语言·c++·学习
math_hongfan6 小时前
鸿蒙AI应用性能高级评测:推理延迟/内存占用/功耗/准确率四维指标评测体系与极致调优方案
人工智能·学习·华为·harmonyos·鸿蒙
山荷枝18 小时前
Java学习第十天
java·学习