zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    JavaScript(js)的replace问题的解决
    如何让Log4net日志文件按每月归成一个文件夹,StaticLogFileName参数的用法
    点到线的距离计算公式
    如何写一个Python万能装饰器,既可以装饰有参数的方法,也可以装饰无参数方法,或者有无返回值都可以装饰
    Python如何动态的为对象添加方法或属性,__slots__用法
    Python生成器的用法,使用生成器灵活的生成斐波那契数列
    Python函数名做参数,闭包,装饰器
    Python迭代器的用法,next()方法的调用
    property用法,使Python中的get方法和set方法使用更简单
    python中for循环删除不全的问题
  • 原文地址:https://www.cnblogs.com/jmilkfan-fanguiju/p/10589806.html
Copyright © 2011-2022 走看看