VMware 虚拟化编程(6) — VixDiskLib 虚拟磁盘库详解之二

简介: 目录目录前文列表VixDiskLib 虚拟磁盘库VixDiskLib_Open 打开 VMDK FileVixDiskLib_Read 读取 VMDK File 数据VixDiskLib_Write 写入数据到 VMDK FileVixDiskLib_...

目录

前文列表

VMware 虚拟化编程(1) — VMDK/VDDK/VixDiskLib/VADP 概念简析
VMware 虚拟化编程(2) — 虚拟磁盘文件类型详解
VMware 虚拟化编程(3) —VMware vSphere Web Service API 解析
VMware 虚拟化编程(4) — VDDK 安装
VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一

VixDiskLib 虚拟磁盘库

紧接上篇。

VixDiskLib_Open 打开 VMDK File

函数原型

/**
 * Opens a local or remote virtual disk.
 * @param connection [in] A valid connection.
 * @param path [in] VMDK file name given as absolute path
 *                        e.g. "[storage1] MailServer/SystemDisk.vmdk"
 * @param flags [in, optional] Bitwise or'ed  combination of
 *             VIXDISKLIB_FLAG_OPEN_UNBUFFERED
 *             VIXDISKLIB_FLAG_OPEN_SINGLE_LINK
 *             VIXDISKLIB_FLAG_OPEN_READ_ONLY.
 * @param diskHandle [out] Handle to opened disk, NULL if disk was not opened.
 * @return VIX_OK if success, suitable VIX error code otherwise.
 */
VixError
VixDiskLib_Open(const VixDiskLibConnection connection,
                const char *path,
                uint32 flags,
                VixDiskLibHandle *diskHandle);

函数调用

vixError = VixDiskLib_Open(appGlobals.connection, appGlobals.diskPath, appGlobals.openFlags, &srcHandle);

是初始化并建立了与服务器的连接之后,调用 VixDiskLib_Open 即可打开本机(寄宿磁盘)或远程(托管磁盘)的 VMDK File。
需要注意的是,如果使用了 SAN 或 HotAdd 高级传输模式来建立与服务器之间的连接的话,则虚拟机需要存在至少一个 Snapshot 才能够执行 Open VMDK File 的操作。

  • @param connection:实际上是在调用 VixDiskLib_Connect 时 Return 的 VixDiskLibConnection 类型对象

  • @param path:指定需要 Open 的 VMDK File 的路径,使用 vSphere 的通过路径格式 [datastore] virtualmachine/vmdk_file.vmdk

  • @param flags:可以指定下列 flags:

    • VIXDISKLIB_FLAG_OPEN_UNBUFFERED 禁用主机磁盘缓存。
    • VIXDISKLIB_FLAG_OPEN_SINGLE_LINK 打开当前磁盘链接,而不是开发整个磁盘链(仅托管磁盘)。
    • VIXDISKLIB_FLAG_OPEN_READ_ONLY只读模式打开虚拟磁盘。
  • @param diskHandle:若 Open SUCCESS,则返回一个虚拟磁盘对象句柄,该句柄会在后续的 读/写/克隆/获取磁盘信息/管理磁盘元数据/伸缩磁盘 Size/磁盘碎片整理 函数调用中作为实参传入。

VixDiskLib_Read 读取 VMDK File 数据

函数原型

/**
 * Reads a sector range.
 * @param diskHandle [in] Handle to an open virtual disk.
 * @param startSector [in] Absolute offset.
 * @param numSectors [in] Number of sectors to read.
 * @param readBuffer [out] Buffer to read into.
 * @return VIX_OK if success, suitable VIX error code otherwise.
 */
VixError
VixDiskLib_Read(VixDiskLibHandle diskHandle,
                VixDiskLibSectorType startSector,
                VixDiskLibSectorType numSectors,
                uint8 *readBuffer);

函数调用

vixError = VixDiskLib_Read(diskHandle, startSector, numSectors, &mybuffer);
  • @param diskHandle:为调用 VixDiskLib_Open Return 的虚拟磁盘对象句柄。

  • @param startSector, @param numSectors:通过指定开始扇区 startSector 和扇区数量 numSectors,VixDiskLib_Read 从打开的 VMDK File 中读取一片连续的扇区数据。扇区的大小可以不同,但是在 VixDiskLib.h 头文件中已经将这个 Size 定义为 512 个字节,因为 VMDK File 的扇区大小就是 512 字节。

#define VIXDISKLIB_SECTOR_SIZE 512
  • @param readBuffer:是实际读取到的 VMDK File 的数据。

需要注意的是,因为每次读取的扇区 Size 通常为 512 字节,所以读取数据的完整性实际上是需要由应用程序来控制的,并不是调用一次 VixDiskLib_Read 函数就能够得到完整的 VMDK File 数据。

VixDiskLib_Write 写入数据到 VMDK File

函数原型

/**
 * Writes a sector range.
 * @param diskHandle [in] Handle to an open virtual disk.
 * @param startSector [in] Absolute offset.
 * @param numSectors [in] Number of sectors to write.
 * @param writeBuffer [in] Buffer to write.
 * @return VIX_OK if success, suitable VIX error code otherwise.
 */
VixError
VixDiskLib_Write(VixDiskLibHandle diskHandle,
                 VixDiskLibSectorType startSector,
                 VixDiskLibSectorType numSectors,
                 const uint8 *writeBuffer);

函数调用

VixDiskLib_Write(diskHandle, startsector, (sizeof mybuffer) / 512, mybuffer);
  • @param writeBuffer:该实参的长度必须是 VIXDISKLIB_SECTOR_SIZE 的整数倍字节。

VixDiskLib_GetInfo 获取 VMDK File 信息

函数原型

/**
 * Retrieves information about a disk.
 * @param diskHandle [in] Handle to an open virtual disk.
 * @param info [out] Disk information filled up.
 * @return VIX_OK if success, suitable VIX error code otherwise.
 */
VixError
VixDiskLib_GetInfo(VixDiskLibHandle diskHandle,
                   VixDiskLibInfo **info);

函数调用

VixError vixError = VixDiskLib_GetInfo(diskHandle, &info);
  • @param info:返回 VMDK File 的信息。

VixDiskLib_GetInfo 获取指定 Opened VMDK File 的下列相关信息,分配并填充 VixDiskLibDiskInfo 数据结构,其中的一部分信息会与 VMDK File Metadata 的信息相同:

  • bios
  • capacity
  • adapterType
  • links
  • blocks

VixDiskLib_FreeInfo 释放 VMDK File 信息

函数原型

/**
 * Frees memory allocated in VixDiskLib_GetInfo.
 * @param info [in] Disk information to be freed.
 */
void
VixDiskLib_FreeInfo(VixDiskLibInfo *info);

函数调用

vixError = VixDiskLib_FreeInfo(diskInfo);
  • @param info: 为调用 VixDiskLib_GetInfo 返回的 VixDiskLibInfo 类型对象

因为 VixDiskLib_GetInfo 会在内存中分配并填充 VixDiskLibDiskInfo 数据结构,所以需要在 VixDiskLib_GetInfo 调用失败之后立即调用 VixDiskLib_FreeInfo 以释放内存空间,避免内存泄漏。

VixDiskLib_Close 关闭 VMDK File

函数原型

/**
 * Closes the disk.
 * @param diskHandle [in] Handle to an open virtual disk.
 * @return VIX_OK if success, suitable VIX error code otherwise.
 */
VixError
VixDiskLib_Close(VixDiskLibHandle diskHandle);

函数调用

VixDiskLib_Close(diskHandle);

在完成对 VMDK File 的操作之后,一定要谨记关闭 VMDK File。

相关文章
|
7月前
|
虚拟化 Android开发 云计算
6个VMware桌面虚拟化的替代方案
6个VMware桌面虚拟化的替代方案
528 1
|
2月前
|
存储 网络安全 虚拟化
虚拟化数据恢复—VMware ESX Server数据恢复案例
虚拟化数据恢复环境: 某企业信息管理平台, 几台VMware ESX Server主机共享一台存储设备,大约有几十台虚拟机。 虚拟化故障&原因: Vcenter报告虚拟磁盘丢失。管理员通过ssh远程到ESX中执行fdisk -l命令查看磁盘,发现STORAGE已经没有分区表了。重启所有设备后,ESX SERVER均无法连接到存储设备中的STORAGE。
|
1月前
|
存储 SQL 数据库
虚拟化数据恢复—Vmware虚拟机误还原快照的数据恢复案例
虚拟化数据恢复环境: 一台虚拟机从物理机迁移到ESXI虚拟化平台,迁移完成后做了一个快照。虚拟机上运行了一个SQL Server数据库,记录了数年的数据。 ESXI虚拟化平台上有数十台虚拟机,EXSI虚拟化平台连接了一台EVA存储,所有的虚拟机都存放在EVA存储上。 虚拟化故障: 工组人员误操作将数年前迁移完成后做的快照还原了,也就意味着虚拟机状态还原到数年前,近几年数据都被删除了。 还原快照相当于删除数据,意味着部分存储空间会被释放。为了不让这部分释放的空间被重用,需要将连接到这台存储的所有虚拟机都关掉,需要将不能长时间宕机的虚拟机迁移到别的EXSI虚拟化平台上。
106 50
|
4月前
|
存储 监控 固态存储
【vSAN分布式存储服务器数据恢复】VMware vSphere vSAN 分布式存储虚拟化平台VMDK文件1KB问题数据恢复案例
在一例vSAN分布式存储故障中,因替换故障闪存盘后磁盘组失效,一台采用RAID0策略且未使用置备的虚拟机VMDK文件受损,仅余1KB大小。经分析发现,该VMDK文件与内部虚拟对象关联失效导致。恢复方案包括定位虚拟对象及组件的具体物理位置,解析分配空间,并手动重组RAID0结构以恢复数据。此案例强调了深入理解vSAN分布式存储机制的重要性,以及定制化数据恢复方案的有效性。
104 5
|
1月前
|
存储 网络安全 虚拟化
虚拟化数据恢复—VMware ESX SERVER数据恢复案例
虚拟化数据恢复环境&故障: 某单位信息管理平台,数台VMware ESX SERVER共享一台某品牌DS4100存储。 vc报告虚拟磁盘丢失,管理员ssh到ESX中执行fdisk -l查看磁盘,发现STORAGE中的分区表不见了。重启所有设备后,ESX SERVER均无法连接到DS4100存储中的STORAGE。
|
3月前
|
存储 SQL 数据挖掘
虚拟化数据恢复—VMware虚拟机vmdk文件被误删除的数据恢复案例
虚拟化数据恢复环境: 某品牌服务器(部署VMware EXSI虚拟机)+同品牌存储(存放虚拟机文件)。 虚拟化故障: 意外断电导致服务器上某台虚拟机无法正常启动。查看虚拟机配置文件发现这台故障虚拟机除了磁盘文件以外其他配置文件全部丢失,xxx-flat.vmdk磁盘文件和xxx-000001-delta.vmdk快照文件还在。管理员联系VMware工程师寻求帮助。VMware工程师尝试新建一个虚拟机来解决故障,但发现ESXi存储空间不足。于是将故障虚拟机下的xxx-flat.vmdk磁盘文件删除,然后重建一个虚拟机并且分配固定大小的虚拟磁盘。
|
4月前
|
存储 安全 Linux
在Linux中,如何使用VMware和VirtualBox进行虚拟化?
在Linux中,如何使用VMware和VirtualBox进行虚拟化?
|
6月前
|
存储 IDE 开发工具
【读书笔记】 玩转虚拟机基于Vmware+Windows 虚拟化技术
【读书笔记】 玩转虚拟机基于Vmware+Windows 虚拟化技术
|
6月前
|
Linux 网络安全 虚拟化
Linux操作系统第一章(Linux操作系统的带入,vmware-17虚拟化软件运用,FinalShell远程连接Linux )
Linux操作系统第一章(Linux操作系统的带入,vmware-17虚拟化软件运用,FinalShell远程连接Linux )
|
7月前
|
程序员 Linux KVM
【qemu虚拟化】将img镜像文件转换为VMware虚拟机
QEMU是一个开源的硬件虚拟化器,能在多种平台如x86、ARM、PowerPC上运行,支持虚拟化不同体系结构的操作系统。它具有硬件仿真、虚拟化支持、磁盘和网络仿真、快照回滚及可扩展性等特点。要使用QEMU,首先从[官网](https://www.qemu.org/download/)下载,然后通过命令行运行进行转换。转换后的vMDK文件可在VMware中导入,创建新的虚拟机进行使用。
2498 1
【qemu虚拟化】将img镜像文件转换为VMware虚拟机