准备工作
镜像压缩参考
镜像文件大小
获取官网KVM镜像,通过转换的方式得到所有镜像
转换命令
raw → qcow2
qemu-img convert -O qcow2 image.img image.qcow2
qcow2 → raw
qemu-img convert -O qcow2 image.qcow2 image.img
镜像文件大小如下列表
centos | ubuntu | windows | |
---|---|---|---|
qcow2 | 897M | 300M | 11G |
qcow2(gz) | 371M | 294M | 6.1G |
qcow2(xz) | 261M | 294M | 4.8G |
raw | 8.0G | 2.2G | 12G |
raw(gz) | 373M | 279M | 6.1G |
raw(xz) | 263M | 186M | 4.8G |
kubevirt虚机镜像转换流程
kubevirt在运行虚机镜像前,会运行containerized-data-importer pod将镜像转换成raw格式并导入PVC生成DataVolume。
importer通过获取镜像源的不同方式来配置不同的流程,有HTTPDataSource/ImageioDataSource/RegistryDataSource/S3DataSource/VDDKDataSource等多种方式,最常用的方式是HTTPDataSource,我们也是使用这种方式导入的镜像。阅读源码,这里将HTTP源转换的方式通过流程图展示(v1.52版本,旧版本略有不同):
可知raw和qcow2格式分别流程:
qcow2:开始→convert→resize→结束
raw:开始→convert→resize→结束
观察转换流程,对镜像镜像压缩可能可以节省资源,流程分别为:
qcow2(zx/gx):开始→transferScratch→convert→resize→结束
raw(zx/gx):开始→transferDataFile→resize→结束
最终目标文件/data/disk.img(文件系统),/dev/cdi-block-volume(块设备),对应转换的源码这里:
centos镜像cdi-importer转换测试
raw(xz) | raw | qcow2 | qcow2(xz) | |
---|---|---|---|---|
时间 | 55s | 85s | 17s | 31s |
CPU(峰值) | 23% | 25.2% | 12.9% | 14.2% |
内存(峰值) | 0.1% | 0.1% | 0.1% | 0.1% |
文件大小 | 263M | 8G | 897M | 261M |
ps:
1. xz文件压缩时需要注意将文件分为多个块,因为读取xz文件的原理是将一块读入内存解压,并且cdi-importer有最大块限制,会报错,具体可参考
2. 实际测试v1.41版本importer无论是qcow2还是raw格式都需要经过转换