02168888812
云终端系列报道第一百十期 - RAW和QCOW2 2017-02-16

炙伦云终端分享:



RAW和QCOW2都是一种文件格式,他们经常做为虚拟机的磁盘使用,首先我们知道虚拟机是运行在物理机上的,那么物理机需要提供磁盘空间给虚拟机使用,提供的方式大致有三种:

  1. 块设备

  2. 文件系统

  3. 网络设备

块设备:物理机上提供一整块磁盘设备,或者LVM创建出的块设备如:/dev/lvm/volume1这种,虚拟机直接来使用。
文件系统:物理机提供一个文件目录,目录里的文件做为虚拟机的磁盘。
网络设备:虚拟机磁盘不存储在物理机本地,使用iscsi,rbd协议通过网络挂载到共享存储上。

RAW和QCOW2就是虚拟机使用文件系统方式做为磁盘,所使用的一种文件格式,你在物理机上看只是一个大文件,对于虚拟机就是它的整个磁盘。

RAW

(default) the raw format is a plain binary image of the disc image, and is very portable. On filesystems that support sparse files, images in this format only use the space actually used by the data recorded in them. 老牌的格式了,用一个字来说就是裸,也就是赤裸裸,你随便dd一个file就模拟了一个raw格式的镜像。由于裸的彻底,性能上来说的话还是不错的。目前来看,KVM和XEN默认的格式好像还是这个格式。因为其原始,有很多原生的特性,例如直接挂载也是一件简单的事情。 裸的好处还有就是简单,支持转换成其它格式的虚拟机镜像对裸露的它来说还是很简单的(如果其它格式需要转换,有时候还是需要它做为中间格式),空间使用来看,这个很像磁盘,使用多少就是多少(du -h看到的大小就是使用大小),但如果你要把整块磁盘都拿走的话得全盘拿了(copy镜像的时候),会比较消耗网络带宽和I/O。接下来还有个有趣的问题,如果那天你的硬盘用着用着不够用了,你咋办,在买一块盘。但raw格式的就比较犀利了,可以在原来的盘上追加空间:
dd if=/dev/zero of=zeros.raw bs=1024k count=4096(先创建4G的空间)
cat foresight.img zeros.raw > new-foresight.img(追加到原有的镜像之后)

QCOW2

qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像。它也是可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的 raw 格式的镜像相比,有以下特性:

  • 更小的空间占用,即使文件系统不支持空洞(holes);

  • 支持写时拷贝(COW, copy-on-write),镜像文件只反映底层磁盘的变化;

  • 支持快照(snapshot),镜像文件能够包含多个快照的历史;

  • 可选择基于 zlib 的压缩方式

  • 可以选择 AES 加密

对比

首先对比一下raw和qcow2。 创建一个raw磁盘,并看下它的状态





qemu-img create -f raw test-raw 100G
Formatting "test-raw", fmt=raw size=107374182400
[root@w-openstack90 /home/xusiliang]# qemu-img info test-rawimage: test-raw
file format: raw
virtual size: 100G (107374182400 bytes)
disk size: 0
[root@w-openstack90 /home/xusiliang]# stat test-raw  文件:"test-raw"  大小:107374182400   块:0          IO 块:4096   普通文件
设备:fd00h/64768d Inode:100755898   硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2016-05-26 17:25:06.832762414 +0800
最近更改:2016-05-26 17:24:53.555424916 +0800
最近改动:2016-05-26 17:24:53.555424916 +0800
创建时间:-

再创建一个qcow2文件



qemu-img create -f qcow2 test-qcow2 100G && qemu-img info  test-qcow2 && stat test-qcow2
Formatting "test-qcow2", fmt=qcow2 size=107374182400 encryption=off cluster_size=65536 lazy_refcounts=off
image: test-qcow2
file format: qcow2
virtual size: 100G (107374182400 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false  文件:"test-qcow2"  大小:198656     块:392        IO 块:4096   普通文件
设备:fd00h/64768d Inode:100755894   硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2016-05-26 17:27:24.780263164 +0800
最近更改:2016-05-26 17:27:24.762262707 +0800
最近改动:2016-05-26 17:27:24.762262707 +0800
创建时间:-


可以看出raw占用磁盘空间和块数量都是0,qcow2占用196k 392块,比raw大一些。

preallocation

预分配就是说预先将镜像所需的文件空间提供给镜像,这样文件的真实大小不再是“假”的了,对于磁盘来说这个文件真的用了这么多地址 使用df -h 或者du 也会看到真的占用了这么多空间 还可以减少文件的碎片产生,因为地址空间是连续的 raw和qcow2都支持preallocation选项,就是空间预分配。 有三个选项

  • metadata qcow2独有

  • falloc

  • full

metadata

预分配元数据,并不会真正使用磁盘空间,会初始化比较大的块,在文件增长时候提供更好的性能,创建预分配元数据的qcow2格式的镜像应该是参照了 原始的raw镜像文件的一些特点 做的一部分加快读写的优化 ,原理同raw一样,提前以空数据的方式将空间占用,而不是像普通的qcow2格式,按需递增占用 。 对比非预分配和metadata预分配,大小和block数量,metadata都有所增加,但是没有达到100G



du -csh /data/test-qcow2
196K    /data/test-qcow2
196K    总用量
[root@w-openstack90 /data]# du -csh /data/test-qcow2-metadata20M /data/test-qcow2-metadata
20M 总用量
[root@w-openstack90 /data]# stat /data/test-qcow2-metadata  文件:"/data/test-qcow2-metadata"  大小:107390828544   块:39056      IO 块:4096   普通文件
设备:fd04h/64772d Inode:198         硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2016-05-26 17:51:06.965942787 +0800
最近更改:2016-05-26 17:51:01.022803101 +0800
最近改动:2016-05-26 17:51:01.022803101 +0800
创建时间:-
[root@w-openstack90 /data]# stat /data/test-qcow2  文件:"/data/test-qcow2"  大小:198656     块:392        IO 块:4096   普通文件
设备:fd04h/64772d Inode:12601443    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2016-05-26 17:51:25.575381815 +0800
最近更改:2016-05-26 17:51:25.575381815 +0800
最近改动:2016-05-26 17:51:25.575381815 +0800
创建时间:-


falloc

可以理解为”厚置备延迟置零“,创建过程中为虚拟磁盘分配所需空间。创建时不会擦除物理设备上保留的任何数据,没有置零操作,当有IO操作时,需要等待清零操作完成后才能完成IO。 就是调用fallocate 参考http://man7.org/linux/man-pages/man2/fallocate.2.html
这样虽然在写入时候没有厚置备置零(thick)好,但是厚置备置零(thick)初始化磁盘会非常慢,而且非常耗费cpu

raw格式



qemu-img info test-raw
image: test-raw
file format: raw
virtual size: 100G (107374182400 bytes)
disk size: 100G
[root@w-openstack90 /data]# stat test-raw  文件:"test-raw"  大小:107374182400   块:209715208  IO 块:4096   普通文件
设备:fd04h/64772d Inode:12601444    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2016-05-26 18:06:01.501115617 +0800
最近更改:2016-05-26 18:05:55.032962877 +0800
最近改动:2016-05-26 18:05:55.032962877 +0800
创建时间:-
[root@w-openstack90 /data]# du -csh test-raw101G    test-raw
101G    总用量


可以看到raw是实打实占用100G

qcow2


qemu-img create -f qcow2  -o preallocation=falloc  /data/test-qcow2 100G
Formatting "/data/test-qcow2", fmt=qcow2 size=107374182400 encryption=off cluster_size=65536 preallocation="falloc" lazy_refcounts=off
[root@w-openstack90 /data]# qemu-img info test-qcow2image: test-qcow2
file format: qcow2
virtual size: 100G (107374182400 bytes)
disk size: 100G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false[root@w-openstack90 /data]# du -csh test-qcow2101G    test-qcow2
101G    总用量
[root@w-openstack90 /data]# stat test-qcow2  文件:"test-qcow2"  大小:107390828544   块:209747728  IO 块:4096   普通文件
设备:fd04h/64772d Inode:12601443    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2016-05-26 18:07:37.872463652 +0800
最近更改:2016-05-26 18:07:27.821222899 +0800
最近改动:2016-05-26 18:07:27.821222899 +0800
创建时间:-


可以看到qcow2也是实打实占用100G,而且和raw的block数目一样。
你也会看到qcow2 metadata 100G block是 39056,falloc是209715208,等于metadata预先分配了0.01%的块。

full

创建支持群集功能的厚磁盘。在创建时为虚拟磁盘分配所需的空间。并将物理设备上保留的数据置零。创建这种格式的磁盘所需的时间可能会比创建其他类型的磁盘长。

openstack相关参数

preallocate_images = none (StrOpt) VM image preallocation mode: "none" => no storage provisioning is done up front, "space" => storage is fully allocated at instance start。
参考蓝图
https://blueprints.launchpad.net/nova/+spec/preallocated-images
none 应该是啥也不做
space 就是运行fallocate ,这个应该对应是falloc

fallocate -l 8591507456 test-qcow2


转自:云技术实践

上一页:云终端系列报道第一百零九期 - ntp服务的细节全解析 下一页:云终端系列报道第一百十一期 - 如何解决磁盘空洞问题
推荐新闻 Recommended news

帮助中心
6509367