目录

前言

该篇博文是 VMware 虚拟磁盘编程的基础,也是编写 VMware 虚拟机保护与恢复程序的基础,属于相关知识点扫盲。

VMware 虚拟机文件类型

VMware 虚拟机在 EXSi 宿主机上的文件类型

后缀 描述
.vmx 虚拟机的配置文件
.vmdk 虚拟机磁盘文件的元数据文件
flat.vmdk 虚拟机的二进制磁盘文件,是虚拟机真正磁盘数据文件
ctk.vmdk 虚拟机磁盘文件的数据块变化追踪文件,保存自从上次快照以来的所发生变化的数据块偏移量信息
.vmem 虚拟机的内存页面文件,存放虚拟机运行时的内存数据,在虚拟机运行或者崩溃时被创建
.vmss 虚拟机挂起时的状态信息文件
.vmsd 虚拟机快照的元数据文件,保存了如快照名、UID(Unique Identifier)、磁盘文件名等信息。在创建快照前,其 size 为 0byte
.vmsn 虚拟机快照的状态信息文件,用于保存创建快照时虚拟机的状态。这个文件的大小取决于创建快照时是否选择保存内存的状态。如果保存的话,那么这个文件会比分配给这个虚拟机的内存大小还要大几兆
.vmtx 虚拟机模板文件
.nvram 虚拟机 bios 文件
.vswp 虚拟机交换文件
.log 虚拟机日志文件

下面着重记录 VMware 虚拟机必备的三类文件:

  • vm_name.vmdk (配置文件):保存的是该虚拟机磁盘文件的元数据(一般包含有两类最重要的磁盘文件的基本信息),EXAMPLE:
# Disk DescriptorFile
version=3
encoding="UTF-8"
CID=2a9d852c
parentCID=ffffffff
isNativeSnapshot="no"
createType="vmfs" # Extent description
RW 8388608 VMFS "vm_name-flat.vmdk" # Change Tracking File
changeTrackPath="vm_name-ctk.vmdk" # The Disk Data Base
#DDB ddb.adapterType = "lsilogic"
ddb.deletable = "true"
ddb.geometry.cylinders = "522"
ddb.geometry.heads = "255"
ddb.geometry.sectors = "63"
ddb.longContentID = "01b9f98fe5883631cfc93a082a9d852c"
ddb.uuid = "60 00 C2 92 fb ad ff ed-6e d3 c0 fc 62 15 05 73"
ddb.virtualHWVersion = "8"
  • vm_name-flat.vmdk (二进制文件):Extent description 文件,保存虚拟机实际的虚拟磁盘信息。

  • vm_name-ctk.vmdk (二进制文件):Change Tracking File 改变追踪文件,保存自从上次快照以来的虚拟机所发生变化的数据块信息。

VMware 虚拟机的快照

VMware 虚拟机快照有下列三种类型:

  • 崩溃一致快照(crash-consistent snapshot):是 VMware 虚拟机的默认快照类型,相当于电脑突然断电时磁盘的状态,闪存中的数据会丢失。

  • 文件系统一致快照(file-system-consistent snapshot): 快照时间点之前,虚拟机的文件系统被冻结,内存中的脏数据刷盘,快照完成后,文件系统解冻。这样的快照能够保证文件系统的一致性,即内存中的数据不会丢失。

  • 应用一致性(application-consistent snapshot):快找时间点前,虚拟机上运行的应用被冻结,内存中应用的所有脏数据刷盘,快照完成后,应用被解冻,这样的快照能够保证指定应用的数据是完整的,但不会保证文件系统也是完全一致的。

Quiseced Snapshot

后两种快照类型,也被统称为 Quiseced Snapshot 。使用 Quiseced Snapshot 需要特别的环境配置,主要的实现方式有两种:

  • 使用客户机操作系统内置的应用服务或 VMware 提供的一致性驱动

    • 版本较新的 Windows 客户机提供了 VSS(Volume Shadow Copy Service) 服务,VSS 提供了 Requester-Writer 来满足有冻结需求的应用和文件系统,在快照时间点前进行冻结和内存数据落盘并且在快照完成后进行解冻;
    • 对于版本较老的 Windows 客户机,VMware 提供了 SYNC driver 来支持应用和文件系统一致性快照;
    • 而在 Linux 客户机上,VMware 提供的 vmsync kernel module 仅支持文件系统一致性,而不能支持应用一致性。
  • 脚本程序:如果是非 Windows 客户机,那么就需要编写针对指定应用的脚本,来对应用进行冻结或者解冻。

NOTE:上述列举的 VSS、SYNC driver、vmsync kernel module 和脚本,均要依赖 VMware Tools 来调用,所以即便客户机操作系统支持上述功能,仍需安装 VMware Tools 才能完美支持 Quiseced Snapshot。例如针对 VSS,VMware tools 就提供了 VSS support 功能,它是 VMware tools 和 Windows VSS 之间交互的桥梁。要创建 quiseced snapshots,VSS support 就必须被安装。

Quiseced Snapshot 的创建过程

  1. 用户发出 quiesced snapshot 创建请求给 vCenter,vCenter 再给虚拟机所在的 ESXi 的 hostd service 发出快照创建请求。
  2. ESXi 上的 Hostd service 将快照创建请求传递给客户机内的 VMware tools。
  3. VMware tools 以 VSS Requester 的身份通知 VSS,VSS 再通知已经被注册的文件系统和各应用的 VSS writer 执行冻结操作。
  4. 一旦完成冻结和内存数据落盘,VMware tools 就将完成结果通知 hostd service。
  5. Hostd service 执行快照操作。
  6. 快照完成后,按照前面的顺序再对文件系统和各应用进行解冻

创建快照

VMware 虚拟机创建快照之后会生成 3 个文件:

  • vm_name-000001.vmdk (配置文件): 虚拟机快照的元数据文件,记录了该次快照相关文件的信息,其中 000001 表示第一次快照。
# Disk DescriptorFile
version=3
encoding="UTF-8"
CID=a368e4cf
parentCID=2a9d852c
isNativeSnapshot="no"
createType="vmfsSparse"
parentFileNameHint="vm_name.vmdk"
# Extent description
RW 8388608 VMFSSPARSE "vm_name-000001-delta.vmdk" # Change Tracking File
changeTrackPath="vm_name-000001-ctk.vmdk" # The Disk Data Base
#DDB ddb.deletable = "true"
ddb.longContentID = "6f4669ab6aec6b1b2cf5cc6ca368e4cf"
  • vm_name-000001-delta.vmdk (二进制文件):被称为快照数据文件或者 redo-log 文件(在 VDDK 相关的术语中,子磁盘 child disk、重做日志 redo log、差异链 delta link 表示同一个意思),该文件用于保存快照时间点后虚拟机所产生的新数据,即快照数据。应用了 in-file delta technology 技术,初始大小为 16MB,会随着虚拟机数据落盘操作的增多,而按照 16MB 的大小进行增长(降低 SCSI reservation 冲突),并且该文件的大小永远不会超过 Base Disk File 的大小。

  • vm_name-000001-ctk.vmdk (二进制文件):改变追踪文件,保存了自从上次快照以来的虚拟磁盘文件所发生变化的数据块偏移量信息。

创建快照的执行过程及原理

从上图可以看出 VMware 虚拟机快照的特性为:

  • VMware 虚拟机使用的是链式快照。
  • VMware 虚拟机的 Base Disk File 在创建快照之后,其访问权限为 OR 只读模式。
  • 快照时间点之后新落盘的数据会写入快照数据文件中。
  • 快照链上的任意快照文件的损坏都会导致虚拟机无法正常运行。

删除快照

从创建快照的特性中可以理解,如果希望在删除一个快照的同时保证虚拟机能够正常运行的话,那么就需要将该快照数据文件中的数据合并到父快照数据文件中,以此来保证虚拟机磁盘数据的完整性。

删除虚拟机快照一般会是以下两种情况:

  • 待删除的虚拟机快照在快照链中: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 中。

CBT

CBT 是在 vSphere 4.0 版本引入的实现增量备份的功能,增量备份表示仅会备份两个时间点之间所被改变的差异数据,而这些差异数据往往就是虚拟机的快照数据。ESXi 为每个开启了 CBT 功能的虚拟机的虚拟磁盘都创建了一个 -ctk.vmdk 文件。CBT 会对磁盘带来一些性能损失,所以虚拟机的 CBT 的配置项默认为关闭状态。

CBT 的原理就是让 VMKernel 监控自上次快照以来有那些数据块被改变了,记录下这些被改变的数据块的偏移量,从而就能够获取这些被改变了的差异的数据。

CBT 执行过程

  • Step 1:进行全量备份,即备份第一次虚拟机快照的快照数据。
  • Step 2:通过 vShpere API(VirtualDisk.getBacking.getChangeId) 获取 Step 1 中所创建的快照对应的的 ChangeId。
  • Step 3:执行第二次快照。
  • Step 4:进行量备份,调用 vShpere API(queryChangedDiskAreas),传递 Step 2 中获取的 ChangeId 和 Step 3 创建的快照的快找对象作为参数,以此获得自第一次快照时间点(前端点)到第二次快照时间点(后端点)之间发生改变的数据块,并备份这些数据块。

queryChangedDiskAreas

CBT 变化快获取函数 QueryChangedDiskAreas 的原型:

QueryChangedDiskAreas(snapshot, deviceKey, startOffSet, changeID)

- snapshot 当前的快照对象,即后端点;
- deviceKey 目标虚拟磁盘的 device ID;
- startOffSet 开始获取变化块的 offset;
- changeID 即前端点对应的 changeId;

其输出结果类似:

(117768192, 65536)
(132120576, 65536)
(145096704, 43122688)
(265289728, 65536)
(958398464, 65536)

每项的格式均为(offset,length),表示一个发生改变的数据块的偏移量。

NOTE:在没有虚拟机快照的情况下开启 CBT 配置项并调用 queryChangedDiskAreas 函数时,changeId 为的实参应为 *

开启 CBT

  1. 关闭虚拟机
  2. 右击虚拟机,选择 「Edit Settings」
  3. 点击 「Options」
  4. 点击 「Advanced section」 下的 「General」,点击 「Configuration Parameters」,开启「Configuration Parameters」 窗口后,查找 「ctkEnabled」项,设置为 「true」,并设置每个磁盘的「ctkEnabled=true」。
  5. 开启虚拟机

设置成功后,会在虚拟机文件目录下生成 -ctk.vmdk 文件。

NOTE: VDDK API 能调用 configSpec.changeTrackingEnabled = new Boolean(true) 来动态的设置 CBT 状态,而不需要关闭虚拟机设置后才能设置。

VMware 虚拟机的虚拟磁盘编程知识点扫盲之一的更多相关文章

  1. VMware 虚拟机的虚拟磁盘编程知识点扫盲之二

    目录 目录 前文列表 VDDK 安装 VDDK VixDiskLib VADP 前文列表 VMware 虚拟机的虚拟磁盘编程知识点扫盲之一 VDDK 摘自官方文档:The Virtual Disk D ...

  2. 不重新启动VMWare虚拟机加入虚拟磁盘的方法(上)

    近期因为业务须要在不重新启动系统的前提下对系统进行扩容,前提是该系统做过lvm.可是没有足够的物理卷(硬盘),所以引出了改文.本文共分为上下两部分.这是第一部分. 文件夹 加入磁盘 做LVM 加入硬盘 ...

  3. 4、VMware虚拟机相关配置

    4.1.VMware虚拟机开启模块snapshot失败: 1.非正常VMware关闭虚拟机(例如开关机过程中关掉VMware等操作),再次启动虚拟机可能 会出现提示:"锁定文件失败 虚拟机开 ...

  4. VMware 虚拟化编程(15) — VMware 虚拟机的恢复方案设计

    目录 目录 前文列表 将已存在的虚拟机恢复到指定时间点 恢复为新建虚拟机 灾难恢复 恢复细节 恢复增量备份数据 以 RDM 的方式创建虚拟磁盘 创建虚拟机 Sample of VirtualMachi ...

  5. VMware 虚拟化编程(13) — VMware 虚拟机的备份方案设计

    目录 目录 前文列表 备份思路 备份算法 备份细节 连接到 vCenter 还是 ESXi 如何选择快照类型 是否开启 CBT 如何获取备份数据 如何提高备份数据的传输率 备份厚置备磁盘和精简置备磁盘 ...

  6. VMware 虚拟化编程(11) — VMware 虚拟机的全量备份与增量备份方案

    目录 目录 前文列表 全量备份数据的获取方式 增量备份数据的获取过程 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/VADP 概念简析 VMware 虚拟化编 ...

  7. VMware 虚拟化编程(9) — VMware 虚拟机的快照

    目录 目录 前文列表 VMware 虚拟机的快照 快照的执行过程 删除快照 快照类型 Quiseced Snapshot 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDis ...

  8. Vmware虚拟机安装Ubuntu并设置root登陆

    主机操作系统是win7.在Ubuntu官网下好系统镜像.iso文件,安装好Vmware workstation软件 1 安装Ubuntu系统到Vmware虚拟机: 注意下面这步是无法直接设置账号为ro ...

  9. 提升VMware虚拟机性能招数

    在VMware虚拟机(VMware Workstation或VMware Server)中我们可以同时运行多个Guest OS,当同时在同一Host OS中运行多台虚拟机时势必会严重影响到Host O ...

随机推荐

  1. django事务模式

    from django.db import transaction from django.db import transaction with transaction.atomic(): obj = ...

  2. css实现斑马线效果

    文本实现斑马线效果 <style> p { font-size: 17px; line-height: 25px; background-color: antiquewhite; back ...

  3. PAT Advanced 1001 A+B Format (20 分)

    Calculate a+b and output the sum in standard format -- that is, the digits must be separated into gr ...

  4. pyhive

    from pyhive import hiveimport pandas as pdimport numpy as npclass myhive():    def __init__(self,hos ...

  5. 爱奇艺免费vip观看地址

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...

  6. Vscode添加谷歌Debug插件

    1. 2.安装好 Debugger for Chrome之后,找到要进行Debug的文件 3. 4.进入到launch.json文件中进行相应的配置 配置文件内容如下: { "version ...

  7. 【洛谷P2398】GCD SUM

    题目大意:求 \[\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)\] 题解: 最重要的一步变换在于. \[\sum\limits_{k=1}^n k \s ...

  8. 关于js节流函数throttle和防抖动debounce

    废话不多说,直奔主题. 什么是throttle和debounce? 这两个方法的主要目的多是用于性能优化.最常见的应用尝尽就是在通过监听resize.scroll.mouseover等事件时候的性能消 ...

  9. Flask【第3篇】:蓝图、基于DBUtils实现数据库连接池、上下文管理等

    基于DBUtils实现数据库连接池 小知识: 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_v ...

  10. java web 增加信息课堂测试00

    按照图片要求设计添加新课程界面.(0.5分)在后台数据库中建立相应的表结构存储课程信息.(0.5分)实现新课程添加的功能.要求判断任课教师为王建民.刘立嘉.刘丹.王辉.杨子光五位教师的其中一位.(0. ...