一,KVM常用的两种磁盘格式的比较:

raw格式:

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.

raw格式是原始镜像,会直接当作一个块设备给虚拟机来使用,至于文件里面的空洞,则是由宿主机的文件系统来管理的,linux下的文件系统可以很好的支持空洞的特性。生成一个raw磁盘格式文件也很简单,dd一个file就模拟了一个raw格式的镜像。由于裸的彻底,性能上来说的话还是不错的。目前,KVM和XEN默认的格式都是raw。因为其原始,有很多原生的特性,例如直接挂载也是一件简单的事情。

qcow2格式:

qcow2 QEMU copy-on-write format with a range of special features, including the ability to take multiple snapshots, smaller images on filesystems that don't support sparse files, optional AES encryption, and optional zlib compression.

qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像。它也是可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的 raw 格式的镜像相比,有以下特性:
1,更小的空间占用,即使文件系统不支持空洞(holes);
2,支持写时拷贝(COW, copy-on-write),镜像文件只反映底层磁盘的变化;
3,支持快照(snapshot),镜像文件能够包含多个快照的历史;
4,可选择基于 zlib 的压缩方式
5,可以选择 AES 加密   

 总之,qcow2 格式的文件虽然在性能上比rRaw 格式的有一些损失(主要体现在对于文件增量上,qcow2 格式的文件为了分配 cluster 多花费了一些时间),但是 qcow2 格式的镜像比 Raw 格式文件更小,只有在虚拟机实际占用了磁盘空间时,其宿主机上的img文件才会增长,能方便的减少迁移花费的流量,更适用于云计算系统,同时,它还具有加密,压缩,以及快照等 raw 格式不具有的功能。



二,raw磁盘扩容的两种方法:(原磁盘数据不丢失)

第一种方法:

在原先raw类型的100G数据盘上动态追加70G,把虚拟机现有磁盘扩容为170G

1,在宿主机上先备份虚拟机的所有文件,防止磁盘扩容失败

2,然后开始操作

查看img文件类型:

# qemu-img info disk.local 
image: disk.local
file format: raw
virtual size: 98G (105612574720 bytes)
disk size: 98G

关闭虚拟机:

# virsh destroy instance-yq250

用dd命令给磁盘追加70G

# dd if=/dev/zero bs=1024k count=70000 >> disk.local


如果系统盘和数据盘不是同一块盘,且数据盘只有一个分区,执行如下e2fsck和resize2fs步骤:

检查磁盘上的文件系统是否有分区错误:

# e2fsck -f disk.local

扩大ext2/ext3/ext4文件系统到磁盘所有分区:

# resize2fs disk.local

如果数据盘上有多个分区或者系统只有一个磁盘镜像,不要执行e2fsck和resize2fs

如上两步骤,而是直接启动虚拟机。然后,在虚拟机执行fdisk -l查看已经追加的磁盘空间,然后根据自己实际的需要进行分区使用即可。

注:resize2fs调整分区大小的前提是你必须先将该分区umount,这台主机只有一个”/”分区,根本无法卸载!如果是正常的物理主机,你可以用liveCD挂装一个系统,然后启动resize2fs甚至PQ之类的第三方工具调整;如果虚拟机是ubuntu操作系统包含一个名为cloud-initramfs-growroot的软件,该软件可以在虚拟机启动的过程中自动扩充root分区的大小,安装完此软件包重启虚拟机系统即可

启动虚拟机:

# virsh start instance-yq250

启动之后,你会发现系统磁盘和分区都已经扩容到了170G

第二种方法:

用qemu-img命令新生成一个img文件做虚机的第二块数据磁盘使用,然后修改kvm虚拟机配置文件,把新的磁盘文件配置进去重启即可:

1,在宿主机上先备份虚拟机的所有文件,防止磁盘扩容失败

2,生成一个10G的raw格式img文件

# cd /data0/instances/instance-yq250/

# qemu-img create test.local 10G
Formatting 'test.local', fmt=raw size=10737418240 

3,关闭虚拟机

# virsh destroy instance-yq250

4,,修改虚拟机xml配置文件

# vim instance-yq250.xml

添加类似如下内容:

<disk type='file' device='disk'>
<source file='/data0/instances/instance-yq250/test.local'/>
<target dev='vdc' />
</disk>

5,启动虚拟机查看新加的磁盘

# virsh start instance-yq250

# fdisk -l
会多出如下信息:
Disk /dev/vdc: 10.7 GB, 10737418240 bytes
16 heads, 63 sectors/track, 20805 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/vdc doesn't contain a valid partition table

至此,raw磁盘格式扩容方法介绍完成。



三,KVM虚拟机qcow2磁盘格式扩容:(原磁盘数据不丢失)

第一种方法:

1,先备份kvm虚拟机镜像和配置文件等,然后关闭虚拟机

2,直接使用qemu-img命令改变磁盘容量:

如下直接追加64G磁盘空间

# qemu-img resize data.qcow2 +64G

3,启动虚拟机

virsh start instance-yq250

4,在虚拟机中查看已经磁盘大小

# fdisk -l

5,根据自己的需要重新分区或者使用resize2fs等命令扩大原来的分区使用即可

第二种方法:

和raw格式磁盘扩容的方法相同,用qumu-img生成一个qcow2的磁盘格式,在宿主机上修改虚拟机的配置文件,然后启动虚机

第三种方法:

1,先备份kvm虚拟机镜像和配置文件等,然后关闭虚拟机

2,先把qcow2格式转换为raw格式,再使用dd扩容,扩容之后再转换为qcow2格式:

# qemu-img convert -f qcow2  -O raw 
# data.raw
# qemu-img convert -f raw data.raw -O qcow2 data.qcow2

3,启动虚拟机

# virsh start instance-yq250

4,在虚拟机中查看已经磁盘大小

# fdisk -l

5,根据自己的需要重新分区或者使用resize2fs等命令扩大原来的分区使用即可