[译] libvirt 虚机的生命周期 (Libvirt Virtual Machine Lifecycle)
1. 概念
先补充一下 Domain(域)、Virutal Machine(虚机)和 Guest OS (客户机操作系统)三个术语的区别。这三个概念经常被相互使用,其实它们之间还是有些区别。
Oracel 的解释 (资料来源):
- Domain:资源的一个可配置集合,包括内存,虚拟CPU,网络设备和磁盘设备。在 Domain 中运行(多个)虚拟机。一个 Domain 被分配虚拟资源,可以独立地被启动、停止和重启。
- Guest OS:运行在 domain 中的虚拟操作系统。一个 Guest OS 可以是部分虚拟化或者硬件虚拟化的。一个 Hypervisor上可以运行多个 Guest OS。
- VM:Guest OS + 它相关的应用软件。
libvirt 的解释 (资料来源):
一个 libvirt Domain 是一个运行在虚拟机器上的操作系统的实例,它可以指一个运行着的虚拟机,或者用于启动虚拟机的配置。
Xen 的解释(资料来源):
对 Xen 来说,一个 domain 就是指一个虚拟机,其 domain 概念如下:

好吧,这些说法还是有细微差别,下文中的 Domain 就当是虚拟机吧。其它术语:
|
术语
|
解释
|
|---|---|
|
Domain 域
|
一个运行在被虚拟化的机器上的,由 hypervisor 提供的操作系统实例
|
|
Hypervisor 虚机管理程序
|
一个虚拟化一个物理服务器为多个虚拟机的软件层。
|
|
Node 节点
|
一个物理服务器。它可能有多种类型,比如存储节点,集群节点和数据库节点等。
|
|
Storage Pool 存储池
|
一个存储介质的集合,比如物理硬盘驱动器的集合。一个存储池被细分为卷,卷会被分配给一个或者多个域。
|
|
Volume 卷
|
一个从存储池中分配出来的存储空间。一个卷可能会分配给一个或者多个域使用,并且往往被用作域内的虚拟硬盘驱动器。
|
1.1 XML 描述
比如,domain 中的设备使用 XML 元素 来表示其被分配的属性和子元素的一个示例如下:
<domain type='qemu'>
<name>demo</name>
...
<devices>
...
<disk type='file' device='disk'> ... </disk>
<disk type='file' device='cdrom'> ... </disk>
<input type='mouse' bus='ps2'/>
...
</devices>
</domain>
1.2. 过渡性 Guest Domain VS 持久性 Guest Domain
Libivrt 区分两种不同类型的 domain:短暂性的(transient )和持久性的(persistent)。
- 短暂性 domain 只在 domain 被关机( shutdown) 或者所在的主机(host)被重启(restart)之前存在。
- 持久性 domain 会一直存在,直到被删除。
1.3 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)。

1.4 快照
一个快照是虚机的操作系统和它的所有应用(applications )在某个时刻的视图。在虚拟化领域,提供可以被恢复的虚机快照是个非常基本的功能。快照允许用户保存虚机在某个时刻的状态,然后在将来某个时候回滚到该状态。基本的用例包括,创建快照、安装新的应用、更新或者升级,然后回滚到之前的某个时间点。显然,在快照生成之后发生的任何操作都不会包含在快照中。一个快照不会持续更新。它只表示虚机的某个时间上的状态。
1.5 迁移
一个运行中的 domain 或者虚机可以被迁移到另一个主机上,只要虚机的存储是在主机之间共享的,并且目标主机的CPU能够支持虚机的CPU模式。根据类型和应用,虚机迁移可以不导致虚机上运行的服务的中断。
- Standard (标准模式):该模式下,一个 domain 的资源在从源主机迁移到目标主机时,它会处于被挂起(suspended)状态。迁移结束后,虚机在新的主机上继续运行。迁移所花的时间和 domain 的内存大小直接相关。
- Live vs non-live(实时 VS 非实时模式):当使用实时迁移模式时,domain 不会被中止,它的所有服务都继续运行。一开始,目的主机上的 domain 或者虚机会处于停止状态,而且在domain的状态在网络传输的过程中,domain 在目的主机上实际上是不可见的。实时迁移和它上面所运行的应用的类型有直接关系的。当实时迁移一个 domain 时,它已经被分配的内存会被发送到目的主机,与此同时,其内存的任何改变都会被监视(watched)然后也会被发到目的主机。原主机上的 domain 会一直保持它的状态,直到两个节点上的 domain 的内存达到完全达到一致了。这时,目的主机上的 domain 变为 active 状态,原主机上的 domain 变为 passive 或者不可见状态。
- Peer-to-peer (对等模式):该模式下,当原主机和目的主机能够直接通信。
- Tunnelled (隧道模式) :该模式下,在原主机和目的主机之间会建立一个隧道 (tunnel),比如 SSH 隧道。两个主机之间的所有通信都会经过该隧道。
- Direct (直接模式):该模式下,libivrt 使用 hypervisor 来发起迁移,迁移过程完全被 hypervisor 控制。这种模式下,源主机和目的主机的 hypervisor 往往是可以直接交互的(比如,原主机和目的主机上的 Xen 能够直接交互,而不需要libvirt 的干预)
迁移要求:
- 使用路径和位置相同的共享存储
- 两个物理主机上的 hypervisor 的版本完全相同
- 相同的网络配置
- 目的主机上有相同的或者更好的CPU。CPU必须来自同一生产厂家,目的主机上的 CPU flags 必须是原主机上的CPU flags 的超集。
1.6 删除 domain 时的数据安全性
一些应用可能会存储敏感数据,这些数据必须被安全地处理。在任何文件系统中都一样,当一个虚机从一个系统中被删除的时候,只是文件系统的指针被删除。存储介质上的数据块任然存在,只是它们在文件系统中被标识为空。当然,这取决于你的文件系统。我们希望,当一个应用处理这种敏感数据的时候,这些机器必须物理上被安全保护,而且网络防护也必须是被防护的。安全在任何时候都很重要。
2. 任务 (Tasks)
2.1 创建一个 domain
# virt-install \
--connect qemu:///system \
--virt-type kvm \
--name MyNewVM \
--ram \
--disk path=/var/lib/libvirt/images/MyNewVM.img,size= \
--vnc \
--cdrom /var/lib/libvirt/images/Fedora--x86_64-Live-KDE.iso \
--network network=default,mac=:::9c::3b \
--os-variant fedora14
该命令创建一个名为 'MyNewVM' 的 domain,它有 512M 内存和8G磁盘空间,使用KVM。你可以阅读该命令的手册。
卷 (volume)会被加入一个池(pool)中。默认的话,一个名为 "default" 的池会存在。这是一个目录类型的池,它的意思是所有的卷都以文件形式存在于一个目录中。详细信息,你可以读 this page 。
<volume>
<name>sparse.img</name>
<capacity unit="G"></capacity>
</volume>
# virsh vol-create default new_volume.xml
<domain type='kvm'>
<name>MyNewVM</name>
<currentMemory></currentMemory>
<memory></memory>
<uuid>30d18a08-d6d8-d5d4-f675-8c42c11d6c62</uuid>
<os>
<type arch='x86_64'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/><apic/><pae/>
</features>
<clock offset="utc"/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<vcpu></vcpu>
<devices>
<emulator>/usr/bin/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/var/lib/libvirt/images/MyNewVM.img'/>
<target dev='vda' bus='virtio'/>
</disk>
<disk type='block' device='cdrom'>
<target dev='hdc' bus='ide'/>
<readonly/>
</disk>
<interface type='network'>
<source network='default'/>
<mac address='52:54:00:9c:94:3b'/>
<model type='virtio'/>
</interface>
<input type='tablet' bus='usb'/>
<graphics type='vnc' port='-1'/>
<console type='pty'/>
<sound model='ac97'/>
<video>
<model type='cirrus'/>
</video>
</devices>
</domain>
定义一个持久性的domain:
# virsh define MyNewVM.xml
Domain 的 XML 格式有很多的可选元素你可能觉得有用。因此,可以阅读 this page ,它包含完整的参考。
2.2 编辑一个 domain
# virsh edit <domain>
如果这些变量都不存在,默认会使用 vi。当编辑器关闭的时候,libvirt 会自动检查其变化并应用这些改变。你也可以在 Virtual Machine Manager 编辑 domain。
2.3 启动一个domain
# virsh start MyNewVM
# virsh create /path/to/MyNewVM.xml
2.4 停止或者重启(reboot)domain
停止一个运行中的 domain:
# virsh shutdown <domain>
重启一个持久性的 domain:
# virsh reboot <domain>
粗野的关机(inelegant shutdown),等同于直接拔电源:
# virsh destroy <domain>
- shutdown 是个优雅(graceful)的停止过程,它会发一个信号给 domain 的操作系统,通知它立刻关机。domain 只有在 OS 成功关闭后才停止。该过程类似于在物理机器上运行 shutdown 命令。
- destroy 是立刻中止 domain。该过程类似于拔掉物理机器的电源。
2.5 中止(Pause)domain
使用 suspend 命令来中止一个domain:
# virsh suspend <domain>
当一个虚机处于挂起( suspended) 状态时,它会继续占用系统内存,但不会占用处理器资源。这时候也不会有磁盘和网络IO操作。
2.6 继续(unpause/resume)domain
使用 resume 命令来继续一个domain:
# virsh resume <domain>
- Suspend and resume 是指将一个domain 临时性的保存到内存中的过程。一段时间后,可以继续该 domain 到其原始的运行状态。Suspend 不保存 domain 的内存到持久性文件。
- Save 和 restore 是指将一个运行着的 domain 的状态保存到文件,以及从文件中恢复的过程。
2.7 对domain做快照
使用 snapshot-create 命令来对 domain 做快照:
# virsh snapshot-create <domain>
2.8 列表domain 所有的快照
使用 snapshot-list 命令来获取 domain 的所有快照列表:
# virsh snapshot-list <domain>
结果比如:
Name Creation Time State
---------------------------------------------------
-- :: + running
-- :: + running
2.9 从快照恢复一个domain
使用 snapshot-restore 命令来从一个快照恢复一个domain:
# virsh snapshot-restore <domain> <snapshotname>
2.10 删除domain 的一个快照
使用 snapshot-delete 命令来删除一个快照:
# virsh snapshot-delete <domain> <snapshotname>
2.11 迁移 (Migration )
- 普通迁移(Plain migration):原主机开通一个与目的主机的 TCP 连接来发送迁移的数据。如果TCP 端口没有被指定,那么 libvirt 会自己在 49152-49215 区间内选择一个端口。因此你需要在目的主机的防火墙上开启该端口。
- 隧道迁移(Tunneled migration):原主机创建一个与目的主机之间的连接隧道。它允许加密数据流。它不需要额外的防火墙操作,但是只在 qemu 0.12+ 和 libvirt 0.7.2 以后才支持。
# virsh migrate <domain> <remote host URI> --migrateuri tcp://<remote host>:<port>
2.12 删除一个domain
使用virsh 的 undefine 命令来删除一个 domain:
# virsh undefine <domain>
同样地,你也可以在 Virtual Machine Manager 中删除一个 domain。可以阅读这篇文章.
[译] libvirt 虚机的生命周期 (Libvirt Virtual Machine Lifecycle)的更多相关文章
- Nova 操作汇总(限 libvirt 虚机) [Nova Operations Summary]
本文梳理一下 Nova 主要操作的流程. 0. Nova REST-CLI-Horizon 操作对照表 Nova 基本的 CRUD 操作和 extensions: # 类别 Nova V2 REST ...
- Tomcat中组件的生命周期管理公共接口Lifecycle
Tomcat的组件都会实现一个Lifecycle接口,以方便组件的生命周期的统一管理 interface Lifecycle 组件生命周期中主要的几个方法 增加监听器,事件委托机制 public vo ...
- KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain]
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- KVM(六)Nova 通过 libvirt 管理 QEMU/KVM 虚机
1. Libvirt 在 OpenStack 架构中的位置 在 Nova Compute 节点上运行的 nova-compute 服务调用 Hypervisor API 去管理运行在该 Hypervi ...
- Nova: 虚机的块设备总结 [Nova Instance Block Device]
和物理机一样,虚拟机包括几个重要的部分:CPU.内存.磁盘设备.网络设备等.本文将简要总结虚机磁盘设备有关知识. 1. Nova boot CLI 中有关虚机块设备的几个参数 nova boot CL ...
- 转 Nova: 虚机的块设备总结 [Nova Instance Block Device]
和物理机一样,虚拟机包括几个重要的部分:CPU.内存.磁盘设备.网络设备等.本文将简要总结虚机磁盘设备有关知识. 1. Nova boot CLI 中有关虚机块设备的几个参数 nova boot CL ...
- OpenStack之虚机热迁移代码解析
OpenStack之虚机热迁移代码解析 话说虚机迁移分为冷迁移以及热迁移,所谓热迁移用度娘的话说即是:热迁移(Live Migration,又叫动态迁移.实时迁移),即虚机保存/恢复(Save/Res ...
- tomcat生命周期的管理——生命周期统一接口Lifecycle
我们知道Tomcat的架构设计是清晰的.模块化的,其拥有很多组件,假如我们要启动Tomcat,可以一个一个启动组件,但这样启动有很多缺点,不仅麻烦,而且容易漏了组件启动,还会对后面动态组件扩展带来麻烦 ...
- nexus私服搭建及maven生命周期
一.maven找库流程 从流程上看创建nexus私服,能够优化流程,而且更加快速 二.nexus下载.安装 1.nexus下载地址 https://sonatype-download.global.s ...
随机推荐
- 【问题】js 改变鼠标样式,chrome浏览器不能立即更新,暂没有解决办法
元素的css,cursor可以改变鼠标样式.也就是鼠标放到元素上去时,改变为相应状态. 通过JS改变cursor时,我发现chrome浏览器不能立即更新,需要动一下鼠标才行,试了几个其它浏览器都是立即 ...
- SharePoint2013的头像显示和读取
前言 有个时候SP的二次开发,需要用代码获取头像显示,如SP基于AD验证,AD有头像属性,做为头像数据来源(因为Exchange和lync的头像也来自AD),说道这里大家都知道有2种办法,一种从A ...
- SharePoint 2013 搜索报错"Unable to retrieve topology component health. This may be because the admin component is not up and running"
环境描述 Windows 2012 R2,SharePoint 2013(没有sp1补丁),sql server 2012 错误描述 搜索服务正常,但是爬网一直在Crawling Full,但是爬不到 ...
- 【转】C++标准库和标准模板库
C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...
- CAGradientLayer渐变效果
属性 startPoint和endPoint 决定渐变方向,以单位坐标系定义.左上角{0,0},右下角{1,1} colors 渐变的颜色,是一个CGColorRef的数组. locations 定义 ...
- 获取设备IMEI ,手机名称,系统SDK版本号,系统版本号
1.获取设备IMEI TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Str ...
- iOS 跳转到系统的设置界面
跳到健康设置 上网找了一下 你会发现很难找到.代码如下 不信你试试 . NSURL *url = [NSURL URLWithString:@"prefs:root=Privacy& ...
- 自定义标签 与 JSTL(JSP Standard Tag Library)
1.自定义标签 [理解] [1]简介 > 在JSP2.0以后,在jsp页面中不建议使用脚本片段<% %>和JSP表达式<%= %> ...
- .Net魔法堂:提取注释生成API文档
一.前言 在多人协作的项目中,除了良好的代码规范外,完整的API文档也相当重要.通过文档我们快速了解系统各模块的实际接口,及其使用场景.使用示例,一定程度上降低沟通成本,和减少后期维护中知识遗失等风险 ...
- OSGI.NET 框架浅析
关于osgi.net ,想必大家也听说过,以下是自己在学习osgi.net 过程中整理出来的内容,供大家学习参与使用. 1. UIOSP 开放工厂框架架构 开放工厂所有插件基于OSGi.NET面向服 ...