VMware 相关笔记

VMware 开发手册

  • 相关
  • 一、介绍 Virtual Disk API
    • 关于 Virtual Disk API
    • VDDK Components
      • Virtual Disk Library
      • Disk Mount Library
      • Virtual Disk Utilities
      • vSphere 上的备份和还原
      • vCloud Director 的备份设计
    • Virtual Disk Library 的用例
    • VMware Platform Products 的开发
      • Managed Disk and Hosted Disk
      • Advanced Transports
      • VDDK and VADP 对比
      • Platform Product Compatibility
      • Redistributing VDDK Components
  • 二、安装开发工具包
    • 准备工作
      • 开发系统
      • 编程环境
        • Visual Studio on Windows
        • C++ and C on Linux
        • Java Development for VADP
      • VMware 平台产品
      • 存储设备支持
    • 安装 VDDK 包
      • 重新打包 VDDK 库
      • 如何寻找 VADP 组件
  • 三、虚拟磁盘接口
    • VMDK 文件位置
    • 虚拟磁盘类型
      • 持久磁盘模式
      • VMDK 文件命名
    • 精简置备磁盘
    • 国际化和本地化
    • 虚拟磁盘内部格式
    • 粒度目录和粒度表
    • 虚拟磁盘 API 中的数据结构
      • VMDK 访问的凭据和特权
      • 适配器类型
    • 虚拟磁盘传输方法
      • 本地文件访问
      • SAN 传输
  • 5. Virtual Disk API 示例代码
    • 编译示例代码
      • Visual C++ on Windows
        • SLN 和 VCPROJ 文件
      • C++ on Linux Systems
        • makefile
      • 需要的库文件
    • 使用消息
    • 示例程序演示
      • include 文件
      • 定义和结构
      • 动态载入
      • 封装类
      • 命令函数
  • 七. 在 vSphere 中备份虚拟磁盘
    • 设计和实现概述
      • 备份的过程
      • 与服务器通信
      • 作为 managed 对象的信息容器
      • 收集状态和配置信息
      • 执行备份操作
      • 还原虚拟机
      • 访问虚拟磁盘上的文件
  • 扩展

相关

名词 介绍
VDDK 虚拟磁盘开发工具包:VDDK 代表 VMware 虚拟磁盘开发工具包(VMware Virtual Disk Development Kit),是一组用于管理和操作VMware虚拟磁盘的 API 和工具。使用 VDDK,开发人员可以创建和管理虚拟机磁盘文件(VMDK)以及执行虚拟磁盘上的各种操作,例如备份和还原虚拟机磁盘、复制虚拟机磁盘等。
VADP VMware 存储 API - 数据保护:是 VMware vSphere 平台提供的一组 API,用于帮助备份开发人员更加高效和可靠地备份和恢复虚拟机。这些 API 可以用于虚拟机快照管理、虚拟磁盘备份和恢复、增量备份和恢复等。
VMDK 虚拟机磁盘格式:是 VMware 虚拟化平台中使用的一种虚拟磁盘文件格式。
VMFS 虚拟机文件系统:是 VMware 公司开发的一种虚拟机文件系统,用于存储虚拟机的磁盘映像文件和相关配置文件。
VCB VMware 集中备份:是 VMware 公司早期提供的一种备份解决方案,用于备份虚拟机和虚拟机磁盘。
VMware Workstation 是 VMware 公司开发的桌面虚拟化软件,可以在一个物理计算机上模拟多个虚拟计算机,每个虚拟计算机都可以运行不同的操作系统和应用程序。
VMware vCloud 是 VMware 公司推出的云计算管理平台,可以帮助企业和服务提供商构建和管理基于云计算的 IT 基础设施和服务。
vCenter Server 是 VMware 公司提供的一种集中式管理工具,用于管理虚拟化基础架构中的虚拟机和物理主机。vCenter Server可以与多个VMware产品进行集成,包括VMware ESXi、VMware vSphere。
vSphere 是 VMware 公司开发的虚拟化平台,可以将多个物理计算机上的操作系统和应用程序虚拟化为多个虚拟机,以提高计算机系统的资源利用率和可用性。vSphere 包括多个组件,如 vCenter Server、ESXi 主机等,可以实现虚拟机的创建、配置、管理、迁移、备份、恢复等操作。
ESXi 是一种虚拟化操作系统,由 VMware 公司开发和提供,它是 vSphere 虚拟化平台的核心组件之一。ESXi 的作用是将物理服务器划分为多个虚拟机,每个虚拟机都可以运行不同的操作系统和应用程序,从而提高硬件利用率,简化管理工作并降低成本。
Virtual Disk API (虚拟磁盘 API)是一组 VMware 提供的 API,用于操作虚拟磁盘文件。开发人员可以通过 API 读取和写入虚拟磁盘文件、创建、删除和调整虚拟磁盘文件的大小、检查磁盘文件的状态,甚至可以将多个虚拟磁盘文件合并为一个。
vSphere API 是 VMware vSphere 平台提供的一组 API,用于管理和控制 vSphere 虚拟化平台中的各种资源,包括虚拟机、主机、存储、网络等。
SAN 存储区域网络:是一种高速网络架构,用于连接存储设备和服务器。它允许多个服务器通过高速数据通道共享存储设备,提高数据存储和访问效率,并且可以提供高可用性、可靠性和可扩展性。
HotAdd 是 VMware 虚拟化平台中一种高级功能,可以在虚拟机运行时添加或删除硬件设备(如CPU、内存、网卡、磁盘等),而无需关闭虚拟机或重新启动虚拟机。

一、介绍 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)。

关于 Virtual Disk API

虚拟磁盘 API 或 VixDisklib 是一组功能调用,用于以 VMDK 格式(虚拟机磁盘)操纵虚拟磁盘文件。函数调用的语义模仿了 C 系统调用的文件 I/O 方式。使用虚拟磁盘API,可以编写程序直接从软件应用程序中管理 VMDK 文件。

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

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

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

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 存储。

Disk Mount Library

虚拟磁盘挂载库 vixMntapi 允许以编程方式访问虚拟磁盘,就好像它们是已挂载的磁盘分区一样。vixMntapi 库与 vixDiskLib 一起打包在 VDDK 中。

Virtual Disk Utilities

VDDK 曾经包括两个用于管理虚拟磁盘文件的命令行工具:磁盘挂载和虚拟磁盘管理器。

vSphere 上的备份和还原

VMware 存储API - 数据保护(VADP)是一组API,可用于开发或扩展备份软件,从而保护在基于 VMware 的数据中心的ESXi 主机上运行的虚拟机。

vCloud Director 的备份设计

在 VMware vCloud 中,vCloud Director 的自助服务功能提供了三个级别的数据保护。备份提供商可以在系统级别,租户级别或最终用户级别提供 vApp 保护。

Virtual Disk Library 的用例

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

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

VMware Platform Products 的开发

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

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

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

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

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 上的 Managed Disk 是指在基于 SAN 的 cluster 中以 VMDK 文件的形式管理的磁盘。Workstation 上的 Hosted Disk 是指在 VMware Workstation 上以VMDK 文件的形式托管在物理磁盘上的磁盘。

VMware 相关笔记_第1张图片
图1. vSphere上的 Managed Disk。

VMware 相关笔记_第2张图片
图2. 在 VMware Workstation 上的 Hosted Disk。

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

Advanced Transports

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

VDDK and VADP 对比

虚拟磁盘开发工具包(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 来编写数据保护软件。

Platform Product Compatibility

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

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

Redistributing VDDK Components

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

为了符合 VDDK 重新分发的要求,你必须在 VMware TAP 计划中达到标准级别或以上,并签署一份重新分发协议。

二、安装开发工具包

为了开发虚拟磁盘应用程序,请按照本章中描述的方式安装 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 文件以供下载。

三、虚拟磁盘接口

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

VMDK 文件位置

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

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

虚拟磁盘类型

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

  • 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 - 为流媒体压缩的单片稀疏格式。流优化格式不支持随机读取或写入。

持久磁盘模式

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

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

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

VMDK 文件命名

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

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

精简置备磁盘

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

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

国际化和本地化

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

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

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

虚拟磁盘内部格式

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

粒度目录和粒度表

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

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

虚拟磁盘 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

VMDK 访问的凭据和特权

本地操作由本地 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 级别应用,则返回的错误消息有些误导性:“主机未获得此功能的许可证。”

适配器类型

库可以选择以下适配器:

  • 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相当。

虚拟磁盘传输方法

VMware 支持对托管在具有 SAN 或 NAS 存储的 ESXi 主机上的虚拟机进行基于文件或映像级别的备份。虚拟机直接从共享的 VMFS LUN 读取数据,因此备份非常高效,不会给生产 ESXi 主机或虚拟网络带来大量负载。

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

本地文件访问

虚拟磁盘库可以从 ESXi 主机上的 /vmfs/ 卷读取虚拟磁盘数据,也可以从托管产品上的本地文件系统读取虚拟磁盘数据。此文件访问方法内置于 VixDiskLib 中,因此在本地存储上始终可用。但是,它不是网络传输方法,很少用于 vSphere 备份。

SAN 传输

SAN 模式要求应用程序在可以访问包含要访问的虚拟磁盘的 SAN 存储(光纤通道、iSCSI 或 SAS 连接)的备份服务器上运行。如下图所示,此方法非常有效,因为无需通过生产 ESXi 主机传输任何数据。SAN 备份代理必须是物理机。如果连接了光学介质或磁带驱动器,则可以完全无局域网进行备份。

在 SAN 传输模式下,虚拟磁盘库从 ESXi 主机获取有关 VMFS LUN 布局的信息,并使用此信息直接从虚拟磁盘所在的存储 LUN 读取数据。对于部署在与 SAN 连接的 ESXi 主机上的软件,这是最快的传输方法。

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 语句以包含 。键入 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] /.vmdk"

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

vix-diskLib-sample -info -host vc5 -user Administrator -password secret 
                -libdir  -vm vmPath= "[] /.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 存在,则覆盖。

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

七. 在 vSphere 中备份虚拟磁盘

本章介绍如何为 vSphere 中运行的虚拟机编写备份和还原软件,并包含有关 VADP 的以下部分:

设计和实现概述

在 vSphere 上,备份通常通过拍摄快照来完成,以高效获取虚拟机的静态映像。快照是虚拟机在特定时间点的视图,可实现快速、干净的备份操作。快照还提供一种称为更改块跟踪的增量备份机制。

要在 vSphere 上备份虚拟机,VMware 建议使用两种语言解决方案。首先使用 Java 对与主机联系的备份程序进行编码,拍摄临时快照,记录虚拟机配置,稍后删除快照。然后使用 C++ 或 C 对将虚拟磁盘数据从快照传输到备份媒体的 VDDK 程序进行编码。

对于恢复,VMware 建议使用两种语言的解决方案。首先使用 Java 编写程序代码,指示虚拟机停止,或从记录的配置重新创建目标虚拟机。然后使用 C 或 C++ 对 VDDK 程序进行编码,该程序将保存的数据从 备份媒体 传输到 虚拟磁盘

备份的过程

  1. 连接到要备份的虚拟机的 ESXi 主机。此步骤的副作用是确定主机上虚拟机的排列和描述。
  2. 告知主机使用 vSphere API 拍摄目标虚拟机的快照。使用 quiesce 标志,但不要使用 memory 标志,因为 memory 标志与 quiesce 不兼容。虚拟机将继续运行,而快照提供静态(quiesced)视图。
  3. 捕获虚拟磁盘数据和虚拟机配置信息 (vim.vm.ConfigInfo)。
  4. 在 ESXi 主机上,使用 VDDK(C 或 C++ 编程)打开并读取虚拟磁盘快照文件。将它们与配置信息一起复制到备份媒体
  5. 告知主机使用 vSphere API 删除备份快照

与服务器通信

在具有许多 ESXi 主机的典型 vSphere 部署中,vCenter Server 实例管理 ESXi 主机,并且可以在主机之间移动虚拟机 (vMotion) 以平衡负载,并可能通过关闭 ESXi 主机的电源来节省电力。因此,VMware 建议备份应用程序与 vCenter Server 通信,而不是与单个 ESXi 主机通信。

vCenter Server 为 vSphere Web Services 开发人员提供位置透明性。vCenter Server 跟踪虚拟机从一个 ESXi 主机移动到另一个主机(通过 vMotion),vCenter Server 会将 SDK 操作定向到当前运行虚拟机的 ESXi 主机。使用 vSphere Web Services API,可以备份与虚拟机关联的所有虚拟磁盘。

使用 vSphere SDK 时,vCenter 或单个 ESXi 主机的处理基本上是等效的。使用 vCenter 管理,无需直接联系各个 ESXi 主机。本章的其余部分使用术语 vSphere 来表示 vCenter Server 或 ESXi 主机。

为了减少 vSphere 使用的资源,VMware 建议尽量减少连接(或会话)的数量。与 vSphere 通信的任何程序的最佳利益是创建一个会话,并将其与需要与 vSphere 交换信息的程序的所有元素共享。这意味着,如果您的程序支持多个线程,则程序应通过使用访问控制锁(互斥锁等)来多路复用连接对象。

同样重要的是,所有 vSphere SDK 操作都必须从应用程序在登录到 vSphere 后请求的“会话”对象的一个实例开始。使用 vSphere API,您的应用程序可以创建“特定于会话”的对象,因此应用程序的其他部分可能使用其他会话时不会知道这些对象。

作为 managed 对象的信息容器

VMware 文档向您介绍了 managed 对象及其句柄的概念,称为托管对象引用 (moRef)。可能你希望使用零碎方法获取托管对象的配置和状态信息。这有一个严重的缺点,即在服务器连接上产生大量颤动,因此速度非常慢。已经创建了一种机制来有效地提供状态信息:PropertyCollector。

vSphere API 和对象模型的文档介绍了大量 managed 对象。有五种基本类型的 managed 对象用于描述服务器的组织。可以将其他 managed 对象视为扩展以下五种基本类型的详细信息:

  • 文件夹
  • 数据中心
  • 计算资源
  • 资源池
  • 虚拟机

所有 managed 对象的一个特征是,它们对充当 managed 对象的父级的 managed 对象具有 moRef。此父 moRef 允许您重新构造 vSphere SDK 公开的对象层次结构。通常,层次结构是树状结构,如下所示:

Root Folder > Datacenter > ComputeResource > ResourcePool > VirtualMachine

此主题存在差异,具体取决于您是连接到 vCenter 还是直接连接到 ESXi 主机,但整体组织类似于上述结构。每个 managed 对象还具有一个 Name 属性。

要备份的虚拟机及其快照(可扩展托管对象 VirtualMachineSnapshot)均由其 moRef 指定。

managed 对象引用 (moRef) 实际上是一个句柄,而不是托管对象本身。虽然可以肯定 moRef 始终包含唯一值,但该唯一值仅相对于您连接到的 vSphere 实例。例如,如果 vCenter Server 管理一个 ESXi 主机群集,则每个 ESXi 主机都维护自己的 managed 对象引用命名空间,并且 vCenter 必须维护一个表示其所有服务器的托管对象引用命名空间。因此,当 ESXi 主机由 vCenter 表示时,vCenter 必须确保受管对象引用是唯一的。vCenter 通过在自己的命名空间中创建唯一的 managed 对象引用名称来实现此目的,这些名称不同于 ESXi 用于相同 managed 对象的名称。

vSphere 实例(vCenter 或 ESXi)尝试使虚拟机的 moRef 在会话之间保持一致,但不能保证一致性。例如,取消注册并重新注册虚拟机可能会导致虚拟机的 moRef 发生更改。因此,存储 moRef 并期望它在将来的会话中或与其他 vCenter Server 一起正常工作是一个坏主意。

在一个 vCenter Server 上,moRef 唯一标识虚拟机。如果需要跨多个 vCenter Server 跟踪和清点虚拟机备份,可以将 moRef 与 instanceUuid 一起使用。您可以在以下浏览器路径中看到实例Uuid:

https:///mob/?moid=ServiceInstance&doPath=content.about

对于与 ESXi 的直接连接,主机地址和 moRef 唯一标识虚拟机。但是,此 moRef 可能与 vCenter Server 返回的 moRef 不同,因此回退到 instanceUuid。instanceUuid 是 VMware vSphere 4.0 中的新功能。在以前的版本中,回退是Uuid。

收集状态和配置信息

若要保存虚拟机的配置以便以后还原它,可以使用属性收集器获取虚拟机配置。

PropertyCollector 是在顶层指定应用程序感兴趣的所有托管对象的最有效机制。它具有提供更新的方法,这些更新仅指示对这些对象的先前状态的更改。有两种机制可用于获取这些更新:
轮询 – 检查更改。结果要么是“无更改”,要么是包含更改的对象。此机制的一个优点是,除了轮询请求和报告之外,它不涉及任何网络流量。
等待更新 – “等待更新”基本上是对 PropertyCollector 的阻止调用。仅当您专用于等待调用取消阻止的程序线程时,这才有用。此机制的优点是,除非必须报告某些内容,否则通信线程上没有流量。

PropertyCollector 需要两个相当复杂的参数:PropertySpec 和 ObjectSpec。ObjectSpec 包含对 PropertyCollector 的说明,描述在何处查找所需数据。由于 vSphere 中的配置信息的组织方式类似于目录树,因此 ObjectSpec 必须描述如何遍历该树以获取所需的信息。最终结果是一个复杂的、嵌套的和递归的指令列表。幸运的是,一旦确定了所有所需信息的位置,确定 vSphere 对象层次结构布局所需的 ObjectSpec 可以是静态不变的对象。

属性规范是所需属性信息的列表。制定包含所有所需信息的列表可能需要一些努力来编译,但一旦确定,这也可以是静态对象。

从 PropertyCollector 返回的数据是一个名为 PropertyFilterUpdate 的容器类,其中包含一个对象集,其中包含对象属性更改的逐项列表。此容器中的每个项都使用以下键之一进行标识:输入(添加)、离开(删除)和修改。在第一个数据请求中,将包括每个数据项,并为每个数据项标记“Enter”。

PropertyCollector 以随机顺序显示其结果。由于所有托管对象都具有“parent”属性,因此可以通过在内存中构建树来重建配置层次结构,并使用父标识进行组织。根文件夹被标识为唯一没有父文件夹的文件夹。

在从 PropertyCollector 返回的数据中,可以在虚拟机托管对象中找到对备份有用的大部分信息,包括:
虚拟磁盘 – 名称、类型和容量。
虚拟机类型和配置 – 在(重新)创建虚拟机时有用的任何内容。此列表可能包括内存大小和 CPU 数量等信息。
显示名称 – 这些名称显示在 VMware 产品(如 vSphere Client)中。您应跟踪这些名称并将它们关联起来,以确保您的产品和 VMware 产品之间的一致性。

执行备份操作

  1. 要完成备份,调用程序需要完成备份所需的权限中所示的权限。
  2. 在目标虚拟机上创建临时快照。
  • 创建快照部分中介绍了创建虚拟机快照的低级别过程。将 quiescent 标志设置为 True 以使文件系统处于静止状态,否则快照可能表示具有不一致数据的过渡系统状态。还原此类数据可能会造成破坏性。
  • 另一个名为 memory 的标志允许您在快照中包含已打开电源的虚拟机内存中状态的转储。备份不需要这样做,因此将此标志设置为 False。
  1. 更改块跟踪。
  2. 从目标虚拟机中提取备份数据。
  • 与你刚刚创建的快照相关联的是虚拟磁盘的“版本”。要识别这些磁盘,您需要获取刚刚创建的快照的 moRef。从此快照 moRef 中,可以提取磁盘名称和路径。
  • 要读取虚拟磁盘中的数据,必须使用 VixDiskLib。此库将程序员与从虚拟磁盘及其重做日志中提取数据的详细信息隔离开来。例如,在进行备份时,您调用函数 VixDiskLib_Open() 和 VixDiskLib_Read() 等。
  • 虚拟磁盘信息的一部分是元数据:描述虚拟磁盘配置的多个键/值对。可以使用 VixDiskLib 函数 VixDiskLib_GetMetadataKeys() 和 VixDiskLib_ReadMetadata() 从虚拟磁盘中提取元数据信息。
  • VixDiskLib API 允许备份应用程序执行虚拟机的完整备份。较新的 VixMntapi 库可以从其虚拟磁盘中提取有关来宾操作系统的信息,因此备份应用程序可以确定所涉及的操作系统类型。
  1. 删除临时快照。
  • 作为备份过程的最后一部分,您应该删除临时快照。它会降低虚拟机性能,并占用本可以更好地利用的存储空间。

还原虚拟机

  • 使现有虚拟机恢复到以前的状态:
  1. 连接到服务器并命令它停止并关闭目标虚拟机的电源。
  2. 使用 服务器访问虚拟磁盘。对于 SAN 传输(但不是 HotAdd 或 NBDSSL),您必须在恢复数据之前创建快照。
  3. 使用 VixDiskLib 从备份传输磁盘映像。恢复并删除快照(如果已创建)。
  • 完全重新创建虚拟机(灾难恢复)
  1. 连接到服务器。
  2. 命令服务器使用备份期间从 vim.vm.ConfigInfo 保存的配置信息创建新的虚拟机及其虚拟磁盘。
  3. 使用 VixDiskLib 将虚拟磁盘数据传输到新创建的虚拟磁盘。虚拟磁盘数据包括磁盘格式化信息,因此您无需在虚拟磁盘上构建任何类型的文件系统。

访问虚拟磁盘上的文件

  • 可以在与 VixDiskLib 关联的 VixMntapi 库中找到完成此操作的接口。VixMntapi 库允许根据需要装载和检查虚拟机的磁盘或卷。VixMntapi 提供文件系统级别的访问,而 VixDiskLib 提供扇区级别的访问。
  1. 找到与快照关联的所有虚拟磁盘的路径名。
  2. 调用 VixDiskLib_Open() 打开所有这些虚拟磁盘。这为您提供了许多 VixDiskLib 句柄,您应该将它们存储在数组中。
  3. 调用 VixMntapi_OpenDiskSet() 创建 VixDiskSetHandle,传入您在步骤 2 中创建的 VixDiskLib 句柄数组。
  4. 将 VixDiskSetHandle 作为参数传递给 VixMntapi_GetVolumeHandles() 以获取指向磁盘集中所有卷的 VixVolumeHandle 指针数组。
  5. 调用 VixMntapi_GetOsInfo() 以确定涉及哪种操作系统,并确定在何处可以找到重要信息。
  6. 对于重要的卷,调用 VixMntapi_MountVolume() 然后调用 VixMntapi_GetVolumeInfo(),这将揭示卷的设置方式。(不重要的卷包括交换分区。
  7. 如果需要有关客户机操作系统如何查看此卷上的数据的信息,可以查看 VixMntapi_GetVolumeInfo() 返回的数据结构 VixVolumeInfo。例如,使用 VixMntapi_GetVolumeInfo() 获取的 VixVolumeInfo::symbolicLink 是代理上的路径,您可以在其中使用普通的打开、读取和写入调用访问虚拟磁盘的文件系统。

扩展

Q:ESXi 是什么?
A:ESXi 是 VMware 提供的一款裸机虚拟化操作系统,它可以直接安装在物理服务器上,将物理服务器转化为多个虚拟服务器的托管平台。

Q:vSphere 是什么?
A:vSphere 是一个集成了多项虚拟化技术的完整虚拟化平台,包括 ESXi、vCenter Server 以及其他管理工具和组件,它提供了更广泛的管理功能和更深入的控制,可以帮助企业更好地管理其虚拟化基础架构。

Q:vCenter Server 是什么?
A:vCenter Server 是由 VMware 提供的一种集中式管理工具,用于管理多个 vSphere 虚拟化环境。提供了更广泛的管理功能和更深入的控制,如对虚拟机进行动态迁移、资源调整、虚拟机克隆、存储管理、虚拟网络等。

Q:ESXi 和 vSphere 的关系?
A:ESXi 是 vSphere 虚拟化平台的一个核心组件,它提供了虚拟化的核心功能和硬件支持;而 vSphere 则是一个完整的虚拟化解决方案,包括ESXi 和其他的管理工具和组件,可以为企业提供更广泛的管理功能和更深入的控制。

你可能感兴趣的:(VMware)