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


    目录

    前文列表

    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。

  • 相关阅读:
    不要抱怨网速慢,只怪你自己不会调快网速
    2014年6月27日 几何和排列 答案
    我的世界杯生活
    javascript设计模式--备忘录模式(Memento)
    翻译:AngularJS应用的认证技术
    javascript设计模式--状态模式(State)
    一张思维导图说明jQuery的AJAX请求机制
    数据库设计中的14个技巧
    密室经典逃脱N部--考验你的智力!据说全球没几人走出去!不要看攻略!【工作之余也来休闲一下】
    关于编程,大学没有传授的10件事
  • 原文地址:https://www.cnblogs.com/jmilkfan-fanguiju/p/10589806.html
Copyright © 2020-2023  润新知