VMware 虚拟化编程(6) — VixDiskLib 虚拟磁盘库详解之二
发布日期:2021-06-30 10:09:14 浏览次数:2 分类:技术文章

本文共 4589 字,大约阅读时间需要 15 分钟。

目录

前文列表

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. */VixErrorVixDiskLib_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. */VixErrorVixDiskLib_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. */VixErrorVixDiskLib_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. */VixErrorVixDiskLib_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. */voidVixDiskLib_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. */VixErrorVixDiskLib_Close(VixDiskLibHandle diskHandle);

函数调用

VixDiskLib_Close(diskHandle);

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

转载地址:https://is-cloud.blog.csdn.net/article/details/78240024 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
下一篇:VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月30日 19时30分11秒