2009年的印象:

曾经有过一段时间,徘徊于对虚拟机硬盘格式的迷惑中,2009年,终于得出了一些结论(下面的思路基本通用于其他虚拟机)

搜了下,发现大部分用qemu或者kvm的,都默认使用qcow2来作为虚拟硬盘,但qemu官方默认是用raw。

下面是qemu wiki对两种格式的描述:

raw Raw disk image format (default). This format has the advantage of being simple and easily exportable to all other emulators. If your file system supports holes (for example in ext2 or ext3 on Linux or NTFS on Windows), then only the written sectors will reserve space. Use qemu-img info to know the real size used by the image or ls -ls on Unix/Linux.

qcow2 QEMU image format, the most versatile format. Use it to have smaller images (useful if your filesystem does not supports holes, for example on Windows), optional AES encryption, zlib based compression and support of multiple VM snapshots.

raw的优势(能找到的相关资料太少,不知道是不是理解有误):

  1. 简单,并能够导出为其他虚拟机的虚拟硬盘格式
  2. 根据实际使用量来占用空间使用量,而非原先设定的最大值(比如设定最高20G,而实际只使用3G)。——需要宿主分区支持 散戳(随机取位 hole)(比如ext2 ext3 ntfs等)
  3. 以后能够改变空间最大值(把最高值20G提高到200G,qcow2也可以,不过要先转为raw)
  4. 能够直接被宿主机挂载,不用开虚拟机即可在宿主和虚拟机间进行数据传输(注意,此时虚拟机不要开)
  5. 性能优越:根据fedora12的wiki,说测试结果是raw比qcow2性能更好,即使是新版的qcow2。

而qcow2的优势:

  1. 更小的虚拟硬盘空间(尤其是宿主分区不支持hole的情况下,比如win fat32)
  2. 加密,压缩,快照。

如果单纯靠这些信息,那么raw好像更有优势,而且更方便。

那么,为什么大家都默认使用qcow2呢?为什么?

同样的,还有vmdk vdi等虚拟机硬盘格式的优劣表现在哪方面呢?

又看到一个资料,说raw 格式是一种”直读直写”的格式,不具备特殊的特性。也就是说,qcow2具备的这四个特性:加密,压缩,快照,旧文件系统强化,raw就没有。

2010年更新:

更进一步认识,并修正上面的看法。

但今天(2010年)再回过头来看,发现其实raw更好: raw相比qcow2就缺乏的四个功能,但都能通过别的方式解决:

  1. 加密功能:把raw本身就当普通文件加密之搞定
  2. 快照功能:把raw放在具备 磁盘版本管理(比如zfs)磁盘系统 中,具体需要的设置可能稍微有点多。
  3. 硬盘压缩:就当普通电脑文件压缩之即可
  4. 宿主机不支持按需扩张模式(hole:打孔机时代的术语):这个可以一开始不要设太大,后面自己可根据使用情况来扩展raw的最大值。而且,2010后的新文件系统,几乎都已经支持hole

而raw有qcow2所无法媲美的功能:

  1. 效率高于qcow2
  2. 直接读写虚拟机硬盘里面的文件,这比较“暴力”,但既然可以这么暴力,那么也就不怕虚拟机出任何问题了。
  3. 通用性好,是转为其他虚拟机的格式的通用中间格式,这样就不用担心转换虚拟机系统了。

补充一:

raw在生产环境下也这么好?并非如此!!!

因为 raw的绝大部分优势,都是基于 虚拟机关机状态的: 比如:直接挂载,转换格式,改空间最大值,都是需要关机状态; 比如 加密,快照,压缩,更是需要 随时关机。(虽然不关机也可以,但这方面并没有经过多少验证,安全性稳定性如何存疑。)

而生产环境大都需要的是:在线方式实现/不关机就可搞定(即使是硬盘分区之类底层操作,所以才会发展出lvm之类的东东)。因此,在生产环境下无法发挥其优势。

总之,如果要 在线 具备更高级的硬盘特性/稳定性/有保障的品质追求,那么raw可能不是个好选择。

补充2:

qemu可支持的类型,比较全面,默认是raw。

2015更新

qcow2的快照,如果是状态快照,raw格式需要复制内存中的raw状态,才可实现 状态快照。