本文主要参考(翻译)自 OpenStack 官方文档 VMState、Virtual Machine States and Transitions,以及简要说明一下其在 Nova 代码中的体现。
虚拟机状态
对于每个虚拟机而言,它都有 3 种状态,vm_state、task_state 以及 power_state。它们之间非常容易混淆。不过官方文档 VMState 简明扼要地区别了它们:
- power_state 是虚拟机在 Hypervisor 上的状态,从计算节点从下而上(bottom-up)传递,如 RUNNING
- vm_state 反应了基于 API 调用的一种稳定状态,如 ACTIVE
- task_state 反应了 API 调用过程中的过渡状态,如 SCHEDULING
power_state
power_state 应该通过调用虚拟机的 virt 驱动来获得。Hypervisor 上虚拟机的状态是最权威的,而数据库中的 power_state 只是(最近)过去状态的一个快照。这个状态会周期性更新,而且应该在每一个会影响 power_state 的任务(task)结束时更新。
如何更新
从计算节点从下而上(bottom-up)传递,覆写数据库中相应的字段。这可能会触发跟 vm_state 的一致性协调,见下文 vm_state。命名规范
取决于 Libvirt 返回的状态已废弃状态
- BLOCKED:本质上是 RUNNING
- SHUTOFF:对应到 SHUTDOWN
- FAILED:对应到 NOSTATE