一、KVM磁盘镜像格式介绍:
1、raw
Raw 磁盘映像格式(默认)。这个格式的优点是可以简单、容易地导出到其它模拟器中。如果您的文件系统支持中断(例如在 Linux 中的 ext2 或者 ext3 以及 Windows 中的 NTFS),那么只有写入的字段会占用空间。使用 qemu-img info 了解 Unix/Linux 中映像或者 ls -ls 使用的实际大小。
QEMU 映像格式,最万能的格式。使用它可获得较小映像(如果您的系统不支持中断,例如在 Windows 中,它会很有用)、额外的 AES 加密法、zlib 压缩以及对多 VM 快照的支持。目前也是虚拟池一直在使用的镜像格式。
例如:
转换之前,原镜像disk size大小为8G,转换后仅仅只有2.3G。
3、qcow
旧的 QEMU 映像格式。只用于与旧版本兼容,目前虚拟池已无该格式镜像文件。
4、cow
写入映像格式的用户模式 Linux 副本。包含 cow 格式的目的只是为了与前面的版本兼容。它无法在 Windows 中使用,虚拟池已无该格式镜像文件。
5、vmdk
VMware 3 和 4 兼容映像格式,虚拟池无该格式镜像文件,VMware的格式,这个格式说的蛋疼一点就有点牛X,原本VMware就是做虚拟化起家,自己做了一个集群的VMDK的pool,做了自己的虚拟机镜像格式。
6、cloop
Linux 压缩回送映像,只有在重复使用直接压缩的 CD-ROM 映像时有用,比如在 Knoppix CD-ROM 中。
kvm虚拟机中需要选择磁盘镜像的格式,通常的选择有两种,一种是raw镜像格式,一种是qcow2格式。
raw格式是原始镜像,会直接当作一个块设备给虚拟机来使用,至于文件里面的空洞,则是由宿主机的文件系统来管理的,linux下的文件系统可以很好的支 持空洞的特性,所以,如果你创建了一个100G的raw格式的文件,ls看的时候,可以看到这个文件是100G的,但是用du 来看,这个文件会很小。
qcow2是kvm支持的磁盘镜像格式,我们创建一个100G的qcow2磁盘之后,无论用ls来看,还是du来看,都是很小的。这说明了,qcow2本身会记录一些内部块分配的信息的。
无论哪种格式,磁盘的利用率来说,都是一样的,因为实际占用的块数量都是一样的。但是raw的虚拟机会比qcow2的虚拟机IO效率高一些,实际测试的时候会比qcow2高25%,这个性能的差异还是不小的,所以追求性能的同学建议选raw。
raw唯一的缺点在于,ls看起来很大,在scp的时候,这会消耗很多的网络IO,而tar这么大的文件,也是很耗时间跟CPU的,一个解决方法是,把raw转换成qcow2的格式,对空间压缩就很大了。而且速度很快。转换命令如下:
qemu-img convert -O qcow2 disk.raw disk.qcow2
qemu-img convert -O raw disk.qcow2 disk.raw
这样转换所消耗的时间远比tar.gz小。
应该是qemu-img会直接读取文件的元数据,而tar只会傻傻的跟操作系统要文件数据的关系吧^_^
二、qemu-img命令详解
qemu-img是QEMU的磁盘管理工具,在qemu-kvm源码编译后就会默认编译好qemu-img这个二进制文件。qemu-img也是QEMU/KVM使用过程中一个比较重要的工具,本节对其用法和实践使用方法进行介绍。
qemu-img工具的命令行基本用法如下:
qemu-img command [command options]
它支持的命令分为如下几种:
(1)check [-f fmt] filename
对磁盘镜像文件进行一致性检查,查找镜像文件中的错误,目前仅支持对“qcow2”、“qed”、“vdi”格式文件的检查。其中,qcow2是QEMU 0.8.3版本引入的镜像文件格式,也是目前使用最广泛的格式。qed(QEMU enhanced disk)是从QEMU 0.14版开始加入的增强磁盘文件格式,为了避免qcow2格式的一些缺点,也为了提高性能,不过目前还不够成熟。而vdi(Virtual Disk Image)是Oracle的VirtualBox虚拟机中的存储格式。参数-f fmt是指定文件的格式,如果不指定格式qemu-img会自动检测,filename是磁盘镜像文件的名称(包括路径)。
(2)create [-f fmt] [-o options] filename [size]
创建一个格式为fmt大小为size文件名为filename的镜像文件。根据文件格式fmt的不同,还可以添加一个或多个选项(options)来附加对该文件的各种功能设置,可以使用“-o ?”来查询某种格式文件支持那些选项,在“-o”选项中各个选项用逗号来分隔。
如果“-o”选项中使用了backing_file这个选项来指定其后端镜像文件,那么这个创建的镜像文件仅记录与后端镜像文件的差异部分。后端镜像文件不会被修改,除非在QEMU monitor中使用“commit”命令或者使用“qemu-img commit”命令去手动提交这些改动。这种情况下,size参数不是必须需的,其值默认为后端镜像文件的大小。另外,直接使用“-b backfile”参数也与“-o backing_file=backfile”效果相同。
size选项用于指定镜像文件的大小,其默认单位是字节(bytes),也可以支持k(或K)、M、G、T来分别表示KB、MB、GB、TB大小。另外,镜像文件的大小(size)也并非必须写在命令的最后,它也可以被写在“-o”选项中作为其中一个选项。
对create命令的演示如下所示,其中包括查询qcow2格式支持的选项、创建有backing_file的qcow2格式的镜像文件、创建没有backing_file的10GB大小的qcow2格式的镜像文件。
(3)commit [-f fmt] filename
提交filename文件中的更改到后端支持镜像文件(创建时通过backing_file指定的)中去。
(4)convert [-c] [-f fmt] [-O output_fmt] [-o options] filename [filename2 [...]] output_filename
将fmt格式的filename镜像文件根据options选项转换为格式为output_fmt的名为output_filename的镜像文件。它支持不同格式的镜像文件之间的转换,比如可以用VMware用的vmdk格式文件转换为qcow2文件,这对从其他虚拟化方案转移到KVM上的用户非常有用。一般来说,输入文件格式fmt由qemu-img工具自动检测到,而输出文件格式output_fmt根据自己需要来指定,默认会被转换为与raw文件格式(且默认使用稀疏文件的方式存储以节省存储空间)。
其中,“-c”参数是对输出的镜像文件进行压缩,不过只有qcow2和qcow格式的镜像文件才支持压缩,而且这种压缩是只读的,如果压缩的扇区被重写,则会被重写为未压缩的数据。同样可以使用“-o options”来指定各种选项,如:后端镜像、文件大小、是否加密等等。使用backing_file选项来指定后端镜像,让生成的文件是copy-on-write的增量文件,这时必须让转换命令中指定的后端镜像与输入文件的后端镜像的内容是相同的,尽管它们各自后端镜像的目录、格式可能不同。
如果使用qcow2、qcow、cow等作为输出文件格式来转换raw格式的镜像文件(非稀疏文件格式),镜像转换还可以起到将镜像文件转化为更小的镜像,因为它可以将空的扇区删除使之在生成的输出文件中并不存在。
下面的命令行演示了两个转换:将VMware的vmdk格式镜像转换为KVM可以使用的qcow2镜像,将一个raw镜像文件转化为qcow2格式的镜像。
[root@jay-linux kvm_demo]# qemu-img convert my-vmware.vmdk my-kvm.img
(此处并无实际存在vmdk文件,仅演示其命令行操作)
[root@jay-linux kvm_demo]# qemu-img convert -O qcow2 rhel6u3.img rhel6u3-a.img
(5)info [-f fmt] filename
展示filename镜像文件的信息。如果文件是使用稀疏文件的存储方式,也会显示出它的本来分配的大小以及实际已占用的磁盘空间大小。如果文件中存放有客户机快照,快照的信息也会被显示出来。下面的命令行演示了前面进行文件转换的输入、输出文件的信息。
(6)snapshot [-l | -a snapshot | -c snapshot | -d snapshot] filename
“-l” 选项是查询并列出镜像文件中的所有快照,“-a snapshot”是让镜像文件使用某个快照,“-c snapshot”是创建一个快照,“-d”是删除一个快照。
(7)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”参数来指定的,这种模式主要用于将后端镜像进行了重命名或者移动了位置之后对前端镜像文件的修复处理,由用户去保证后端镜像的一致性。
(8)resize filename [+ | -]size
改变镜像文件的大小,使其不同于创建之时的大小。“+”和“-”分别表示增加和减少镜像文件的大小,而size也是支持K、M、G、T等单位的使用。缩小镜像的大小之前,需要在客户机中保证里面的文件系统有空余空间,否则会数据丢失,另外,qcow2格式文件不支持缩小镜像的操作。在增加了镜像文件大小后,也需启动客户机到里面去应用“fdisk”、“parted”等分区工具进行相应的操作才能真正让客户机使用到增加后的镜像空间。不过使用resize命令时需要小心(最好做好备份),如果失败的话,可能会导致镜像文件无法正常使用而造成数据丢失。
如下命令行演示了两个镜像的大小改变:将一个1GB的raw镜像增加2GB的空间,也将一个3GB大小的qcow2镜像减少1G空间
三、KVM中使用LVM快照技术
在安装虚拟机的过程当中我们使用lvm逻辑卷作为kvm虚拟机的硬盘,这样才能使用LVM的快照功能:
1、为原虚拟机所在的lv做一个快照。
lvcreate -L 2G -sn kvmSS /dev/vg/kvm (一般快照大小是宿主的15-20%)
2、复制/etc/libvirt/qemu/虚拟机名.xml并改名为/etc/libvirt/qemu/虚拟机名1.xml
cp /etc/libvirt/qemu/虚拟机名.xml /etc/libvirt/qemu/虚拟机名1.xml
3、修改 /etc/libvirt/qemu/虚拟机名1.xml
vim /etc/libvirt/qemu/虚拟机1.xml (修改一下几项,随便改只要与原来不一样就可以了。)比如:
<name>1kvmSS</name>
<uuid>395ae05e-c118-e460-4de4-7f58e08f8aa1</uuid>
<source dev=‘虚拟机快照名’>
<mac address='52:54:00:a7:11:cb'/>
4、virsh define 虚拟机名1.xml (定义虚拟机)
5、virsh start 虚拟机名1 (新的虚拟机就可以使用啦。呵呵)