前言
上篇使用漂移技术然后虚拟机在kvm集群中来去自如,让你轻轻松松管理vm。下面来聊聊什么是虚拟机的生命周期。
什么是Domain?
libvirt 的解释 :
一个 libvirt Domain 是一个运行在虚拟机器上的操作系统的实例,它可以指一个运行着的虚拟机,或者用于启动虚拟机的配置。
Xen 的解释:
对 Xen 来说,一个 domain 就是指一个虚拟机,其 domain 概念如下:
还有一些名称说明:
术语 | 解释 |
Domain (域) | 一个运行在被虚拟化的机器上的,由 hypervisor 提供的操作系统实例 |
Hypervisor (虚机管理程序) | 一个虚拟化一个物理服务器为多个虚拟机的软件层。 |
Node (节点) | 一个物理服务器。它可能有多种类型,比如存储节点,集群节点和数据库节点等。 |
Storage Pool (存储池) | 一个存储介质的集合,比如物理硬盘驱动器的集合。一个存储池被细分为卷,卷会被分配给一个或者多个域。 |
Volume (卷) | 一个从存储池中分配出来的存储空间。一个卷可能会分配给一个或者多个域使用,并且往往被用作域内的虚拟硬盘驱动器。 |
Domain的两种形式
过渡性 Guest Domain VS 持久性 Guest Domain
Libivrt 区分两种不同类型的 domain:短暂性的(transient )和持久性的(persistent)。
· 短暂性 domain 只在 domain 被关机( shutdown) 或者所在的主机(host)被重启(restart)之前存在。
· 持久性 domain 会一直存在,直到被删除。
无论它是什么类型,当一个 domain 被创建后,它的状态可以被保存进一个文件。之后,只要该文件存在,这个 domain 的状态就可以从无限次从该文件中被恢复( restored)。因此,即使是一个短暂性的domain,它也可以被反复地恢复。
创建短暂性的 domain 与创建持久性 domain 有一点不同。对持久性domain来说,它必须在其启动前定义(define)好, 预备了domain的部件和相关配置。而短暂性虚机可以被一次性被创建和启动。操作两种类型的domain的命令也有些区别。
Domain 有什么状态?
一个 Guest domain 可能处于的状态:
Undified (未定义的):这是起始状态。这时 libvirt 不会知道 domain 的任何信息,因为这时候 domain尚未被定义或者创建。
Defined (定义了的)/ Stopped (停止的):domain 已经被定义,但是不在运行(running)。只有持久性 domains 才能处于该状态。当一个短暂性 domain 被停止或者关机时,它就不存在了。
Running (运行中的):domain 被创建而且启动了,无论是短暂性domain还是持久性domain。任何处于该状态的 domain 都已经在主机的 hypervisor 中被执行了。
Paused (中止了的):Hypervisor 上对该 domain 的运行被挂起(suspended)了。它的状态被临时保存(比如到内存中),直到它被继续(resumed)。domain 本身不知道它处于是否被中止状态。
Saved (保存了的):类似中止(Paused) 状态,除了domain 的状态被保存在持久性存储比如硬盘上。处于该状态上的 domain 可以被恢复 (restored)。
下图描述了 domain 的状态机。方框表示状态,箭头表示使得状态变更的命令。
从改图中可以看出,对持久性 domain,shtudown 命令可以将其从运行(running) 状态变为定义(defined)状态;对短暂性 domain 而言,它会从运行(running) 状态变为变为未定义(undefined) 状态。
其中还有一些被隐藏的状态:
Idle:等待 I/O,或是因为没有工作需要进行休眠中
Crashed:可能因为 QEMU process 被强制删除 or core dump 所造成了VM损坏
in shutdown: 顾名思义就是在shutdown过程中
Dying:在shutdown的过程中失败所产生的状态
Pmsuspended:透过guest OS中的电源管理功能进行suspend后进入的状态
玩转Domain各种状态
了解 VM 有這麼多狀態之後,自然就會有相對應的操作了,virsh 提供以下幾項對 VM 的操作:
定义domain,使用指定的 XML 建立 VM,但不啟動 VM
# virsh define <domain>.xml
启动一个domain
启动持久化domain
# virsh start <domain>
启动短暂化domain, 使用指定的 XML 建立 VM,並启动 VM
# virsh create <domain>
停止或者重启(reboot)domain
停止一个运行中的 domain:
# virsh shutdown <domain>
重启一个持久性的 domain:
# virsh reboot <domain>
注意:重启一个暂时性的 domain 是不可能的,因为当它被关闭 (shutdown)后它就变成了 undefined 状态。
粗野的关机(inelegant shutdown),等同于直接拔电源:
# virsh destroy <domain>
中止(Pause)/恢复(unpause/resume)domain
使用 suspend 命令来中止一个domain:
# virsh suspend <domain>
使用 resume 命令来继续一个domain:
# virsh resume <domain>
删除一个domain
使用virsh 的 undefine 命令来删除一个 domain:
# virsh undefine <domain>
重置电源状态
# virsh reset <domain>
持续化保存domain状态
將 VM 状态存储到文档中,并关闭 VM
# virsh save <domain>
从指定文档中将 VM 状态恢复到运行中
# virsh restore <domain>