原创,转载请务必注明出处及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%一致。