怎样在KVM下关闭虚拟机的时候不删除它?

我用cloudstack+KVM创建的虚拟机,在我关闭虚拟机的时候,它会将虚拟机销毁,我现在需要在关闭的时候不销毁该虚拟机,用virsh,vnc viewer或者其他工具也能看到该虚拟机并且可以将它启动起来,请问该怎么办?
已邀请:

coder_luwy

赞同来自: ak_qq imbean

Thanks!,我已经解决了这个问题,现在和大家分享一下:
在cloudstack-4.3.0\plugins\hypervisors\kvm\src\com\cloud\hypervisor\kvm\resource\LibvirtComputingResource.java这个文件中,包含了调用libvirt的动作,需要在stopVM()方法中,将对应的dm.undefine方法注释掉即可.然后将之打包,替换到kvm机器的agent目录下的同名jar包,再重启agent即可。

coder_luwy

赞同来自: weiwei

我的是cloudstack4.3.0+kvm,这不是cloudstack的环境或者配置的问题
是我基于cloudstack开发的一个新的功能---<纳管非cloudstack创建的虚拟机>,也就是说将KVM里本来就有的虚拟机通过将数据加入cloudstack数据库后,让cloudstack进行管理的功能,因为cloudstack关闭虚拟机的时候,会将虚拟机销毁,然后在启动的时候再创建一个新的,这就导致了cloudstack关闭虚拟机后在virsh中无法看见和继续操作,因为这个虚拟机并非cloudstack创建的,所以为了安全起见,我需要一直能看见并且操作它,所以我想通过修改源代码的方式,让cloudstack在关闭虚拟机的时候,不销毁它,只是普通关闭,这样我就可以用virsh继续进行操作。

weiwei

赞同来自:

请详细描述您的问题,参考:http://ask.cloudstack-china.org/article/26

ak_qq

赞同来自:

我需要纠正你的措辞,“怎样在KVM下关闭虚拟机的时候不删除它?” “在我关闭虚拟机的时候,它会将虚拟机销毁”。
请注意:当你在cs中,把kvm虚拟机关闭时,没有删除,也没有销毁。
只是该虚拟机你在kvm主机中看不到而已。

而你不能脱离CS自行吧虚拟机启动起来。
原因如下:
在启动CS的虚拟机时,需要CS协调很多事情,查找卷,查找合适的群集和主机,准备网络等等一系列工作。
所以你不能在脱离CS的情况下,把CS创建的kvm虚拟机启动起来(其实应该也可以,需要你手动把CS需要自动协调处理的事情手动执行下,但费时费力,图啥?)。

这跟你直接使用KVM创建虚拟机有很大差别,你应该知道kvm的虚拟机会生成一个虚拟机的xml配置文件,就是根据这个配置文件启动一个个虚拟机,对吧,在CS环境下,该XML文件,是由管理端和agent端协调根据数据库信息动态生成的。
 

coder_luwy

赞同来自:

那我如果在纳管时向数据库插入的信息有问题,那么我在cloudstack中关闭后就无法将它启动起来,因为它是根据数据库来启动虚拟机的,但是这台虚拟机本身又是没有问题的,只是在cloudstack中插入的信息有问题导致无法启动,所以我需要在virsh里启动它,保证这台虚拟机不会丢失。

2020human

赞同来自:

cloudstack是调用libvirt的api createXML直接创建的虚拟机,你可以在cloudstack里面找到这个调用的地方在前面加个api defineXML 
或者直接在/etc/libvirt/hooks 下面去添加脚本去保存虚拟机的定义。
 
其实你的错误的根源是对cloudstack不熟悉,你这是头疼医头脚疼医脚的办法。你需要仔细研究为什么虚拟机不能启动解决它。

要回复问题请先登录注册