在查看虚拟磁盘文件系统的时候,需要将虚拟磁盘挂载到主机上,VMware提供了相应的接口——Virtual Disk Mount API
这部分遇到了几个坑,记录一下,也算是对做相同或相似工作的人提个醒,遇到了这些问题能够绕过去。
首先安装VDDK,参照如下链接:
https://code.vmware.com/doc/preview?id=1497#/doc/vddkInstall.4.3.html
其次,VDDK安装完成后就可以开始编码了,如果在后续的编译或执行过程中遇到了问题,请参照下面这位小哥的博客:
https://blog.csdn.net/zhouxukun123/article/category/7140664
使用Virtual Disk Mount API可以将一个本地的虚拟磁盘文件挂载到本地,也可以将一个ESXi上虚拟机的虚拟磁盘文件挂载到本地。挂载的过程大致分为如下几个步骤(以本地vmdk文件的挂载为例):
1.初始化
vixError = VixDiskLib_InitEx(VERSION_MAJOR, VERSION_MINOR, &LogFunc, &WarnFunc, &PanicFunc, libdir, NULL);
VERSION_MAJOR、VERSION_MINOR分别对应你下载的VDDK的主次版本号
vixError = VixMntapi_Init(VIXMNTAPI_MAJOR_VERSION, VIXMNTAPI_MINOR_VERSION, &LogFunc, &WarnFunc, &PanicFunc, libdir, NULL);
这个函数中前两个参数的宏定义在vixMntapi.h中,分别为1和0
2.建立连接,获取VixDiskLibConnection
如果是本地vmdk文件:
vixError = VixDiskLib_Connect(NULL, &connection);
如果是远程虚拟机:
vixError = VixDiskLib_Connect(&cnxParam, &connection);
3.打开磁盘,获取VixDiskSetHandle
vixError = VixMntapi_OpenDisks(connection,diskNames, diskHandlesCount, openFlag, &diskSetHandle);
其中diskNames的类型为const char *diskNames[],是需要打开的各个vmdk文件的绝对路径的数组。diskHandlesCount在Linux下为1。成功之后可以用VixMntapi_GetDiskSetInfo查看虚拟磁盘的挂载路径
4.获取虚拟磁盘分区的句柄
vixError = VixMntapi_GetVolumeHandles(diskSetHandle, &numVolumes, &volumeHandles);
执行成功则返回分区个数numVolumes和分区句柄的数组volumeHandles
5.挂载分区
vixError = VixMntapi_MountVolume(volumeHandles[i], FALSE);
6.获取分区挂载位置
vixError = VixMntapi_GetVolumeInfo(volumeHandles[i], &newVolume.volInfo);
7.卸载分区
VixMntapi_DismountVolume(volumeHandles[i],TRUE);
8.关闭虚拟磁盘