首页 理论教育 私有云中最佳虚拟硬盘选择与最优性能解析

私有云中最佳虚拟硬盘选择与最优性能解析

时间:2023-10-28 理论教育 版权反馈
【摘要】:数据在raw格式镜像中以flat方式保存,任意文件都可以raw格式打开,目前它也是性能最好的虚拟硬盘格式。以raw镜像作为qcow2的基底文件,使用qcow2作为虚拟机硬盘,是多数私有云平台中普遍采用的做法,这样在虚拟机硬盘性能和空间占用上都能获得比较满意的表现。VMWare作为虚拟化的代表厂商,其虚拟硬盘镜像格式vmdk的使用者非常多,而QEMU也对较早版本的vmdk提供支持。

私有云中最佳虚拟硬盘选择与最优性能解析

虚拟硬盘镜像是模拟器直接用作虚拟机硬盘的文件,它将内容按照一定格式进行存储,像不同的视频格式一样,不同格式的虚拟硬盘镜像的文件头、性能和特性等也不相同。某些格式的镜像文件可以使用另一个镜像文件作为基底存储,自身仅用于存储增量内容;某些格式的镜像文件可以被分割为多个子文件,这些子文件都含有其他父文件的简单信息;多数情况下不同格式的镜像之间可以互相转换,但镜像本身的空洞(一般这种镜像被称为sparse file,即稀疏文件)不一定会被保留;拷贝稀疏文件形式的镜像时,scp命令默认会对其中的空洞进行填充,即拷贝后文件占用空间即镜像定义大小,为避免拷贝此类状况我们可以使用带“sparse-file”参数的rsync,或者先对镜像进行压缩(zip、gzip)或打包(tar)再使用scp拷贝。

1.镜像格式

QEMU(2.5)支持的硬盘镜像文件格式可以分为读写访问与只读访问两种,前者可通过qemu-img命令进行创建,后者则不可。

□raw

原始硬盘格式,可选项为预分配(preallocation)。

这种格式在各种模拟器中的兼容性是最好的。数据在raw格式镜像中以flat方式保存,任意文件都可以raw格式打开,目前它也是性能最好的虚拟硬盘格式。如果镜像所在的文件系统支持空洞文件,且创建镜像时指定“preallocation=off”时,这个镜像中的扇区只有在被虚拟机真实写入内容时才会占用系统空间(可用命令“ls-ls”查看),也就是常说的Thin Provision。

另外,当使用dd命令指定来源为虚拟机系统磁盘时,则输出文件可以直接用作虚拟机镜像文件,如果将输出文件再dd到物理硬盘上也可作为物理机的系统,这也是实现P2V、V2P的一种“笨”方法。

□qcow

QEMU写时复制镜像格式,可选项有基底文件(backing_file)、加密(encryption)。

这种格式相对于raw来说,能够在不支持文件空洞的文件系统中创建Thin Provision镜像,其内容有一定压缩(zlib)。它也是QEMU中较早支持基底文件的镜像格式,主要利用了写时复制技术在新镜像中实时更新相对于基底文件的变化信息,仅将产生变化(增、删、改)的数据内容写入新镜像。

目前qcow已被qcow2替代,极少在生产环境中使用。

□qcow2

QEMU镜像格式,可选项有兼容性(compat)、基底文件(backing_file)、基底文件格式(backing_fmt)、加密(encryption)、簇大小(cluster_size)、预分配(preallocation)、懒惰引用数计量(lazy_refcounts)、禁用写时复制(nocow)。

作为qcow的升级,它能够向前兼容qcow,并且引入了一些新特性。比如用户可以更改簇的大小,从而可以根据实际应用决定镜像实际占用空间的增长速度;懒惰引用数计量功能会延迟更新新镜像中簇的引用计数等信息(元数据),以释放部分I/O占用提高其读写效率;禁用写时复制则改善了qcow2格式虚拟硬盘在Btrfs文件系统中的表现,可以使用命令“lsattr”查看文件是否具有“C”标志,有即代表写时复制已禁用;它可以进行多个硬盘快照的管理,且QEMU启动虚拟机时可以直接指定快照名。

以raw镜像作为qcow2的基底文件,使用qcow2作为虚拟机硬盘,是多数私有云平台中普遍采用的做法,这样在虚拟机硬盘性能和空间占用上都能获得比较满意的表现。当然,在实际的生产环境这种组合或许并不是最优的,我们需要结合具体应用在各种存储后端中做出选择。

□qed

QEMU Enhanced Disk,可选项有基底文件(backing_file)、基底文件格式(backing_fmt)、簇大小(cluster_size)、簇表大小(table_size)。

这种文件格式是由IBM的Stefan Hajnoczi开发,旨在改善qcow2由于数据压缩而导致的性能下降问题。虽然它不具备数据压缩和加密功能,但保留qcow2的其他先进特性,比如簇表索引、基底存储等。它是QEMU中除了raw之外性能最优的,是代替qcow2的首选格式之一。

□vdi

Virtual Box 1.1兼容镜像格式,可选项为预写元数据(static)。

较新版本的Virtual Box仍然对这种镜像格式提供支持,在QEMU它的中使用场景一般是V2V。

□vmdk

VMWare 3/4/6兼容镜像格式,可选项有基底文件(backing_file)、兼容性(compat6)、子格式(subformat)。

VMWare作为虚拟化的代表厂商,其虚拟硬盘镜像格式vmdk的使用者非常多,而QEMU也对较早版本的vmdk提供支持。

子命令有5个选项,分别是monolithicSparse(默认)、monolithicFlat、streamOptimized、twoGbMaxExtentSparse、twoGbMaxExtentFlat,前2个选项的区别在于是否使用单独的镜像描述文件(类似qcow2的簇表),第3个选项会压缩镜像中的空洞文件,而最后2个选项则会在前2个的基础上,将镜像按照2Gb为单位分割成多个子文件。使用单独镜像描述文件与镜像文件分割的好处是使其复制时的便利性,比如用户可以文本方式直接查看硬盘信息、拷贝镜像文件中断后直只需继续从被中断的子文件开始。但是对于大文件来说,镜像文件分割可能会降低其性能。

与vdi格式类似,在QEMU中它的使用场景同样以V2V居多。

□vpc

Windows Virtual PC兼容镜像格式,也称为vhd,可选项为子格式(subformat)。

由微软开发的虚拟机硬盘镜像格式,子格式有动态(dynamic)和固定(fixed)两种可选项,区别类似于Thin Provision模式的raw和默认模式的qcow。

□vhdx(www.xing528.com)

Hyper V兼容镜像格式,可选项有子格式(subformat)、块状态(block_state_zero)、块大小(block_size)、日志大小(log_size)。

微软的Hyper-V虽然起步较晚,但仍存在较广泛的群众基础。子格式同vpc一样具有两个可选参数;块状态是指初始化时是否对其中的数据块写入“0”,如果设置为“off”,则模拟器(QEMU)对这些块状态的访问会得到任意返回值;块大小类似于其他镜像格式的簇大小,值的范围从1MB到256MB;日志大小即镜像文件中日志段长度的最大值,通常是1MB。

□bochs、cloop、dmg、parallels

QEMU中对某些压缩镜像文件也提供只读支持,目前有bochs(同名x86模拟器)硬盘镜像、压缩回环镜像(compressed loop device,一种文件压缩格式)、苹果硬盘镜像(用于存储系统文件、应用程序的一种压缩文件)、Parallels Desktop(Mac OS系统独占的x86模拟器)硬盘镜像。

2.使用示例

普通的QEMU的虚拟硬盘文件及其不同存储方式都可以通过qemu-img命令进行操作,笔者接下来对QEMU(2.5版本)中的qemu-img命令以及QEMU挂载硬盘驱动的方法进行介绍。

□qemu-img

命令qemu-img操作主要针对离线镜像,包括创建、校验、转换、快照等,详细内容可参考“man qemu-img”,接下来我们以镜像的完整生命周期活动进行演示。

首先分别创建(命令为“qemu-img create”)格式分别为raw和qcow2的两个镜像,指定raw格式的预分配参数、qcow2的簇大小为2MB,且后者以前者作为基底文件,创建完成以后使用“qemu-img map”查看基底镜像映射关系:

镜像文件创建以后,如果需要针对特定场景对其进行修改,可以使用“resize”、“am end”、“convert”子命令分别修改其大小、参数、格式(后面的操作已跳过此步骤)。

相关链接

硬盘大小变更后需要修改文件系统信息

使用qemu-img命令改变镜像定义大小以后,我们仍需要在虚拟机操作系统中修改分区信息以识别添加的空间。在Windows虚拟机中可以使用自带的硬盘管理,或者第三方的PartionDoctor、ParagonFS等;在Linux虚拟机中则可以使用fdisk、LVM、resize2fs、libguestfs等。

我们使用rsync拷贝qcow2镜像,并保留其中的文件空洞。

然后我们使用dd命令破坏qcow2镜像完整,再使用“qemu-img check”对其进行修复:

接下来我们创建hdb.raw,对其进行格式化,再以块设备形式挂载到/mnt目录并写入数据,使用“qemu-img compare”对比它与hda.raw,其中会使用到loop设备进行挂载操作,读者也可以参考下一小节使用qemu-nbd。

然后我们尝试镜像内嵌快照的离线操作“qemu-img snapshot”,包括创建、删除、回滚等。

接下来我们针对含基底文件的镜像进行一些相对不常用的操作,这些子命令有改变镜像基底(rebase)、提交(commit)。

现在hda.qcow2是以hda.raw作为基底文件,由于其镜像元数据记录的是hda.raw的相对路径(或绝对路径),所以如果hda.raw的存储位置发生变化,hda.qcow2将不可用,此时则需要使用rebase操作。

提交操作即是将hda.qcow2的内容合并到hda.raw中,一般在私有云平台中用于制作“基于模板的模板”。

□后端存储

QEMU可以使用多种存储后端,基本格式一般有“qemu-kvm-hda hda.qcow2”或者“qemu-kvm-drive file=hda.qcow2,format=qcow2”两种,使用驱动器选项的后者相对前者拥有更丰富可选参数,所以应用场景更为广泛。

驱动器的常用选项已经在第四章有所介绍,接下来笔者将对这些选项的参数予以详细说明。

将本地虚拟硬盘文件hda.qcow2、hdb.qcow2分别当做总线上的第1、2个硬盘,光盘镜像文件CentOS.iso启动顺序为第一个,命令如下:

其中hda.qcow2中添加了“snapshot=on”,则对此硬盘的所有写入内容均会被保存至临时文件中,在QEMU控制台进行提交操作(或者串口控制台按Ctrl+a s)会将临时文件内容写回至hda.qcow2;不同的接口会使用不同的驱动,比如virtio接口在Linux虚拟机中表示为vdX;选项中的“readonly”,代表此硬盘为只读模式,虚拟机内所有应用程序对此硬盘的写操作将直接报错。

硬盘性能优化可以考虑从接口(if)、缓存策略(cache)、异步I/O(aio)的参数入手,其他选项相对影响较小。

□其他后端

如果使用其他形式的存储后端,一般只需要在file中添加对应的协议即可,比如:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈