VMware 相关笔记

Introduction to the Virtual Disk API

虚拟磁盘开发工具包(The virtual disk development kit,VDDK)是一个软件开发工具包(Software Development Kit,SDK),帮助开发人员创建访问虚拟机存储的应用程序。VDDK 软件包基于将在本章中介绍的虚拟磁盘 API。

VMware 数据保护存储 API(VMware Storage APIs – Data Protection,VADP)使用虚拟磁盘 API 和 vSphere API 的子集来对在 ESXi 上运行的虚拟机进行快照,实现全量或增量备份和还原。VADP 取代了 VMware 集中式备份(VMware Consolidated Backup,VCB)。

名词 介绍
VDDK (Virtual Disk Development Kit,虚拟磁盘开发工具包)是 VMware 提供的一个软件开发工具包,旨在帮助开发人员创建访问虚拟机存储的应用程序。VDDK 基于虚拟磁盘 API,提供了许多操作虚拟磁盘的功能和工具,可以帮助开发人员创建备份和恢复、灾备、数据保护等应用程序。
SDK (Software Development Kit,软件开发工具包)通常包含一系列开发工具、库、示例代码和文档,可以帮助开发人员创建特定类型的应用程序。
Virtual Disk API (虚拟磁盘 API)是一组 VMware 提供的 API,用于操作虚拟磁盘文件。开发人员可以通过 API 读取和写入虚拟磁盘文件、创建、删除和调整虚拟磁盘文件的大小、检查磁盘文件的状态,甚至可以将多个虚拟磁盘文件合并为一个。
VADP (VMware Storage APIs – Data Protection,VMware 数据保护存储 API)是 VMware vSphere 平台提供的一组 API,用于帮助备份开发人员更加高效和可靠地备份和恢复虚拟机。这些 API 可以用于虚拟机快照管理、虚拟磁盘备份和恢复、增量备份和恢复等。
vSphere 是 VMware 公司开发的虚拟化平台,可以将多个物理计算机上的操作系统和应用程序虚拟化为多个虚拟机,以提高计算机系统的资源利用率和可用性。vSphere 包括多个组件,如 vCenter Server、ESXi 主机等,可以实现虚拟机的创建、配置、管理、迁移、备份、恢复等操作。
ESXi 是一款由 VMware 公司开发的虚拟化操作系统,是 vSphere 虚拟化平台的核心组件之一。
vSphere API 是 VMware vSphere 平台提供的一组 API,用于管理和控制 vSphere 虚拟化平台中的各种资源,包括虚拟机、主机、存储、网络等。
VCB (VMware Consolidated Backup,VMware 集中备份)是VMware公司早期提供的一种备份解决方案,用于备份虚拟机和虚拟机磁盘。

About the Virtual Disk API

虚拟磁盘API,也称为 VixDiskLib,是一组用于操作 VMDK 格式的虚拟磁盘文件的函数调用。函数调用的语义模仿了 C 系统调用的文件 I/O 方式。使用虚拟磁盘API,可以编写程序直接从软件应用程序中管理 VMDK 文件。

这些库函数可以操作 VMware Workstation 或类似产品(hosted disk)上的虚拟磁盘,也可以操作由 vCenter Server 管理的 ESXi 主机文件系统卷上驻留的虚拟磁盘(managed disk)。托管是一个术语,意味着虚拟化平台和磁盘由类似于 Windows 或 Linux 的客户操作系统托管。

VDDK 软件包可以在 Windows 或 Linux 系统上安装,因此您可以使用任一系统编写 VDDK 和 VADP 应用程序。应用程序可以操作运行在受支持的 VMware 平台产品上的任何操作系统的虚拟磁盘。签署重新分发协议后,您可以将 VDDK 二进制文件重新打包到软件应用程序中。请参阅 VDDK 发行说明以获取支持的平台产品和开发系统列表。

VDDK 和 VADP 使您能够开发应用程序,从中心位置有效地跨多个虚拟磁盘工作。

名词 介绍
VMDK (Virtual Machine Disk Format,虚拟机磁盘格式)是VMware虚拟化平台中使用的一种虚拟磁盘文件格式。
VMware Workstation 是 VMware 公司开发的桌面虚拟化软件,可以在一个物理计算机上模拟多个虚拟计算机,每个虚拟计算机都可以运行不同的操作系统和应用程序。
vCenter Server 是 VMware 公司推出的一款虚拟化管理软件,用于对 VMware 虚拟化环境进行集中管理和监控。

VDDK Components

虚拟磁盘开发工具包(VDDK)包括以下组件:

  • 虚拟磁盘库,一组C函数调用,用于操纵虚拟机 VMDK 文件。
  • 磁盘安装库,一组C函数调用,用于远程安装 VMDK 文件系统。
  • 可使用 Visual Studio 或 GNU C 编译器编译的 C++ 代码示例。
  • PDF 手册和在线 HTML 参考。

Virtual Disk Library

VixDiskLib 是一个独立的包装库,可帮助你开发与 VMware 平台产品集成的解决方案。虚拟磁盘库具有以下功能:

  • 它允许程序创建、转换、扩展、碎片整理、收缩和重命名虚拟磁盘文件。
  • 它可以创建 redo 日志(父子磁盘链接或增量),并可以删除 VMDK 文件。
  • 它允许在 VMDK 文件中的任何位置随机读写数据,并读取元数据。
  • 它可以使用高级传输方式(SAN 或 HotAdd)连接到远程 vSphere 存储。

对于 Windows 操作系统,虚拟磁盘内核模式驱动程序应为64位。用户库可以是32位,因为 Windows 在 Windows 64 上可以在不做修改的情况下运行32位程序。VMware仅提供64位库。

名词 介绍
SDK (Storage Area Network)是一种高速、高可靠性、高可扩展性的存储网络,由专门的存储设备和交换机组成。
HotAdd 是 VMware 虚拟化平台中一种高级功能,可以在虚拟机运行时添加或删除硬件设备(如CPU、内存、网卡、磁盘等),而无需关闭虚拟机或重新启动虚拟机。
VMware vCloud 是 VMware 公司推出的云计算管理平台,可以帮助企业和服务提供商构建和管理基于云计算的 IT 基础设施和服务。
VMFS (Virtual Machine File System,)是VMware公司开发的一种虚拟机文件系统,用于存储虚拟机的磁盘映像文件和相关配置文件。
XML 是一种标记语言,用于描述和传输数据,可扩展性非常强,被广泛应用于Web开发和数据交换领域。

Disk Mount Library

虚拟磁盘挂载库 vixMntapi 允许以编程方式访问虚拟磁盘,就好像它们是已挂载的磁盘分区一样。有关更多信息,请参见虚拟磁盘挂载API。vixMntapi 库与 vixDiskLib 一起打包在 VDDK 中。

Virtual Disk Utilities

虚拟磁盘开发工具包曾经包括两个用于管理虚拟磁盘文件的命令行工具:磁盘挂载和虚拟磁盘管理器。它们最后在 VDDK 5.0 版本中发布。有关更多信息,请参见旧版磁盘挂载和虚拟磁盘管理器用户指南,该指南仍可在网站上获取。

Backup and Restore on vSphere

VMware Storage APIs – Data Protection (VADP) 是一组API,可用于开发或扩展备份软件,以便保护在 VMware 基础设施的 ESXi 主机上运行的虚拟机。有关更多信息,请参见 vSphere 中的Backing Up Virtual Disks in vSphere

Backup Design for vCloud Director

在 VMware vCloud 中,vCloud Director 的自助服务功能提供了三个级别的数据保护。备份提供商可以在系统级别、租户级别或终端用户级别上提供vApp保护。有关vCloud数据保护的信息,请参见技术简报 Backup Design for vCloud Tenant vApps

Use Cases for the Virtual Disk Library

虚拟磁盘库提供了访问虚拟磁盘的功能,为应用程序供应商提供了一系列的使用案例,包括:

  • 备份与虚拟机关联的特定卷或所有卷。
  • 将备份代理连接到 vSphere,并备份存储集群上的所有虚拟机。
  • 读取虚拟磁盘并进行离线防病毒扫描,或对虚拟机进行软件包分析。
  • 写入虚拟磁盘以执行虚拟机的离线集中修补。
  • 操作虚拟磁盘以对文件系统映像进行碎片整理、扩展、转换、重命名或缩小。

Developing for VMware Platform Products

在基于 VMware 的数据中心中,商用备份软件很可能会远程访问虚拟磁盘,例如通过备份代理。该代理可以是一个虚拟机或者一个安装了备份还原软件的物理机器,并且具备访问备用存储设备的能力。(如磁带自动切换器或等效设备)

在备份窗口期间的某个特定时间点,备份软件:

  • 逐个或并行地在集群中对虚拟机进行快照。虚拟机从快照中运行。
  • 将暂停 I/O 操作的基础磁盘或(对于增量备份)仅更改的块复制到备份介质。
  • 记录虚拟机的配置。
  • 还原并删除快照,以便虚拟机保留在备份窗口期间所做的任何更改。

在上述过程中,虚拟磁盘库仅在第二步中使用。其他步骤使用 vSphere API 的一部分(称为 VADP)来对虚拟机进行快照和保存配置。集群中的虚拟磁盘由 vSphere “管理”。

Managed Disk and Hosted Disk

类似于硬盘驱动器,虚拟磁盘文件代表虚拟机的存储卷。每个文件都以 .vmdk 后缀命名。在运行 VMware Workstation 的系统上,每个客户操作系统的文件系统都保存在托管在系统物理磁盘上的 VMDK 文件中。VMDK 文件可以直接在主机上访问。

在 ESXi 主机上的虚拟机文件系统(virtual machine file system,VMFS)中,VMDK 文件再次代表虚拟机的存储卷。它们位于 VMFS 上,VMFS 通常位于集群中的共享存储中。vCenter Server 管理集群存储,因此它可以在不移动 VMDK 文件的情况下迁移(vMotion)虚拟机从一个 ESXi 主机到另一个 ESXi 主机。因此,VMFS 存储被称为 managed disk。

VMFS 磁盘可以位于通过 Fibre Channel、iSCSI 或 SAS 连接器连接到 ESXi 主机的存储区域网络(storage area network,SAN)上。它也可以位于网络附加存储(network attached storage,NAS)上,或直接连接的磁盘上。

vSphere 上的托管磁盘是指在基于 SAN 的 cluster 中以 VMDK 文件的形式管理的磁盘。Workstation 上的自托管磁盘是指在 VMware Workstation 上以VMDK 文件的形式托管在物理磁盘上的磁盘。

在这里插入图片描述
图1. vSphere上的 Managed Disk。

在这里插入图片描述
图2. 在 VMware Workstation 上的 Hosted Disk。

VDDK 支持 managed disk 和 hosted disk。根据文档所述,一些功能不支持 managed disk,另一些功能不支持 hosted disk。vSphere 5.5 及更高版本支持大于 2TB 的托管虚拟磁盘文件。

Advanced Transports

使用 managed disk,VDDK 应用程序可以利用高级传输,在 SAN 上直接执行许多 I/O 操作,而不是通过 LAN 进行操作。这样可以提高性能并节省网络带宽。

VDDK and VADP Compared

虚拟磁盘开发工具包(The Virtual Disk Development Kit,VDDK)包括一组用于操作虚拟磁盘(VixDiskLib)和挂载虚拟磁盘分区(VixMntapi)的 C 库例程。VDDK 专注于在虚拟磁盘存储上有效地访问和传输数据。

vSphere 数据保护存储 API(The vSphere Storage APIs for Data Protection,VADP)是一个营销术语,用于描述 vSphere API 的子集,它使备份和还原应用程序得以运行。基于快照的 VADP 框架允许对虚拟机存储进行高效的、离线的、集中式的备份。在使用快照静默虚拟磁盘之后,软件可以使用 VDDK 库例程备份存储。

vSphere API 是一种基于 XML 的 Web 服务,提供了 vCenter Server 管理运行在 ESXi 主机上的虚拟机的接口。

开发人员需要同时使用 VDDK 和 VADP 来编写数据保护软件。VADP 被介绍于 Backing Up Virtual Disks in vSphere 中。

Platform Product Compatibility

为了支持 vSphere 的新版本,大多数情况下应该更新并重新编译你的软件,使用相应的新版本 VDDK。这是因为 VDDK 不断更新以支持 vSphere 的新功能。从5.0版本开始,VDDK 的版本号与 vSphere 的版本号相匹配。

自 2008 年问世以来,VDDK 一直与虚拟平台产品(如 VMware Workstation、ESXi 和 vCenter Server)保持向后兼容。VMware Fusion 从未得到支持。

Redistributing VDDK Components

当你使用 VDDK 开发在 VMware 平台产品上运行的软件应用程序后,你可能需要重新打包编译到你的软件中的库组件。

为了符合 VDDK 重新分发的要求,你必须在 VMware TAP 计划中达到标准级别或以上,并签署一份重新分发协议。请联系你的 VMware 联盟经理,请求 VDDK 重新分发协议。VMware 希望了解你如何使用 VDDK,你计划在哪些产品中重新分发它,你的公司名称以及你的联系信息。

2. 安装开发工具包

为了开发虚拟磁盘应用程序,请按照本章中描述的方式安装 VDDK。对于备份应用程序,VADP 开发还需要 vSphere Web Services SDK。

准备工作

本节介绍了开始进行 VDDK 和 VADP 开发所需的内容。

开发系统

VDDK 已在以下系统上进行了测试并获得支持:

  • Windows 64-bit (x86-64) systems
  • Linux 64-bit (x86-64) systems

编程环境

可以在以下环境中编译示例程序并开发 vSphere 应用程序:

Visual Studio on Windows

在 Windows 操作系统上,开发人员可以使用 Visual Studio 2005、Visual Studio 2008 以及更高版本中的 C++ 编译器。除了Visual Studio,还需要安装 64 位调试工具。

C++ and C on Linux

在 Linux 操作系统上,开发人员可以使用 GNU C 编译器,版本为 4 及以上。示例程序可以使用 C++ 编译器 g++ 进行编译,VDDK 也可以与 C 编译器 gcc 一起使用。

Java Development for VADP

在开发在 vSphere 上运行的备份和还原软件时,VMware 建议在 Windows 和 Linux上 使用 Java 的 Eclipse IDE 进行开发。vSphere Web Services SDK 现在包括 Axis 和 JAX-WS 绑定。您可以使用包装器类(如Java Native Interface(JNI))调用 C 或 C++ 代码。

VMware 平台产品

使用 VDDK 和 VADP 开发的软件应用程序针对以下平台产品:

  • vCenter Server managing ESXi hosts
  • ESXi hosts directly connected

Hosted 产品,包括VMware Workstation,既未经过测试也不受支持。

存储设备支持

VMware Consolidated Backup (VCB) 曾有知识库文章 http://kb.vmware.com/kb/1007479,显示存储设备和多路径的支持矩阵。VMware 没有为 VDDK 和 VADP 提供类似的支持矩阵。客户必须从备份软件供应商处获取此信息。

安装 VDDK 包

VDDK 作为一个压缩归档文件分别提供给 Windows 64 位和 Linux 64 位。VDDK 软件包包括以下组件:

  • Header files vixDiskLib.h and vm_basic_types.h in the include directory.
  • Function library vixDiskLib.lib (Windows) or libvixDiskLib.so (Linux) in the lib directory.
  • HTML reference documentation in the doc directory and sample program in doc/samples.

注意:在 VDDK 5.5 版本中,VMware 取消了 Windows 安装程序和 32 位可执行文件的支持,现在 VDDK 仅提供 64 位系统使用。

在 Windows 上安装 VDDK 软件包的步骤如下

  1. 在下载页面上,选择适用于 Windows 的 .zip 文件并将其下载到您的开发系统中。
  2. 将 .zip 文件放置在 Program Files 文件夹下的一个子文件夹中,您可以自定义文件夹名称,然后解压缩该文件:
cd C:\Program Files\VMware\VDDK670
unzip VMware-vix-disklib-*.zip
  1. 进入 bin 子文件夹,找到 vstor2install.bat 脚本,并双击运行。批处理脚本应该在原地运行,以便执行的当前目录是 bin 子文件夹。运行它时,隐含地接受 VMware 的许可条款。
    注意:如果 vstor2 已经安装在备份代理上,您应该先使用 vstor2uninstall.bat(对应于相应的VDDK版本)卸载它,然后再运行新的安装脚本。
  2. 使用 regedit 编辑 Windows 注册表,并检查以下键。如果这个键在以前的 VDDK 安装中存在,请右键单击以删除它。添加一个注册表条目,并设置以下键值:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\VMware, Inc.\VMware Virtual Disk Development Kit

为了方便起见,需要编辑 Windows 环境变量 Path,将 VDDK 安装文件夹(例如上面的 C:\Program Files\VMware\VDDK550\bin)包含在其中。

在Linux上安装VDDK软件包的步骤如下

  1. 在下载页面,选择 64 位 Linux 的二进制 tar.gz 文件。
  2. 使用 tar 解压缩存档文件,创建 vmware-vix-disklib-distrib 子目录。
$ tar xvzf VMware-vix-disklib-*.tar.gz
  1. 切换到新创建的目录以查看其子目录:
$ cd vmware-vix-disklib-distrib; ls
bin64  doc  FILES  include  lib32  lib64

bin64 子目录包含一个报告程序和虚拟磁盘管理器。许可条款在 doc/EULA 文件中。示例程序位于 doc/samples 目录下。include 子目录中的头文件用于编译您的 VDDK 应用程序。通常,lib64 组件会安装在 /usr/lib 目录下,例如 /usr/lib/vmware-vix-disklib/lib64。

  1. 根据需要安装组件。可以编辑 LD_LIBRARY_PATH 环境变量,将库安装路径包含在其中。另外,您也可以将库位置添加到 /etc/ld.so.conf 列表中,并以超级用户身份运行 ldconfig。

重新打包 VDDK 库

在基于 VDDK 开发应用程序后,您可能需要 VDDK 二进制文件来运行您的应用程序。

在 Redistributing VDDK Components 中所述,伙伴可以签署许可协议以重新分发支持 VADP 应用程序的 VDDK 二进制文件。

可以在未安装 VDDK 的 Windows 虚拟机上启用 VDDK 二进制文件。

过程如下:

  1. 安装 Microsoft Visual C++(MSVC)可再分发包,可能作为合并模块。最新的 MSVC 运行时可以作为并行组件运行,因此在 Vista 上手动复制可能无法正常工作。有关可再分发包的详细信息,请参阅Microsoft网站,其中包括x86处理器或x64处理器的版本。
  2. 从已安装的 VDDK 的 \bin 和 \lib 文件夹中安装 VMware 可执行文件和 DLL 文件,以及 vstor2-mntapi10.sys 驱动程序到 Windows\system\drivers 文件夹或等效位置。
  3. 创建并安装您的应用程序,以类似于 Virtual Disk API 示例代码中讨论的 vixDiskLibSample.exe 代码的编译方式。

如何寻找 VADP 组件

ESXi 主机和 vCenter Server 同样实现支持库存遍历和任务请求的托管对象。在编写 Java 中的 VADP 软件之前,您需要下载 vSphere Web Services SDK。您可以在 VMware 网站上找到文档和 ZIP 文件以供下载。

Virtual Disk Interfaces

VMware 提供了许多虚拟磁盘布局选项,封装在描述在这里的库数据结构中。

VMDK File Location

在 ESXi 主机上,虚拟机磁盘(VMDK)文件通常位于其中一个 /vmfs/volumes 下,可能在共享存储上。存储卷可以从vSphere 客户端中看到,在主机和集群的清单中。典型的名称是 datastore1 和 datastore2。要查看 VMDK 文件,请单击 Summary > Resources > Datastore,右键单击 Browse Datastore,并选择一个虚拟机。

在 Workstation 中,VMDK 文件存储在与虚拟机配置(VMX)文件相同的目录中,例如在 Linux 上的 /path/to/disk 或Windows 上的 C:\My Documents\My Virtual Machines。

VMDK 文件存储表示虚拟机硬盘驱动器的数据。几乎整个 VMDK 文件的部分都是虚拟机的数据,只有一小部分用于开销。

Virtual Disk Types

以下磁盘类型在虚拟磁盘库中定义:

  • VIXDISKLIB_DISK_MONOLITHIC_SPARSE - 可增长的虚拟磁盘,存储在单个虚拟磁盘文件中。这是托管磁盘的默认类型,并且是Virtual Disk API示例程序中唯一的设置。
  • VIXDISKLIB_DISK_MONOLITHIC_FLAT - 预分配的虚拟磁盘,存储在单个虚拟磁盘文件中。创建需要时间,并且占用很多空间,但是可能比稀疏磁盘性能更好。
  • VIXDISKLIB_DISK_SPLIT_SPARSE - 可增长的虚拟磁盘,拆分成2GB的扩展(s序列)。这些文件可以达到2GB,然后在新的扩展中继续增长。这种类型适用于旧的文件系统。
  • VIXDISKLIB_DISK_SPLIT_FLAT - 预分配的虚拟磁盘,拆分成2GB的扩展(f序列)。这些文件从2GB开始,因此创建需要一些时间,但可用空间可以以2GB递增。
  • VIXDISKLIB_DISK_VMFS_FLAT - 预分配的虚拟磁盘,与ESX 3及更高版本兼容。也称为厚磁盘。此管理磁盘类型在Managed Disk和Hosted Disk中有讨论。
  • VIXDISKLIB_DISK_VMFS_SPARSE - 采用写时复制(COW)机制来节省存储空间。
  • VIXDISKLIB_DISK_VMFS_THIN - 可增长的虚拟磁盘,仅使用所需的空间,与ESX 3或更高版本兼容,由VDDK 1.1或更高版本支持,并且强烈建议使用。
  • VIXDISKLIB_DISK_STREAM_OPTIMIZED - 为流媒体压缩的单片稀疏格式。流优化格式不支持随机读取或写入。

Persistence Disk Modes

在持久磁盘模式下,更改立即且永久地写入虚拟磁盘,以便它们即使在下次启动时也能幸存下来。

在非持久模式下,虚拟磁盘的更改在虚拟机关闭时会被丢弃。VMDK文件会恢复到其原始状态。

虚拟磁盘库不封装此区别,这是一个虚拟机设置。

VMDK File Naming

VMDK 虚拟磁盘文件解释了不同类型的虚拟磁盘。第一列对应于虚拟磁盘类型,但不包括 VIXDISKLIB_DISK 前缀。第三列给出了在 Workstation 和 ESXi 主机上实现的 VMDK 文件的可能名称。

注意:当您使用虚拟磁盘库打开VMDK文件时,始终打开指向其他文件的文件,而不是拆分或平面扇区。要打开的文件很可能是名称最短的文件。 有关其他虚拟机文件的信息,请参阅VMware Workstation用户手册中的“组成虚拟机的文件”部分。在ESXi主机上,VMDK文件的类型为VMFS_FLAT或VMFS_THIN。

VMDK Virtual Disk Files

Disk Type in API Virtual Disk Creation on VMware Host Filename on Host
MONOLITHIC_SPARSE 在选择磁盘类型时,如果不勾选任何框并接受默认设置,则会生成一个VMDK文件,如果需要更多空间,则该文件可以增大。 代表虚拟机的名称。 在VMFS分区上,这是磁盘描述符文件的名称。 <vmname>.vmdk
MONOLITHIC_FLAT or VMFS_FLAT or VMFS_THIN 如果您仅选择“立即分配所有磁盘空间”复选框,则会预先分配空间,因此虚拟磁盘无法增大。第一个VMDK文件很小,指向一个更大的文件,文件名中没有序列号,称为“flat”。 同样,在VMFS分区上,这是指向虚拟磁盘数据文件(分配方式为厚或薄)的虚拟磁盘文件。 <vnname>-flat.vmdk
SPLIT_SPARSE 如果您仅选择“将磁盘分割成2GB文件”复选框,则虚拟磁盘在需要更多空间时可以增大。第一个VMDK文件很小,指向一系列其他VMDK文件,所有这些文件都在序列号之前有一个“s”,表示稀疏。VMDK文件的数量取决于所请求的磁盘大小。随着数据增长,会按顺序添加更多的VMDK文件。 <vmname>-s<###>.vmdk
SPLIT_FLAT 如果您选择“立即分配所有磁盘空间”和“将磁盘分割成2GB文件”复选框,则空间会预先分配,因此虚拟磁盘无法增长。第一个VMDK文件很小,指向一系列其他文件,所有这些文件在序列号之前都有一个“f”,表示平坦。文件的数量取决于所请求的大小。 <vnname>-f<###>.vmdk
MONOLITHIC_SPARSE or SPLIT_SPARSE snapshot 当对虚拟机进行快照或使用虚拟磁盘库时,会创建重做日志(或子磁盘或增量链接)。快照文件编号按顺序排列,没有“s”或“f”前缀。编号的VMDK文件存储对虚拟磁盘自原始父磁盘或以前编号的重做日志(换句话说是先前的快照)以来所做的更改。 <diskname>-<###>.vmdk
SE_SPARSE 节省空间的稀疏(seSparse)格式。在vSphere 5.1及更高版本中,由VMware View用于优化链接克隆模板。在vSphere API中,查看数据对象SeSparseVirtualDiskSpec。不建议以seSparse作为基础磁盘,并且不受支持。
n/a 虚拟机的快照,其中包括指向其所有.vmdk虚拟磁盘文件的指针。 <vnname>Snapshot.vmsn

对于惰性分配的厚置零磁盘,所有块都已分配,并且数据已写入使用的块,但未使用的块保持不变,因此可能包含先前使用的数据。许多存储系统将在后台清零未使用的块。对于急切分配的厚置零磁盘,在分配时未使用的块会被清零。

Thin Provisioned Disk

使用薄置备磁盘,vSphere Client 可能会报告实际分配的磁盘容量小于分配的磁盘大小。

薄置备磁盘的分配大小是磁盘完全分配时所占用的最大空间。实际大小是薄置备磁盘当前的大小。过度承诺意味着如果所有薄置备磁盘都被完全分配,将没有足够的空间容纳所有薄置备磁盘。

Internationalization and Localization

VDDK库没有本地化,但备份合作伙伴可以支持使用UTF-8编码的任何语言环境。除Unicode外,VDDK不支持使用多字节字符编码(如EUC)的语言环境,例如中文、日文和韩文(ISO-2022)。

虚拟机及其VMDK的路径名可以使用主机文件系统支持的任何字符集表示。自vSphere 4和Workstation 7以来,VMware支持Unicode UTF-8路径名,尽管为了在各种语言环境下实现可移植性,建议使用仅ASCII字符的路径名。

Windows系统使用UTF-16表示本地化的路径名。例如,在FR(法语)语言环境下,VDDK示例代码可能会将磁盘挂载到C:\Windows\Temp\vmware-Système,其中è被编码为UTF-16,因此VixMntapi库无法识别它。在这种情况下,一种解决方法是在程序启动前使用仅ASCII字符的路径设置tmpDirectory配置键;请参阅初始化库。

对于打开任意路径名的程序,Unicode提供了一个带有C函数iconv_open()的GNU库,用于初始化编码集转换,以及iconv()函数,用于将UTF-8转换为UTF-16或UTF-16转换为UTF-8。

Virtual Disk Internal Format

《虚拟磁盘格式5.0技术说明》提供了关于VMDK格式的可能有用的信息,并可在以下网址获得:
http://www.vmware.com/support/developer/vddk/vmdk_50_technote.pdf

不同方法对比
损失计算
初始化策略
元学习

Grain Directories and Grain Tables

SPARSE类型的虚拟磁盘使用分层表示来组织扇区。请参见《虚拟磁盘内部格式》(Virtual Disk Internal Format),其中引用了《虚拟磁盘5.0格式》(Virtual Disk Format 5.0)。在这个上下文中,grain指的是数据的颗粒化单位,比扇区更大。这个层次结构包括:

  • 这个层次结构包括颗粒目录(Grain directory)(以及冗余的颗粒目录),其条目指向颗粒表。
    • 这个层次结构包括颗粒表(Grain tables)(以及冗余的颗粒表),其条目指向颗粒(grains)。
      • 每个颗粒都是包含虚拟磁盘数据的扇区块。默认大小为128个扇区或64KB。

Data Structures in Virtual Disk API

这里列出了重要的数据结构对象及其简要描述。

  • VixError - 类型为uint64的错误代码。
  • VixDiskLibConnectParams - 公共类型指定虚拟机凭据vmxSpec(可能通过vCenter Server)、其主机名称以及用于身份验证的凭据类型。有关详细信息,请参阅VMX规范。credType可以是VIXDISKLIB_CRED_UID(用户名/密码,最常见)、VIXDISKLIB_CRED_SESSIONID(HTTP会话ID)、VIXDISKLIB_CRED_TICKETID(vSphere票证ID)或VIXDISKLIB_CRED_SSPI(仅限Windows,当前线程凭据)。
typedef char * vmxSpec
typedef char * serverName
typedef VixDiskLibCredType credType
  • VDDK 6.7在VixDiskLibConnectParams结构中添加了一个新的联合体,请参见xx。
  • VixDiskLibConnectParams :: VixDiskLibCreds - 用于用户ID或会话ID的凭据。
    VixDiskLibConnectParams :: VixDiskLibCreds :: VixDiskLibUidPasswdCreds - 字符串数据字段表示用于身份验证的用户名和密码。
    VixDiskLibConnectParams :: VixDiskLibCreds :: VixDiskLibSessionIdCreds - 字符串数据字段表示会话cookie、用户名和加密的会话密钥。
    VixDiskLibConnectParams :: VixDiskLibCreds :: VixDiskLibSSPICreds - 用于安全支持提供程序接口(SSPI)身份验证的字符串数据字段。用户名和密码为空。
  • VixDiskLibCreateParams - 类型表示虚拟磁盘(请参见虚拟磁盘类型)、磁盘适配器(请参见适配器类型)、VMware版本和磁盘扇区的容量。
typedef VixDiskLibDiskType diskType
typedef VixDiskLibAdapterType adapterType
typedef uint hwVersion
typedef VixDiskLibSectorType capacity
  • 我们在各种重构任务上进行了尝试,
  • VixDiskLibDiskInfo - 类型表示BIOS和物理磁盘的几何结构、磁盘扇区的容量、磁盘适配器(请参见适配器类型)、子磁盘链接(重做日志)的数量以及一个字符串,用于定位父磁盘(重做日志之前的状态)。
VixDiskLibGeometry biosGeo
VixDiskLibGeometry physGeo
VixDiskLibSectorType capacity
VixDiskLibAdapterType adapterType
int numLinks
char * parentFileNameHint
  • VixDiskLibGeometry - 类型指定虚拟磁盘几何结构,不一定与物理磁盘几何结构相同。
typedef uint32 cylinders
typedef uint32 heads
typedef uint32 sectors

Credentials and Privileges for VMDK Access

本地操作由本地VMDK支持。对ESXi主机的访问是通过登录凭据进行身份验证的,因此使用适当的凭据,VixDiskLib可以访问ESXi主机上的任何VMDK。 VMware vSphere具有自己的一组特权,因此使用适当的特权(见下文)和登录凭据,VixDiskLib可以访问由vCenter Server管理的ESXi主机上的任何VMDK。 VixDiskLib支持以下操作:

  • 既支持只读模式也支持读写模式。
  • 可以只读访问在线虚拟机任何快照关联的磁盘。
  • 可以访问离线虚拟机的VMDK文件(vCenter仅限于已注册的虚拟机)。
  • 读取Microsoft Virtual Hard Disk (VHD)格式。

使用vCenter Server备份数据时,备份设备的角色必须具备以下所有虚拟机的权限:

  • 虚拟机> 更改配置> 切换磁盘更改跟踪。
  • 虚拟机> 配置> 允许只读磁盘访问和允许虚拟机下载。
  • 虚拟机> 快照管理> 创建快照和删除快照。

在备份设备上,用户必须具备以下权限:

  • 数据存储 > 分配空间。
  • 虚拟机> 更改配置> 添加新磁盘和删除磁盘。

用户必须对参与备份的 vCenter Server 和所有 ESXi 主机拥有此特权:

  • 全局> 禁用方法和启用方法。

如果特权未在 vCenter Server 级别应用,则返回的错误消息有些误导性:“主机未获得此功能的许可证。”

Adapter Types

库可以选择以下适配器:

  • VIXDISKLIB_ADAPTER_IDE - 虚拟磁盘的行为类似于ATA、ATAPI、PATA、SATA等。当需要特定的旧版软件时,您可能会选择此适配器类型。
  • VIXDISKLIB_ADAPTER_SCSI_BUSLOGIC - 使用Buslogic适配器的虚拟SCSI磁盘。在某些平台上这是默认的,通常由于性能更高,建议使用它而不是IDE。
  • VIXDISKLIB_ADAPTER_SCSI_LSILOGIC - 使用LSI Logic适配器的虚拟SCSI磁盘。Windows Server 2003和大多数Linux虚拟机默认使用此类型。性能与Buslogic相当。

Virtual Disk Transport Methods

VMware支持对使用SAN或NAS存储托管的ESXi主机上的虚拟机进行基于文件或镜像的备份。虚拟机直接从共享的VMFS LUN读取数据,因此备份高效,不会对生产ESXi主机或虚拟网络产生重大负载。

VMware提供了用于将存储感知应用程序(包括备份)与高效访问存储集群集成的接口。开发人员可以使用VDDK高级传输,提供高效的I/O方法,以最大化备份性能。VMware支持四种访问方法:本地文件、通过LAN的NBD(网络块设备)、带SSL加密的NBDSSL、SAN和SCSI HotAdd。

5. Virtual Disk API 示例代码

编译示例代码

这个示例程序是用 C++ 编写的,虚拟磁盘 API 也支持C语言。为了编译成功,必须加载正确的 DLL 或共享对象。您可以通过多种方式确保动态加载的成功。

  • 设置 VDDK 程序内部的路径。
  • 在 Linux 或 Windows 的 Visual Studio 中设置正在使用的 shell 的路径。对于默认安装,Linux 路径为 /usr/share/doc/vmware-vix-disklib/sample。
  • 在 Windows 中,设置系统变量中的 Path 元素。在系统变量的下方列表中选择Path,单击“编辑”,并添加 VDDK bin 目录的路径。C:\Program Files\VMware\VMware Virtual Disk Development Kit\doc\sample\ 是默认的路径。
    注意,VDDK 通过相对路径而不是绝对路径加载 DLL,因此 DLL 的版本冲突可能会导致问题。

Visual C++ on Windows

要编译该程序,请在以下位置找到示例源代码 vixDiskLibSample.cpp:
在 C:\Program Files\VMware\VMware Virtual Disk Development Kit\doc\sample\ 中。
对于 VDDK 5.5 及更高版本,请确保您安装了 64 位调试工具和 Visual Studio。双击 vcproj 文件,可能需要将其转换为新版本格式,然后选择 Build> Build Solution。
要执行编译的程序,请选择 Debug> Start Without Debugging,或在更改到上面给出的 doc\sample 位置后在命令提示符中键入此命令。

SLN 和 VCPROJ 文件

示例目录中包含 Visual Studio 解决方案文件 vixDiskLibSample.sln 和项目文件 vixDiskLibSample.vcproj。

C++ on Linux Systems

寻找目录中的样本文件:

/usr/share/doc/vmware-vix-disklib/samples/diskLib

可以将 vixDiskLibSample.cpp 及其 Makefile 复制到具有写权限的目录中,或切换到 root 用户。在某些 Linux 系统中,您需要在第 15 行的 #else 子句后添加 #include 语句以包含 <stdio.h>和<string.h>。键入 make 命令进行编译。运行应用程序:

make
./vix-disklib-sample

注意: 如果编译失败,请编辑 /etc/ld.so.conf 并作为 root 运行 ldconfig,或更改 LD_LIBRARY_PATH 环境变量以包括库安装路径,即 /usr/lib/vmware-vix-disklib/lib64。

makefile

Makefile 将获取所有需要进行编译但未安装的软件包。

需要的库文件

虚拟磁盘库附带动态库(在Linux上为共享对象),以简化第三方和开源组件的交付。

Windows 需要 lib/vixDiskLib.lib 文件进行链接,并在运行时使用 bin/*.dll 文件。

Linux 使用 .so 文件进行链接和运行。

使用消息

在没有参数的情况下运行示例应用程序会产生以下用法消息:

Usage: vixdisklibsample command [options] diskPath
commands:
 -create : creates a sparse virtual disk with capacity specified by -cap
 -redo parentPath : creates a redo log 'diskPath' for base disk 'parentPath'
 -info : displays information for specified virtual disk
 -dump : dumps the contents of specified range of sectors in hexadecimal
 -fill : fills specified range of sectors with byte value specified by -val
 -wmeta key value : writes (key,value) entry into disk's metadata table
 -rmeta key : displays the value of the specified metada entry
 -meta : dumps all entries of the disk's metadata
 -clone sourcePath : clone source vmdk possibly to a remote site
 -readbench blocksize: do read benchmark on a disk using the specified I/O block size in sectors
 -writebench blocksize: do write benchmark on disk using the specified I/O block size in sectors
options:
 -adapter [ide|scsi] : bus adapter type for 'create' option (default='scsi')
 -start n : start sector for 'dump/fill' options (default=0)
 -count n : number of sectors for 'dump/fill' options (default=1)
 -val byte : byte value to fill with for 'write' option (default=255)
 -cap megabytes : capacity in MB for -create option (default=100)
 -single : open file as single disk link (default=open entire chain)
 -multithread n: start n threads and copy the file to n new files
 -host hostname : hostname / IP addresss (ESXi or vCenter)
 -user userid : user name on host (default = root)
 -password password : password on host
 -port port : port to use to connect to host (default = 443)
 -vm vmPath=/path/to/vm : inventory path to vm that owns the virtual disk
 -libdir dir : Directory containing vixDiskLibPlugin library
 -initex configfile : Use VixDiskLib_InitEx
 -ssmoref moref : Managed object reference of VM snapshot
 -mode mode : Mode string to pass into VixDiskLib_ConnectEx
 -thumb string : Provides a SSL thumbprint string for validation

示例程序的 -single 选项支持打开单个链接而不是整个磁盘链,但仅支持本地 hosted disk,不支持远程 managed disk。

要使用示例程序连接到 ESXi 主机,必须指定选项 -host、 -user、-password,并在 ESXi 主机的数据存储上提供 diskPath。例如:

vix-diskLib-sample -info -host esx5 -user root -password secret "[datastore1] <VM>/<VM>.vmdk"

要连接到 vCenter Server,还必须指定选项 -libdir 和 -vm。程序需要 libdir 以便 DiskLibPlugin 可以连接到 vCenter Server,vCenter Server 必须定位 VM。例如:

vix-diskLib-sample -info -host vc5 -user Administrator -password secret 
                -libdir <pluginDir> -vm vmPath=<path/to/VM> "[<partition>] <VM>/<VM>.vmdk"

在 vSphere 客户端中,可以通过从 vCenter 开始并在 VM 名称前插入 /vm/ 来制定 vmPath。可以通过单击 Edit Settings > Hard Disk 并复制磁盘文件名来确定 diskPath。

vix-disklib-sample -info -host vc5 -user Administrator -password secret 
                -libdir /usr/lib/vmware-vix-disklib/lib64 -vm vmPath=Datacenter/vm/RHEL5 
                "[datastore1] RHEL5/RHEL5.vmdk"

如果要使用高级传输连接,例如连接到 SAN 存储上的虚拟机磁盘,则还必须指定选项 -mode 和 -ssmoref。传输模式和托管对象引用(快照)是 VixDiskLib_ConnectEx() 所必需的。要找到 ssmoref,请登录到 vCenter Server 的托管对象浏览器,然后单击 content > rootFolder > Datacenter > datastore > vm > snapshot。快照必须存在,因为打开正在运行的VM 的基础磁盘是一个坏主意。

vix-disklib-sample -info -host vc5 -user Administrator -password secret -mode san 
                -libdir /usr/lib/vmware-vix-disklib/lib64 -vm vmPath=Datacenter/vm/RHEL5 
                -ssmoref snapshot-72 "[datastore1] RHEL5/RHEL5.vmdk"

在 Windows 上,VDDK 软件包会将 diskLibPlugin.dll 安装在 \bin 文件夹中,而不是 \lib 文件夹中,因此相应地更改。

示例程序演示

示例程序在 Windows 和 Linux 上是相同的,使用 #ifdef 块来进行 Win32 的区分。

include 文件

Windows 动态链接库(DLL)声明在 process.h 中,而 Linux 共享对象(.so)声明在 dlfcn.h 中。Windows 提供了tchar.h 扩展来进行 Unicode 通用文本映射,而在 Linux 中并不容易获得。

定义和结构

示例程序使用十二个位移运算(1 << 11)来跟踪其可用命令和多线程选项。虚拟磁盘 API 有大约 30 个库函数,其中一些用于初始化和清理。以下库函数在示例程序中未进行展示:

  • VixDiskLib_Rename()
  • VixDiskLib_Defragment()
  • VixDiskLib_Grow()
  • VixDiskLib_Shrink()
  • VixDiskLib_Unlink()
  • VixDiskLib_Attach()

示例程序在 appGlobals 结构体中传输状态。

动态载入

#ifdef DYNAMIC_LOADING 块很长,从第 97 行开始,到第 339 行结束。这个块包含了动态加载的函数定义。它还包含了LoadOneFunc() 过程,用于从动态库中获取任何请求的函数,以及 DynLoadDiskLib() 过程来绑定它。这个演示功能也可以称为“运行时加载”,以区别于动态链接。

要在 Linux 上启用运行时加载并尝试该程序,请在 Makefile 中的 g++ 后添加 -DDYNAMIC_LOADING 并重新编译。在Windows 上,请在项目中定义 DYNAMIC_LOADING。

封装类

在动态加载块下面有两个封装类,一个用于错误代码和描述性文本,另一个用于磁盘连接句柄。

错误封装类出现在 catch 和 throw 语句中,以简化跨函数的错误处理。

VixDisk 封装类是一种打开和关闭磁盘连接的清晰方式。除了动态加载之外,在示例程序的末尾的 CopyThread() 函数中,VixDiskLib_Open() 和 VixDiskLib_Close() 库函数出现的唯一时间是在这里。

这些封装类可以使程序更清晰易懂,并提高代码的重用性。

命令函数

接下来是打印用法消息,部分输出显示在“Usage Message”中。

接下来是 main() 函数,它设置默认值并解析命令行参数以确定操作,可能设置选项以更改默认值。如果定义了动态加载,则会发生动态加载。请注意声明结构体 VixDiskLibConnectParams 的全零初始化:

VixDiskLibConnectParams cnxParams = {0};

对于连接到 ESXi 主机,必须正确提供包括用户名和密码在内的凭据作为命令行参数中的 -user 和 -password。必须提供ESXi 主机的 -host 名称和其 -vm 库存路径(vmxSpec)。当设置这些值时,它们会填充 cnxParams 结构体。初始化所有参数,特别是 vmxSpec,否则连接可能会表现出意外行为。

调用 VixDiskLib_Init() 函数初始化库。在生产应用程序中,您可以提供适当的日志、警告和严重错误函数作为参数,而不是 NULL。

调用 VixDiskLib_Connect() 函数创建与磁盘的连接。如果主机 cnxParams.serverName 为空,就像没有 -host 参数一样,连接将建立到本地主机上托管的磁盘。否则,将建立到远程主机上管理的磁盘。如果使用 -ssmoref 参数,则使用高级传输。

接下来,根据请求的操作调用适当的函数,然后是错误信息(如果适用)。最后,main() 函数关闭与磁盘的库连接并退出。

DoInfo()

这个过程调用 VixDiskLib_GetInfo() 函数获取有关虚拟磁盘的信息,显示结果,并调用 VixDiskLib_FreeInfo() 函数以回收内存。参数 disk.Handle() 来自于前面讨论的 VixDisk 封装类。

在这个例子中,示例程序连接到名为 esx5 的 ESXi 主机,并显示 Red Hat Enterprise Linux 客户端的虚拟磁盘信息。对于 ESXi 主机,磁盘路径通常是类似于 [datastore1],然后是虚拟机名称和 VMDK 文件名。

vix-diskLib-sample -info -host esx5 -user root -password secret “[datastore1]RHEL6/RHEL6.vmdk”

vix-diskLib-sample -info -host esx5 -user root -password secret "[datastore1] RHEL6/RHEL6.vmdk"
Disk "[datastore1] RHEL6/RHEL6.vmdk" is open using transport mode "nbdssl".
capacity          = 4194304 sectors
number of links   = 1
adapter type      = LsiLogic SCSI
BIOS geometry     = 0/0/0
physical geometry = 261/255/63
Transport modes supported by vixDiskLib: file:nbdssl

DoCreate()

此过程调用 VixDiskLib_Create() 函数来分配虚拟磁盘。适配器类型默认为 SCSI,除非在命令行上指定为 IDE。大小为 100 MB,除非在命令行上通过 -cap 设置。由于扇区大小为 512 字节,因此代码将 appGlobals.mbsize 乘以 2048 而不是 1024。类型始终为单片稀疏和 Workstation 5。在生产应用程序中,可以定义 progressFunc 和回调数据,而不是 NULL。输入以下命令以创建示例 VMDK 文件(第一行仅适用于 Linux):

export LD_LIBRARY_PATH=/usr/lib/vmware-vix-disklib/lib64

vix-disklib-sample -create sample.vmdk

作为 VMDK 文件,单片稀疏(在单个文件中可扩展)的虚拟磁盘最初的大小为65536字节(2^16),包括开销。当您第一次向这种类型的虚拟磁盘写入数据时,如下面的 DoFill() 函数,VMDK 会扩展到131075字节(2^17),直到需要更多空间为止。您可以使用 -dump 选项验证文件内容。

DoRedo()

该过程调用 VixDiskLib_CreateChild() 来建立重做日志。子磁盘记录自上一个父磁盘或先前的子磁盘以来发生变化的磁盘扇区。子磁盘可以链接成一组重做日志。

示例程序没有演示如何使用 VixDiskLib_Attach() 来访问磁盘链中的链接。VixDiskLib_CreateChild() 建立一个重做日志,子磁盘替换父磁盘以进行读写访问。对于现有的磁盘链,VixDiskLib_Attach() 创建一个相关的子磁盘,或者可以说是一个表兄弟,它链接到磁盘链的某一代中。

有关附加操作的图表,请参见 Attach Child to Parent Disk。

Write by DoFill()

这个过程调用 VixDiskLib_Write() 用 1 填充磁盘扇区(字节值FF),除非在命令行上另有 -val 指定。默认情况下只填充第一个扇区,但是可以通过命令行上的选项 -start 和 -count 来更改。

DoReadMetadata()

这个过程调用 VixDiskLib_ReadMetadata() 来提供 -rmeta 命令行选项。例如,输入以下命令获取全局唯一标识符:

Vix-disklib-sample - rma uuid sample.vmdk

DoWriteMetadata()

这个过程调用 VixDiskLib_WriteMetadata() 来提供 -wmeta 命令行选项。例如,可以将 tools 的版本号从 1 修改为 2:

vx -disklib-sample -wmeta toolsVersion 2 sample.vmdk

DoDumpMetadata()

这个过程调用 VixDiskLib_GetMetadataKeys(),然后调用 VixDiskLib_ReadMetadata() 来提供 -meta 命令行选项。每个键都需要两个读取元数据调用:一个用于确定值字符串的长度,另一个用于填充值。参见从磁盘获取元数据表。

在下面的示例中,示例程序连接到一个名为 esx3 的 ESXi 主机,并显示 Red Hat Enterprise Linux 户端虚拟磁盘的元数据。对于 ESXi 主机,磁盘的路径可能是[storage1],后面跟着虚拟机名称和 VMDK 文件名。

vix-diskLib-sample -meta -host esx3 -user admin -password secret “[storage1]RHEL5/RHEL5.vmdk"
geometry.sectors = 63
geometry.heads = 255
geometry.cylinders = 522
adapterType = buslogic
toolsVersion = 1
virtualHWVersion = 7

工具版本和虚拟硬件版本会出现在元数据中,但不会出现在 DoInfo() 检索的磁盘信息中。几何信息和适配器类型是重复的,但格式不同。可能存在上面没有列出的其他元数据项。

DoDump()

此过程调用 VixDiskLib_Read() 检索扇区并以十六进制显示输出中的扇区内容。默认情况下,只转储编号为0的第一个扇区,但您可以使用 -start 和 -count 选项更改此设置。下面是一系列的命令来演示:

vix-disklib-sample -create sample.vmdk
vix-disklib-sample -fill -val 1 sample.vmdk
vix-disklib-sample -fill -val 2 -start 1 -count 1 sample.vmdk
vix-disklib-sample -dump -start 0 -count 2 sample.vmdk
od -c sample.vmdk

在 Linux(或Cygwin)上,可以运行 od 命令在文件开头显示开销和元数据,并在前两个扇区中显示重复的 1 和 2。示例程序的-dump 选项只显示数据,不显示开销。

DoTestMultiThread()

这个过程使用 Windows 线程库对虚拟磁盘文件进行多个拷贝。使用 -multithread 命令行选项指定副本的数量。对于每个拷贝,样例程序调用 CopyThread() 过程,该过程依次调用由六个 Virtual Disk API 例程组成的序列。

在 Linux上,多线程选项是没有实现的。

DoClone()

这个过程调用 VixDiskLib_Clone() 来复制虚拟磁盘上的数据。作为第六个参数提供的回调函数显示克隆完成的百分比。对于本地承载磁盘,适配器类型为 SCSI(除非在命令行上指定为IDE),大小为200MB(除非通过 -cap 选项设置),类型为单片稀疏(对于工作站)。对于 ESXi 主机,适配器类型来自托管磁盘本身,使用 VixDiskLib_Connect() 建立的连接参数。

如果 createParams.diskType 为VIXDISKLIB_DISK_VMFS_THIN, clone 将目标 VMDK 转换为 thin。这是忽略远程情况的createParams 的一个例外。

最后一个参数 TRUE 表示如果目标 VMDK 存在,则覆盖。

克隆选项是一种很好的备份方法。有时克隆的虚拟磁盘更小,因为可以更有效地组织它。此外,完全分配的平面文件可以转换为稀疏表示或薄表示。

猜你喜欢

转载自blog.csdn.net/qq_39547794/article/details/129949605