RAW和QCOW2 两种存储设备格式对比及格式转化

一、背景

  当我们在KVM或者openstack或者docker环境中,常会遇到制作vm磁盘,以此作为vm的虚拟磁盘使用。主要是RAW和QCOW2这两种磁盘格式,其实他们都是一种文件格式,做为虚拟机的磁盘使用。
在这里插入图片描述

这里用到一个重要工具就是qemu-img,qemu-img是QEMU的磁盘管理工具,在qemu-kvm源码编译后就会默认同步编译好qemu-img这个二进制文件。
在这里插入图片描述

二、区别

2.1、raw: 裸磁盘格式(默认的虚拟磁盘格式,性能好)

RAW,原意就是“未经加工”,也指未格式化的磁盘。Linux中,raw是磁盘映像的纯二进制映像格式。在支持稀疏文件(sparse file是一种特殊的文件系统设计,主要用于有效管理和使用存储资源;OS中文件系统通常以为单位来分配存储空间。然而,对于一些包含大量未使用空间的文件,例如数据库文件虚拟磁盘镜像,这种方式可能会浪费大量的磁盘空间,而采用稀疏文件形式,只有那些包含实际数据的块才会被分配存储空间,尚未分配的文件的预分配部分仅包含零(即未使用的空间),该部分不会占用任何磁盘空间,但在逻辑上仍然存在。)的文件系统里,raw格式的映像只占用记录在其中的数据实际使用的空间。Raw格式磁盘又称为裸磁盘设备,裸设备,你随便dd一个file就可以模拟了一个raw格式的镜像。

由于裸的彻底,性能上接近物理硬盘的,它可以直接映射到物理磁盘或分区,提供接近原生性能的磁盘访问。目前来看,KVM和XEN 默认的格式 好像还是这个格式。因为其原始,有很多原生的特性,例如:直接挂载也是一件简单的事情。 裸的好处还有就是简单,支持转换成其它格式的虚拟机镜像对裸露的它来说是很简单的(如果其它格式需要转换,有时候还是需要它做为中间格式);从空间使用来看,RAW更像物理磁盘,使用多少就显示多少(du -h看到的大小就是使用大小)。而且, raw虚拟磁盘/映像格式很容易扩展,即原生态,管理灵活度,与系统交互更好,但不支持snapshot,相关资料说明,可利用版本管理软件对raw格式的文件做版本管里,通过不同的版本回滚,实现类似快照的功能。实际应用方面:raw格式可以用于创建磁盘的完整二进制备份(如使用dd命令);这种备份方式可以完全还原磁盘的原始状态,包括分区表、引导扇区和文件系统。RAW直接存储磁盘的二进制数据,适合底层操作。raw格式没有额外的元数据或压缩开销,它常用于磁盘性能基准测试(如使用fio工具)。在嵌入式系统中,raw格式常用于创建可直接烧录到存储设备(如SD卡、eMMC)的磁盘映像。raw格式是数据恢复和取证分析中的常用格式,因为它保留了磁盘的原始数据,便于分析和提取。

由于没有额外的元数据或压缩开销,raw格式在读写性能上通常优于其他格式(raw 启动的虚拟机会比 QCOW2 启动的虚拟机 I/O 效率约高25%)

eg1:创建一个raw的磁盘文件

dd if=/dev/zero of=c.raw bs=1024k count=4096   //创建4G的扩容空间
cat linux.img c.raw > new-linux.img    //追加到原有的镜像之后,再次查看已扩容成功

qemu-img create -f raw test.raw 10G  //输出如下
Formatting 'test.raw', fmt=raw size=10737418240

dd if=/dev/zero of=sparse_file bs=1 count=0 seek=1G  //这里创建的就是一个稀疏文件
#验证:如果查看文件的逻辑大小(由ls命令显示)大于其实际占用的磁盘空间(由du命令显示),则说明该文件是一个稀疏文件;但并非所有的文件系统都支持稀疏文件。在不支持稀疏文件的文件系统中,即使文件的某些部分未被使用,也仍然需要为这些部分分配存储空间。另注意:一旦稀疏文件被删除或损坏,由于其特殊的存储方式,数据恢复可能会非常困难。在虚拟化技术中,稀疏文件通常被用作虚拟硬盘的存储格式,从而可以在虚拟硬盘未被填满之前,节省大量的存储空间;稀疏文件的主要思想是延迟数据块的分配。在文件系统看来,稀疏文件已经分配了所有的数据块,但实际上,只有当应用程序试图写入数据时,才会为相应的数据块分配存储空间

ls -lh sparse_file //显示的大小为1G,而du -sh显示的是0

qemu-img info test.raw //验证,查看磁盘信息;如果虚拟磁盘文件是使用稀疏文件的存储方式,也会显示出它的本来分配的大小以及实际已占用的磁盘空间大小。如果文件中存放有客户机快照,快照的信息也会被显示出来

:当创建虚拟磁盘后,使用它安装了OS镜像,这时,我们还可以利用它来创建派生镜像,从而生成的虚拟磁盘就可自带OS了,而不需要每次都进行OS的全新安装。

2.2、Qcow2(QEMU Copy-On-Write version 2)

Qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像。它也可以用一个文件的形式来表示一块固定大小块设备磁盘。Qcow2是目前比较主流的一种虚拟化镜像格式,具有占用空间小,支持加密,支持压缩,支持快照的特点,它被设计用来支持虚拟机的快照、压缩和加密等功能,同时提供与原始磁盘相当的性能。目前qcow2的性能上接近raw裸格式的性能,与普通的 raw 格式的镜像相比,它还有以下特性:

  • a) 更小的空间占用,即使文件系统不支持空洞(holes);qcow2 格式的镜像比 Raw 格式文件更小,只有在虚拟机实际占用了磁盘空间时,其文件才会增长,支持动态扩展,随着虚拟机使用更多空间,镜像文件的大小会自动增长。也能方便的减少迁移花费的流量,与 QEMU 和 KVM 完全兼容,也被许多其他虚拟化平台和工具支持,更适用于云计算系统。
  • b) 支持写时拷贝(COW, copy-on-write),镜像文件只反映底层磁盘的变化;对原始镜像的修改会创建新的数据块,而不是覆盖原有数据。
  • c) 支持快照(snapshot),镜像文件能够包含多个快照的历史;
  • d) 可选择基于 zlib压缩方式,它允许每个簇(cluster)单独使用 zlib 压缩。支持透明压缩,可以在不损失性能的情况下减少存储空间的使用。
  • e) 可以选择 AES 加密,支持使用 128 位的 AES 密钥进行加密。

官方解释,qcow2 镜像文件是由多个固定大小的单元组织构成,这些单元被称为 (host clusters );无论是实际用户数据(guest data)还是镜像的元数据(metadata),都存储到一个 cluster 单元中。用户系统里所见到的虚拟磁盘实际是被分割成多个同样大小的 clusters 的集合显示。

qcow2 镜像可以用来保存另一个镜像文件的变化,它并不去修改原始镜像文件只记录与原始镜像文件的不同即可,这种镜像文件就叫做 copy-on-write 镜像。虽然是一个单独的文件,但它的大部分的数据都来自原始镜像,只有跟原始镜像文件相比有变化的 cluster 才会被记录下来。快照就是原始文件本身(内部快照)。它既包含做快照之前的原始文件部分,它本身也包含可写的部分。

eg1:创建 qcow2 文件

qemu-img create -f qcow2 test.qcow2 10G //输出如下

Formatting 'test.qcow2', fmt=qcow2 size=10737418240 encryption=off **cluster_size**=65536 lazy_refcounts=off

eg2:openstack里创建Qcow2镜像:

glance image-create –name cirros –file /tmp/cirros-0.3.4-x86_64-disk.img –disk-format qcow2 –container-format bare –progress

eg3:指定固定单元大小( cluster)来创建qcow2格式虚拟磁盘:

qemu-img create -f qcow2 -o cluster_size=2M,backing_file=ubuntu14.04.raw ubuntu-nova.qcow2 40G    //使用backing_file选项指定后端镜像,让生成的虚拟磁盘文件是copy-on-write的增量文件

其中:

1>上述命令使用backing_file方式利用已创建好的ubuntu14.04.raw镜像,来创建qcow2格式的派生镜像,且这里的40G并不会真正占用40G,只是限制了ubuntu-nova.qcow2文件的最大大小。

2>当raw格式文件中安装的系统是windows系列的时候,创建qcow2格式最后文件大小需要比raw格式大2-3倍,例如:创建一个大小为30G的win7.raw格式文件,创建qcow2格式磁盘命令如下:

qemu-img create -f qcow2 -o cluster_size=2M,backing_file=win7.raw windows-7.qcow2 60G

3>上述命令中,ubuntu-nova.qcow2文件并不是一个独立的虚拟镜像文件,在使用过程中需要与ubuntu14.04.raw磁盘一起使用,这就需要保持backing_file绝对路径不变,而qcow2文件是可以移动的。kvm虚拟机是直接与qcow2格式的镜像文件进行交互的,qcow2格式的镜像文件中只是保存了相对raw镜像所有更改的数据,raw格式的镜像文件中的数据不会发生任何变动,raw格式的镜像只作为backing_file,对虚拟机而言完全是透明的。

4>这么做的好处是,raw格式创建后就会占占用指定的空间,比如创建一个20G的raw格式虚拟磁盘,系统就会立即分配20G空间给该文件使用,在此基础上变化的部分写入到qcow2格式的镜像文件/虚拟磁盘中,更节省空间,因其是动态增长的,且支持加密,支持压缩,支持快照的特点。

5>-o选项(options)用来附加对该文件的各种功能设置,可以使用“-o ?”来查询某种格式文件支持那些选项,在“-o”选项中各个选项用逗号来分隔。如果“-o”选项中使用了backing_file这个选项来指定其后端镜像文件,那么这个创建的镜像文件仅记录与后端镜像文件的差异部分。后端镜像文件不会被修改,除非在QEMU monitor中使用“commit”命令或者使用“qemu-img commit”命令去手动提交这些改动。这种情况下,size参数不是必须需的,其值默认为后端镜像文件的大小。另外,直接使用“-b backfile”参数也与“-o backing_file=backfile”效果相同。

语法:qemu-img create [-f fmt] [-o options] filename [size]

其中,size选项用于指定镜像文件的大小,其默认单位是字节(bytes),也可以支持k(或K)、M、G、T来分别表示KB、MB、GB、TB大小。另外,镜像文件的大小(size)也并非必须写在命令的最后,它也可以被写在“-o”选项中作为其中一个选项。

2.3、 Raw 格式与 qcow2 转化

我们可借助QEMU 里的 qemu-img 工具对image 镜像进行格式转化

apt-get install qemu-utils或yum install qemu-img 
qemu-img convert -f raw -O qcow2 test.raw test.raw.qcow2

其中: -f 指定需要转换文件的文件格式;-O 指定要转换的目标格式;源文件不会被删除;

注:一般来说,输入文件格式-f fmt由qemu-img工具可自动检测到,而输出文件格式-O output_fmt需用户根据自己需要来指定,默认会被转换为raw虚拟磁盘文件格式(且默认使用稀疏文件的方式存储以节省存储空间)。加“-c”参数,可对输出的镜像文件进行压缩,不过只有qcow2和qcow格式的镜像文件才支持压缩,而且这种压缩是只读的,如果压缩的扇区被重写,则会被重写为未压缩的数据。

2.4、qcow2格式与raw转化

qemu-img convert -O qcow2 image-raw.raw image-raw-converted.qcow

2.5、vmdk格式与qcow2转化

qemu-img convert -f vmdk -O qcow2 SLES11SP1-single.vmdk SLES11SP1-single.img  //打开虚拟机目录,正常会看到一个.vmdk 格式文件,将VMware用的.vmdk 格式文件转换为.qcow2文件,注意制作虚拟机镜像的时候,建议使用整个磁盘,而不再上面再分成多个区,也不要保留快照

qemu-img convert -f raw openwrt.img -O vmdk openwrt.vmdk  //img转换vmdk

2.6、iso格式与qcow2转化

qemu-img convert -f iso -O qcow2 input.iso output.qcow2 //如果遇到错误 qemu-img: Could not open 'input.iso': Unknown driver 'iso',这意味着 qemu-img 工具不支持直接从 ISO 格式转换。你需要先将 ISO 转换为一个 qemu-img 支持的原始格式(raw),然后再转换为 QCOW2

qemu-img create -f raw im-disk.raw 8G  //先创建一个raw磁盘

dd if=input.iso of=im-disk.raw status=progress  //将 ISO 文件的内容复制到 raw 镜像文件中

qemu-img resize im-disk.raw +1GB  //如果让我磁盘带下不够,可改变镜像文件大小(raw和qcow2都可以支持resize),完成后重新导入

qemu-img convert -f raw -O qcow2 im-disk.raw output.qcow2  //将 raw 格式的镜像文件转换为 QCOW2 格式

qemu-img info output.qcow2 //验证转化

2.7、其他磁盘管理命令

1)qemu-img check -f 磁盘格式 磁盘镜像文件的名称 //对磁盘镜像文件进行一致性检查,查找镜像文件中的错误,目前仅支持对“qcow2”、“qed”、“vdi”格式文件的检查。如果不指定格式qemu-img会自动检测;

qemu-img check test.qcow2  //输出类似如下
No errors were found on the image.

2)qemu-img commit [-f fmt] 虚拟磁盘 //用来提交虚拟磁盘文件中的更改到后端支持镜像文件(创建时通过backing_file指定的)中去。

3)快照管理

语法:qemu-img snapshot [-l | -a snapshot | -c snapshot | -d snapshot] filename

其中,“-l” 选项是查询并列出镜像文件中的所有快照,“-a snapshot”是让镜像文件使用某个快照,“-c snapshot”是创建一个快照,“-d”是删除一个快照。

4)修改镜像文件的后端镜像文件

语法:qemu-img rebase [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] filename

注:只有qcow2和qed格式支持rebase命令。使用“-b backing_file”中指定的文件作为后端镜像,后端镜像也被转化为“-F backing_fmt”中指定的后端镜像格式。

它可以工作于两种模式之下,一种是安全模式(Safe Mode)也是默认的模式,qemu-img会去比较原来的后端镜像与现在的后端镜像的不同,进行合理的处理;另一种是非安全模式(Unsafe Mode),是通过“-u”参数来指定的,这种模式主要用于将后端镜像进行了重命名或者移动了位置之后对前端镜像文件的修复处理,由用户去保证后端镜像的一致性。

5)修改镜像文件的大小

语法:qemu-img resize filename [+ | -]size //使其不同于创建之时的大小

其中,“+”和“-”分别表示增加和减少镜像文件的大小,而size也是支持K、M、G、T等单位的使用。缩小镜像的大小之前,需要在客户机中保证里面的文件系统有空余空间,否则会数据丢失,另外,qcow2格式文件不支持缩小镜像的操作。在增加了镜像文件大小后,也需启动客户机到里面去应用“fdisk”、“parted”等分区工具进行相应的操作才能真正让客户机使用到增加后的镜像空间。不过使用resize命令时需要小心(最好做好备份),如果失败的话,可能会导致镜像文件无法正常使用而造成数据丢失。

如下命令行演示了两个镜像的大小改变:将一个8GB的qcow2镜像增加2GB的空间,将一个8GB大小的raw镜像减少1GB空间。

eg1:qemu-img resize test.qcow2 +2G
eg2:qemu-img resize test.raw -1G

6)其他工具:StarWind V2V Converter

在这里插入图片描述

StarWind V2V Converter是一款免费的工具,用于将虚拟机从一种格式克隆和转换为另一种格式,以及将物理机转换为虚拟机。它支持热迁移、跨平台格式转换(支持VMware和Hyper-V之间虚拟机互相转换)、物理到虚拟&虚拟到虚拟、直接克隆和镜像转换。支持以下主要的虚拟磁盘格式:

VMware VMDK:适用于 VMware ESXi、VMware Workstation 等。
Hyper-V VHD/VHDX:适用于 Microsoft Hyper-V。
QCOW2:适用于 KVM。
IMG、RAW:适用于各种虚拟化环境中的自定义使用。

2.8、虚拟及磁盘镜像格式比较总览

在这里插入图片描述

三、应用

a) kvm从qemu继承了丰富的磁盘格式, 包括裸映象(raw images), 原始qemu格式(qcow), Vmware格式等;

b) kvm虚拟机默认使用raw格式的镜像格式,性能最好,速度最快,它的缺点就是不支持一些新的功能,如支持镜像,zlib磁盘压缩,AES加密等。 要使用镜像功能,磁盘格式必须为qcow2。raw格式的话,速度稍微快点,在高版本的qemu-kvm中,几乎不比qcow2的格式快,而qcow2格式节省空间,可动态增长,在公有云中广泛使用,建议使用qcow2。

c)qemu windwos安装包安装下载:https://qemu.weilnetz.de/w64/,之后添加系统变量;适用于 Windows 的 QEMU 磁盘映像实用程序。可用于各种虚拟磁盘格式的转换、创建和一致性检查。它与 Hyper-V、KVM、VMware、VirtualBox 和 Xen 虚拟化解决方案兼容。

eg1:将 QCOW2、RAW、VMDK 或 VDI 映像转换为 VHDX

qemu-img.exe convert source.img -O vhdx -o subformat=dynamic dest.vhdx

eg2:将 QCOW2、RAW、VMDK 或 VDI 映像转换为 VHD

qemu-img.exe convert source.img -O vpc -o subformat=dynamic dest.vhd

qemu-img.exe check source.qcow2  //检查磁盘一致性
qemu-img.exe info image.qcow2   //查看磁盘信息

四、附录

1)Openstack路径

在这里插入图片描述
行业更看好的路径,OpenStack走AWS甚至VMware的道路,成为基础云、原生云和未来Serverless云的支撑平台。这种情况下,它的路会很长:

在这里插入图片描述
2015年,OpenStack 社区开始使用『大帐篷』模式。该模式把OpenStack项目分成两大类:核心项目和非核心项目。核心项目只有六个,其余都是非核心项目。
在这里插入图片描述

//vSphere Client 导出的虚拟机文件很多,包含 .mf .ovf .vmdk .nvram 后缀文件,若该虚拟机挂载了个磁盘则会有 xxx-1.vmdk、xxx-2.vmdk、xxx-3.vmdk…,我们需要上传所有的;workstation可导出为导出为ovf
#上传镜像到 OpenStack:Dashboard 上 镜像 处点击 创建镜像 上传,选择 VMDK 格式并选择文件,或执行如下命令:
openstack image create "vm-image" --file /path/……/vm.vmdk --disk-format vmdk --container-format bare --public
#VMDK 转为 QCOW2 文件
qemu-img convert -f vmdk -O qcow2 /path/……/vm.vmdk /path/……/vm.qcow2
#重新上传qcow2镜像磁盘
openstack image create "vm-image" --file /path/……/vm.qcow2 --disk-format qcow2 --container-format bare --public
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羌俊恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值