VMware 虚拟化编程(9) — VMware 虚拟机的快照
目录
前文列表
VMware 虚拟化编程(1) — VMDK/VDDK/VixDiskLib/VADP 概念简析
VMware 虚拟化编程(2) — 虚拟磁盘文件类型详解
VMware 虚拟化编程(3) —VMware vSphere Web Service API 解析
VMware 虚拟化编程(4) — VDDK 安装
VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一
VMware 虚拟化编程(6) — VixDiskLib 虚拟磁盘库详解之二
VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
VMware 虚拟化编程(8) — 多线程中的 VixDiskLib
VMware 虚拟机的快照
在备份和恢复应用程序中,不管是全量备份,还是增量备份,都依赖于 vSphere 中的快照。要备份虚拟机,首先需要创建一个虚拟机的快照。快照创建成功之后,就需要找到与快照相关的虚拟磁盘。虚拟磁盘的快照文件以虚拟磁盘的基本名称命名,并且在名称后面追加了唯一的序列字符串,以保证 VMDK 文件的唯一性。如:vdisk-000032.vmdk,其中 vdisk 是虚拟磁盘的基本名称。在物理文件系统的快照磁盘文件类型如下:
- vm_name-000001.vmdk (配置文件): 虚拟机快照的元数据文件,记录了该次快照相关文件的信息,其中 000001 表示第一次快照。
- vm_name-000001-delta.vmdk (二进制文件):称为快照数据文件或者重做日志文件(redo-log)也被称为子磁盘文件,该文件用于保存快照时间点后虚拟机所产生的更改数据(即快照数据)。应用了 in-file delta technology 技术,初始大小为 16MB,会随着虚拟机数据落盘操作的增多,而按照 16MB 的大小进行增长(降低 SCSI reservation 冲突),并且该文件的大小永远不会超过 Base Disk File 的大小。
- vm_name-000001-ctk.vmdk (二进制文件):改变追踪文件,保存了自从上次快照以来的虚拟磁盘文件所发生变化的数据块偏移量信息。需要开启 CBT 功能才会生成该文件。
NOTE:在 vSphere API 的定义中,使用 Datastore 唯一标识作为前缀,结合虚拟磁盘相对于 Datastore 根目录的路径,以此来标识一块虚拟磁盘,如:[storageN] VmName/vdisk-NNNNNN.vmdk
要取得虚拟磁盘机器快照的名称和相关配置信息(capacityInKB、changeID 等),可以使用 PropertyCollector 来获取 VirtualMachine Managed Object 的 config.hardware.device 属性。在其中找到 VirtualDisk 项的 BackingInfo 属性,那就是虚拟磁盘的配置信息,有以下类型:
- VirtualDiskFlatVer1BackingInfo
- VirutalDiskFlagVer2BackingInfo
- VirtualDiskRawDiskMappingVer1BackingInfo
- VirtualDiskSparseVer1BackingInfo
- VirtualDiskSparseVer2BackingInfo
NOTE:VirtualDiskRawDiskMappingVer1BackingInfo 类型的虚拟磁盘是无法创建快照的,所以也无法备份这一类型的虚拟磁盘。
快照的执行过程
STEP 1:
STEP 2:
STEP 3:
可以看出 VMware 虚拟机快照的特性有:
- VMware 虚拟机使用的是链式快照。
- VMware 虚拟机快照的 Parent VMDK File 的访问权限为 OR 只读。
- 快照时间点之后新落盘的数据只会被写入到 Child VMDK File 快照数据文件中。
- 快照链上的任意快照文件的损坏都会导致虚拟机无法正常运行。
删除快照
从创建快照的特性中可以理解,如果希望在删除一个快照的同时保证虚拟机能够正常运行的话,那么就需要将该快照数据文件中的数据合并到 Parent VMDK File 中,以此来保证虚拟机磁盘数据的完整性。
删除虚拟机快照一般会是以下两种情况:
- 待删除的虚拟机快照在快照链中:delta vmdk 中的数据会向父快照的 delta vmdk 或基础虚拟磁盘文件 base vmdk 合并,然后 delta vmdk 被删除。
- 待删除的虚拟机快照不在快照链中(VMware 支持独立快照):不需要合并,直接删除快照数据文件。
删除 VMware 虚拟机快照的特点:
- 删除快照过程包括两个异步的操作:1. 从 Snapshot Manager 中将快照删除;2. vmdk 数据合并。如果 1 成功而 2 失败,就会残留 delta vmdk 文件,这样的话就需要手动进行快照文件的合并。
- 删除快照可能会带来大量的数据写操作,有时候可能需要删除很长的时间,并且期间虚拟机的性能会受到负面影响。
- 自从 vSphere 4 Update 2 开始,优化了选择删除所有虚拟机快照的过程,不再是顺序向下一层层的合并,而是各层分别直接合并到 Base vmdk 中。
快照类型
崩溃一致快照 (Crash-Consistent Snapshot):是 VMware 虚拟机的默认快照类型,相当于电脑突然断电时磁盘的状态,闪存中的数据会丢失掉。
文件系统一致快照 (File-System-Consistent Snapshot):快照时间点之前,虚拟机的文件系统会被冻结,内存中的脏数据刷盘,快照完成之后,文件系统再解冻。这样的快照能够保证文件系统的一致性,即内存中的数据不会丢失。
应用一致性 (Application-Consistent Snapshot):快照时间点前,虚拟机上运行的应用程序被冻结,内存中应用程序相关的所有脏数据刷盘,快照完成之后,应用程序再被解冻,这样的快照能够保证指定应用程序的数据是完整的,但不会保证文件系统也是完全一致的。
其中文件系统一致快照和应用一致性也统称为 Quiseced Snapshot。
Quiseced Snapshot
使用 Quiseced Snapshot 需要特殊的环境配置,主要的实现方式有两种:
使用 GuestOS 内置的应用服务或 VMware 提供的一致性驱动:
- 版本较新的 Windows GuestOS 提供了 VSS(Volume Shadow Copy Service) 服务,VSS 的 Requester-Writer 能够对应用程序和文件系统进行冻结和解冻操作。
- 对于版本较老的 Windows GuestOS,VMware 也提供了 SYNC driver 数据一致性驱动来支持应用程序和文件系统一致性快照;
- 而 Linux Guest,VMware 提供了仅支持持文件系统一致性的 vmsync kernel module。
使用脚本程序:如果是非 Windows GuestOS,那么就需要编写针对指定应用程序的脚本来对其进行冻结和解冻的操作。
NOTE:上述列举的 VSS、SYNC driver、vmsync kernel module 和脚本,均要依赖 VMware Tools 来调用,所以即便客户机操作系统支持上述功能,仍需安装 VMware Tools 才能完美支持 Quiseced Snapshot。例如针对 VSS,VMware tools 就提供了 VSS support 功能,它是 VMware tools 和 Windows VSS 之间交互的桥梁。
Quiseced Snapshot 的创建过程:
1. 用户发出 Quiesced Snapshot 创建请求给 vCenter,vCenter 再给虚拟机所在的 ESXi 的 Hostd Service 发出快照创建请求。
2. ESXi 上的 Hostd Service 将快照创建请求传递给 虚拟机 GuestOS 内的 VMware tools。
3. VMware tools 以 VSS Requester 的身份通知 VSS,VSS 再通知已经被注册的文件系统和各应用的 VSS writer 执行冻结操作。
4. 一旦完成冻结和内存数据落盘,VMware tools 就将完成结果通知 Hostd Service。
5. Hostd Service 执行快照操作。
6. 快照完成后,按照前面的顺序再对文件系统和各应用进行解冻。
VMware 虚拟化编程(9) — VMware 虚拟机的快照的更多相关文章
- VMware 虚拟化编程(15) — VMware 虚拟机的恢复方案设计
目录 目录 前文列表 将已存在的虚拟机恢复到指定时间点 恢复为新建虚拟机 灾难恢复 恢复细节 恢复增量备份数据 以 RDM 的方式创建虚拟磁盘 创建虚拟机 Sample of VirtualMachi ...
- VMware 虚拟化编程(13) — VMware 虚拟机的备份方案设计
目录 目录 前文列表 备份思路 备份算法 备份细节 连接到 vCenter 还是 ESXi 如何选择快照类型 是否开启 CBT 如何获取备份数据 如何提高备份数据的传输率 备份厚置备磁盘和精简置备磁盘 ...
- VMware 虚拟化编程(11) — VMware 虚拟机的全量备份与增量备份方案
目录 目录 前文列表 全量备份数据的获取方式 增量备份数据的获取过程 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/VADP 概念简析 VMware 虚拟化编 ...
- VMware 虚拟化编程(10) — VMware 数据块修改跟踪技术 CBT
目录 目录 前文列表 数据块修改跟踪技术 CBT 为虚拟机开启 CBT CBT 修改数据块偏移量获取函数 QueryChangedDiskAreas changeId 一个 QueryChangedD ...
- VMware 虚拟化编程(3) —VMware vSphere Web Service API 解析
目录 目录 前文列表 VMware vSphere Web Services API VMware vSphere Web Services SDK vSphere WS API 中的托管对象 Man ...
- VMware 虚拟化编程(14) — VDDK 的高级传输模式详解
目录 目录 前文列表 虚拟磁盘数据的传输方式 Transport Methods Local File Access NBD and NBDSSL Transport SAN Transport Ho ...
- VMware 虚拟化编程(12) — VixDiskLib Sample 程序使用
目录 目录 前文列表 vixDiskLibSample 安装 Sample 程序 Sample 程序使用方法 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/V ...
- VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
目录 目录 前文列表 VixDiskLib 虚拟磁盘库 VixDiskLib_GetMetadataKeys VixDiskLib_ReadMetadata 获取虚拟磁盘元数据 VixDiskLib_ ...
- VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一
目录 目录 前文列表 VixDiskLib 虚拟磁盘库 虚拟磁盘数据的传输方式 Transport Methods VixDiskLib_ListTransportModes 枚举支持的传输模式 Vi ...
随机推荐
- Spring boot项目集成Neo4j
第一步,创建Springboot工程 使用Eclipse 创建Maven项目,并修改pom.xml文件为: <?xml version="1.0" encoding=&quo ...
- TMS320F28335——SPI使用笔记
一.SPI硬件接口 GPIO54 ------- SPISIMOA GPIO55 ------- SPISOMIA GPIO56 ------- SPCLK GPI ...
- Linux安装 jdk&maven
JDK安装 1. 下载JDK压缩包http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...
- 前端开发HTML&css入门——HTML
HTML究竟为何物?其实HTML就是一种标记语言,英文全称为Hypertext Markup Language,翻译过来就叫超文本标记语言.它的作用就是负责负责网页的三个要素之中的结构. HTML使用 ...
- Bash数组-判断某个元素是否在数组内的几种方法
声明一个数组array,一个待测试元素var array=( element1 element2 element3 ) var="element1" 接下来用几种方法来分别测试va ...
- java并发学习--第九章 指令重排序
一.happns-before happns-before是学习指令重排序前的一个必须了解的知识点,他的作用主要是就是用来判断代码的执行顺序. 1.定义 happens-before是用来指定两个操作 ...
- php内置函数分析之array_diff_assoc()
static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_type) /* {{{ */ { uint ...
- 开发过程中git的使用
使用clone命令可以直接将git添加到本地库: 主要是针对分支的操作: 首先可以将创建一个属于自己的分支并往上面提交代码,最后合并到dev分支和master分支上面: 前提(master已经有一个文 ...
- Linux虚拟机网络设置问题
使用的是VM 工作站15 和以前的不一样 没有什么虚拟机网络设置 :打开Edit->Virtual NetWork editor, 选中VMnet8,然后点击NAT Setting按钮,再点击D ...
- 关于让左右2个DIV高度相等
哪个div Height值大,就将其值赋给Height值小的div,从而使2个div高度始终保持一 以下是代码: <!DOCTYPE html><html lang="en ...