首页 > 代码库 > KVM的driver_mirror功能相关实验

KVM的driver_mirror功能相关实验

原创,转载请务必注明出处及URL,谢谢!


早前做的一些KVM功能相关的实验,分享一下。

mirror相关实验1【mirror功能基本测试】:
vm运行时,执行镜像操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘drive_mirror -f xxxblock_device  /data/xxxxxx-mirror.img‘

查看完成状态:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘info block-jobs‘ 

在mirror镜像过程中,vnc、ssh、console连接到vmxxxxxxx,执行一些touch文件、创建目录、删除目录、dd写入数据的操作

当mirror-img的大小与原大小相同时,执行取消mirro操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘block_job_cancel xxxblock_device‘

以上过程完成后,使用/data/xxxxxx-mirror.img创建虚拟机,进入新创建的虚拟机,查看mirror创建过程中的文件目录创建、删除、写入操作是否被同步。

实验结论:
mirror过程中关于文件、目录的创建、删除、写入操作均被同步的保存到新创建的mirror-img中。


mirror相关实验2【mirror过程中踢出存储服务】:
host1: 开启nfs服务,设置共享路径为/data/mirror
host2:  mount挂载host1的nfs共享存储路径到本地的 /data/mirror

再host2上vm运行时,执行镜像操作,mirror-img保存到/data/mirror路径下:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘drive_mirror -f xxxblock_device  /data/mirror/xxxxxx-mirror.img‘

查看完成状态:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘info block-jobs‘ 

在mirror镜像过程中,在host1中执行service nfs stop服务,将nfs共享存储断开

在host2上多次执行查看mirror状态的操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘info block-jobs‘
mirror镜像状态保持停止

连接到vmxxxxxxx,执行一些touch文件、创建目录、删除目录、dd写入数据的操作

在host1中执行service nfs start服务,将nfs共享存储开启

在host2上多次执行查看mirror状态的操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘info block-jobs‘
mirror镜像状态从停止状态(持续了一段时间)变成进行状态

查看完成状态,直到mirror-img的大小与原大小相同时,执行取消mirro操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘block_job_cancel xxxblock_device‘

以上过程完成后,使用/data/xxxxxx-mirror.img创建虚拟机,进入新创建的虚拟机,查看mirror创建过程中的文件目录创建、删除、写入操作是否被同步。

实验结论:
mirror过程可以被中断,mirror过程中关于文件、目录的创建、删除、写入操作均被同步的保存到新创建的mirror-img中。

stop/commit相关实验1【stop状态下执行commit操作的对象】:

vm运行时,执行如下操作挂起:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘stop‘

查看vm的系统镜像:
ll /data/kvm/disk.img

查看vm系统镜像的back文件路径:
qemu-img info /data/kvm/disk.img

查看back文件的信息:
ll /data/kvm/base/base.img

对块设备做commit操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘commit xxxblock_device‘

完成后,查看vm的系统镜像:
ll /data/kvm/disk.img

查看back文件的信息:
ll /data/kvm/base/base.img

实验结论:
stop状态下可以对block_device做commit操作,commit操作将vm系统中的产生的数据刷新到base文件中。


mirror相关实验3【block_job_complete操作(运行时切换vm系统镜像)】:

vm运行时,执行镜像操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘drive_mirror -f xxxblock_device  /data/xxxxxx-mirror.img‘

查看完成状态:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘info block-jobs‘ 


执行如下动作挂起vm:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘stop‘

当mirror-img的大小与原大小相同时,执行complete操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘block_job_complete xxxblock_device‘

执行如下动作取消vm挂起:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘c‘

查看block-jobs,已经没有活动的job:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘info block-jobs‘

执行如下命令,查看block的信息,vm的系统镜像仍指向原镜像
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘info block‘

查看虚拟机镜像文件及mirro生成文件:
ll /data/

连接vm,进入后执行一个dd写入操作:
dd if=/dev/vda  of=test.img bs=1MB count=512

查看虚拟机镜像文件及mirro生成文件:
ll /data/

可以看到,vm的原系统镜像大小没有发生变化,但mirror镜像大小增加了512MB既,block_job_complete操作实际上切换了vm的系统镜像。


vm中执行shutdown操作

删除刚创建的镜像
rm -f /data/xxxxxx-mirror.img

再次运行vm,执行镜像操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘drive_mirror -f xxxblock_device  /data/xxxxxx-mirror.img‘

当mirror-img的大小与原大小相同时,执行complete操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘block_job_complete xxxblock_device‘

查看block-jobs,已经没有活动的job:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘info block-jobs‘

执行如下命令,查看block的信息,vm的系统镜像仍指向原镜像
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘info block‘

查看虚拟机镜像文件及mirro生成文件:
ll /data/

连接vm,进入后执行一个dd写入操作:
dd if=/dev/vda  of=test.img bs=1MB count=512

vm中执行shutdown操作:

查看虚拟机镜像文件及mirro生成文件:
ll /data/

可以看到,vm的原系统镜像大小没有发生变化,但mirror镜像大小增加了512MB既,block_job_complete操作实际上切换了vm的系统镜像。


实验结论:
无论是否对vm做挂起操作,block_job_complete操作均会切换vm的系统镜像到新生成的mirror镜像



mirror相关实验4【执行两次drive_mirror和block_job_complete操作】:
继续上一次的实验环境

再次执行镜像操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘drive_mirror -f xxxblock_device  /data/mirror-xxxxxx-mirror.img‘

完成后,查看虚拟机镜像文件及mirro生成文件:
ll /data/

可以看到新生成的镜像文件与上一次执行的生成的mirror镜像文件大小相同,既镜像的是切换后的镜像文件。

再次执行complete操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘block_job_complete xxxblock_device‘

查看虚拟机镜像文件及mirro生成文件:
ll /data/

连接vm,进入后执行一个dd写入操作:
dd if=/dev/vda  of=test__0000.img bs=1MB count=512

vm中执行reboot操作:

查看虚拟机镜像文件及mirro生成文件:
ll /data/

可以看到,vm的原系统镜像大小没有发生变化,第一次mirror生成的镜像大小也没有发生变化,第二次mirro镜像大小增加了512MB

实验结论:
可以连续的执行block_job_complete操作,连续切换系统镜像。


mirror相关实验5【block_job_complete操作后,物理上移除原系统镜像】

vm运行时,执行镜像操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘drive_mirror -f xxxblock_device  /data/xxxxxx-mirror.img‘

查看完成状态:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘info block-jobs‘ 

当mirror-img的大小与原大小相同时,执行complete操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘block_job_complete xxxblock_device‘

执行mv操作将vm系统镜像文件mv到另外一个文件系统

实验结论:
block_job_complete操作后可以物理上移除原系统镜像


mirror相关实验6【mirror使用-n参数】

centso6.2的基础镜像base.img

qemu-img create -f qcow2 -o  backing_file=/data/kvm/base.img  /data/kvm/centos6.2-qcow2.img
qemu-img create -f qcow2 -o  backing_file=/data/kvm/base.img  /data/kvm/mirror-centos6.2.img

vm使用centos6.2-qcow2.img 为系统镜像,启动vm

进入vm,做写入操作:
dd if=/dev/vda of=test.img bs=1MB count=1024

在host上查看写入的情况, centos6.2-qcow2.img不断增长:
ll /data/kvm

host上执行镜像操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘drive_mirror -n xxxblock_device  /data/kvm/mirror-centos6.2.img‘

在host上查看写入的情况, mirror-centos6.2.img不断增长:
ll /data/kvm

查看完成状态:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘info block-jobs‘ 

在mirror镜像过程中,vnc、ssh、console连接到vmxxxxxxx,执行一些touch文件、创建目录、删除目录的操作

当mirror-img的大小与原大小相同时,执行取消mirro操作:
virsh qemu-monitor-command --hmp vmxxxxxxx  ‘block_job_cancel xxxblock_device‘

以上过程完成后,使用mirror-centos6.2.img创建虚拟机,进入新创建的虚拟机,查看mirror创建过程中的文件目录创建、删除、写入操作是否被同步。

实验结论:
mirror过程中关于文件、目录的创建、删除、写入操作均被同步的保存到新创建的mirror-centos6.2.img。
使用-n参数方法并以base.img镜像为基础,可以保证使用mirror功能保存尽可能少的数据,并以最快的速度创建mirror镜像。


总结:
    1》以上实验,基本验证了使用mirror功能做快照的可行性,同时,针对系统盘和数据盘可采用不同的参数来进行快照,保证可用性。
    2》对于qemu-kvm的drive,当指定cache为none模式时,理论上用户系统只要做了写入磁盘操作,均会被同步的写入到镜像文件中,但对于用户系统中没有落入磁盘的文件系统/数据修改,该方法不能保证数据的一致性。
    3》在不对用户系统做挂起操作的情况下,目前没有手段可以保证数据100%一致。

KVM的driver_mirror功能相关实验