前言

上篇使用漂移技术然后虚拟机在kvm集群中来去自如,让你轻轻松松管理vm。下面来聊聊什么是虚拟机的生命周期。


什么是Domain?

libvirt 的解释 :

一个 libvirt Domain 是一个运行在虚拟机器上的操作系统的实例,它可以指一个运行着的虚拟机,或者用于启动虚拟机的配置。

 

Xen 的解释:

对 Xen 来说,一个 domain 就是指一个虚拟机,其 domain 概念如下:

 玩转KVM:浅谈虚拟机life cycle_第1张图片

 

还有一些名称说明:

术语

解释

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 的状态机。方框表示状态,箭头表示使得状态变更的命令。

 玩转KVM:浅谈虚拟机life cycle_第2张图片

 从改图中可以看出,对持久性 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 .xml

 

启动一个domain

启动持久化domain

# virsh start

 

启动短暂化domain, 使用指定的 XML 建立 VM,並启动 VM

# virsh  create

 

停止或者重启(reboot)domain

停止一个运行中的 domain:

# virsh shutdown

 

重启一个持久性的 domain:

# virsh reboot

 

注意:重启一个暂时性的 domain 是不可能的,因为当它被关闭 (shutdown)后它就变成了 undefined 状态。

 

粗野的关机(inelegant shutdown),等同于直接拔电源:

# virsh destroy

 

中止(Pause)/恢复(unpause/resume)domain

使用 suspend 命令来中止一个domain:

# virsh suspend

 

使用 resume 命令来继续一个domain:

# virsh resume  

 

删除一个domain

使用virsh 的 undefine 命令来删除一个 domain:

# virsh undefine

 

重置电源状态

# virsh reset  

 

持续化保存domain状态

將 VM 状态存储到文档中,并关闭 VM

# virsh save  

 

从指定文档中将 VM 状态恢复到运行中

# virsh restore  

玩转KVM:浅谈虚拟机life cycle_第3张图片