【Ovirt 笔记】出现 external VM 情况分析
2017-04-25 本文已影响5人
58bc06151329
分析整理的版本为 Ovirt 3.4.5 版本。
出现场景:
- 一般出现在迁移过程中,迁移接近完成时,在源主机上准备删除对应的 .recovery 文件,此时主机上出现重启,或者断电等,导致 vdsm 上的 .recovery 文件没有删除。
- 但是尝试直接拷贝 .recovery 到另一台主机上,没有出现 externalVm 情况。
- 另一种情况是,强制删除数据中心,主机挂到另外的数据中心中,主机上还有运行的 vm,并没有关掉,此时也会出现对应的 externalVm。
实现原理
- 定时执行 VdsUpdateRunTimeInfo
- 变量 _runningVms:通过 List 或者 getAllVmStats 获取 vdsm 上运行的 VM。
- 变量 _vmDict:数据库的 VM,需要运行在指定的主机上。
- 变量 _externalVmsToAdd 记录 external 的 VM。
- 追踪 vm 状态 的线程会定时执行方法:refreshVmStats。
调用 processExternallyManagedVms 方法。
- 首先遍历 _runningVms,根据 id 在 vm_Dict 中查找,如果没有查找到,则接着在数据库中在 query 一次,还是没有就加入到 vmsToQuery 队列 。
- 而后通过带参数的 list(String isFull, String[] vmIds),查询 vmsToQuery 队列中 vm 列表的详细信息。
- 根据返回信息值,组装新的 vmStatic 对象,而后加入到 _externalVmsToAdd 列表 。
- 最后在 saveDataToDb 方法中,通过 AddVmFromScratchCommand 将这些虚拟机加入到数据库中。
解决方案
- 删除主机上的 QEMU 进程。
- 删除对应 ID 的 externalVm .recovery 文件。
- 然后在 engine 界面上删除 external 虚拟机。