VIX API学习报告


libvirt针对vmware,有相应的一套库VIX API,在写程序源码时需要引入库文件#include<vix.h>,在编译时需要添加引用:

gcc -I/usr/include/vmware-vix xxxxxx.c -o xxxxxx -lvixAllProducts -ldl       //xxxxxx替换成自己的程序名

下面将学习相关库API。

(1)连接

VixHost_Connect()   //不管是远程还是本地连接,都需要用这个函数

该函数第二个参数为hostType参数,具体的选择为:

VIX_SERVICEPROVIDER_VI_SERVER    //如果机器运行着 VMware vCenter, ESX/ESXi, or VMware Server 2.0

VIX_SERVICEPROVIDER_VMWARE_WORKSTATION      //如果机器运行着 VMware Workstation

VIX_SERVICEPROVIDER_VMWARE_PLAYER           //如果机器运行着 VMware Player

VIX_SERVICEPROVIDER_VMWARE_SERVER           //如果机器运行着  VMware Server 1.0

不同的vmware版本,连接方法不同。这里使用的是workstation,后面就全部针对该版本进行。将hostName,userName和password这三个参数都设置为空,就可以连接本地当前机器。

示例代码:

#include<stdio.h>

#include<stdlib.h>

#include “vix.h”

int main(int argc, char * argv[])

{

VixHandle hostHandle = VIX_INVALID_HANDLE;

VixHandle jobHandle = VIX_INVALID_HANDLE;

VixError err;

// Connect as current user on local host.

jobHandle = VixHost_Connect(VIX_API_VERSION,

VIX_SERVICEPROVIDER_VMWARE_WORKSTATION,

NULL, // hostName

0, // hostPort

NULL, // userName

NULL, // password,

0, // options

VIX_INVALID_HANDLE, // propertyListHandle

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle,

VIX_PROPERTY_JOB_RESULT_HANDLE,

&hostHandle,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“connect error!\n”);

goto abort;

}

printf(“connect success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

abort:

VixHost_Disconnect(hostHandle);

}


(2)注册与注销

ESX/ESXi 以及VMware Server 支持注册与注销,但是VMware Player and Workstation是不支持的。

(3)获取虚拟机句柄

大部分的虚拟机操作都需要获取虚拟机的句柄。获取句柄的函数是VixVM_Open()。可以通过虚拟物理盘(.vmx)路径以及主机句柄来打开一个虚拟机。

示例代码:

#include<stdio.h>

#include<stdlib.h>

#include “vix.h”

int main(int argc, char * argv[])

{

VixHandle hostHandle = VIX_INVALID_HANDLE;

VixHandle jobHandle = VIX_INVALID_HANDLE;

VixHandle vmHandle = VIX_INVALID_HANDLE;

VixError err;

char filepath[]=”//home//mrgao//vmware//vm-xp//vm-xp.vmx”;

// Connect as current user on local host.

jobHandle = VixHost_Connect(VIX_API_VERSION,

VIX_SERVICEPROVIDER_VMWARE_WORKSTATION,

NULL, // hostName

0, // hostPort

NULL, // userName

NULL, // password,

0, // options

VIX_INVALID_HANDLE, // propertyListHandle

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle,

VIX_PROPERTY_JOB_RESULT_HANDLE,

&hostHandle,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“connect error!\n”);

goto abort;

}

printf(“connect success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

//open host

jobHandle = VixVM_Open(hostHandle,

filepath,

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle,

VIX_PROPERTY_JOB_RESULT_HANDLE,

&vmHandle,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“open host error!\n”);

goto abort;

}

printf(“open host success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

VixHost_Disconnect(hostHandle);

}


(4)开机及关机

虚拟系统的开机关机所用函数分别为VixVM_PowerOn(),VixVM_PowerOff()。

示例代码:

#include<stdio.h>

#include<stdlib.h>

#include “vix.h”

int main(int argc, char * argv[])

{

VixHandle hostHandle = VIX_INVALID_HANDLE;

VixHandle jobHandle = VIX_INVALID_HANDLE;

VixHandle vmHandle = VIX_INVALID_HANDLE;

VixError err;

char filepath[]=”//home//mrgao//vmware//vm-xp//vm-xp.vmx”;  //虚拟系统安装配置文件路径

// Connect as current user on local host.

jobHandle = VixHost_Connect(VIX_API_VERSION,

VIX_SERVICEPROVIDER_VMWARE_WORKSTATION,

NULL, // hostName

0, // hostPort

NULL, // userName

NULL, // password,

0, // options

VIX_INVALID_HANDLE, // propertyListHandle

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle,

VIX_PROPERTY_JOB_RESULT_HANDLE,

&hostHandle,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“connect error!\n”);

goto abort;

}

printf(“connect success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

//open the host

jobHandle = VixVM_Open(hostHandle,

filepath,

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle,

VIX_PROPERTY_JOB_RESULT_HANDLE,

&vmHandle,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“open host error!\n”);

goto abort;

}

printf(“open host success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

//Power on the virtual machine.

jobHandle = VixVM_PowerOn(vmHandle,

VIX_VMPOWEROP_LAUNCH_GUI, // powerOnOptions,

VIX_INVALID_HANDLE, // propertyListHandle,

NULL, // callbackProc,

NULL); // clientData

err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“poweron host error!\n”);

goto abort;

}

printf(“power on host success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

//power of the host

jobHandle = VixVM_PowerOff(vmHandle,

VIX_VMPOWEROP_NORMAL,

NULL, // *callbackProc,

NULL); // *clientData);

err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);

if (VIX_FAILED(err))

{

printf(“power off host error!\n”);

goto abort;

}

printf(“power off host success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

abort:

Vix_ReleaseHandle(vmHandle);

VixHost_Disconnect(hostHandle);

}


(5)暂停与暂停恢复

虚拟机从关机状态开启或者从暂停状态恢复,都是用VixVM_PowerOn()这个函数,VIX API不提供专门的暂停恢复函数。暂停函数为VixVM_Suspend()。

示例代码:

#include<stdio.h>

#include<stdlib.h>

#include “vix.h”

int main(int argc, char * argv[])

{

VixHandle hostHandle = VIX_INVALID_HANDLE;

VixHandle jobHandle = VIX_INVALID_HANDLE;

VixHandle vmHandle = VIX_INVALID_HANDLE;

VixError err;

char filepath[]=”//home//mrgao//vmware//vm-xp//vm-xp.vmx”;

// Connect as current user on local host.

jobHandle = VixHost_Connect(VIX_API_VERSION,

VIX_SERVICEPROVIDER_VMWARE_WORKSTATION,

NULL, // hostName

0, // hostPort

NULL, // userName

NULL, // password,

0, // options

VIX_INVALID_HANDLE, // propertyListHandle

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle,

VIX_PROPERTY_JOB_RESULT_HANDLE,

&hostHandle,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“connect error!\n”);

goto abort;

}

printf(“connect success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

//open the host

jobHandle = VixVM_Open(hostHandle,

filepath,

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle,

VIX_PROPERTY_JOB_RESULT_HANDLE,

&vmHandle,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“open host error!\n”);

goto abort;

}

printf(“open host success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

//Suspend the virtual machine.

jobHandle = VixVM_Suspend(vmHandle,

0, // powerOffOptions

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“suspend host error!\n”);

goto abort;

}

printf(“suspend host success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

//resume the virtual machine.

jobHandle = VixVM_PowerOn(vmHandle,

VIX_VMPOWEROP_LAUNCH_GUI, // powerOnOptions,

VIX_INVALID_HANDLE, // propertyListHandle,

NULL, // callbackProc,

NULL); // clientData

err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“resume host error!\n”);

goto abort;

}

printf(“resume host success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

abort:

Vix_ReleaseHandle(vmHandle);

VixHost_Disconnect(hostHandle);

}


(6)VMware Tools相关

大部分的操作,尤其是当你想在虚拟系统中进行操作时,需要VMware Tools正常运行。一般情况下,虚拟系统中会自动安装,如果没有安装,可以手动安装,其函数VixVM_InstallTools()。

示例代码:

VixError err = VIX_OK;

VixHandle jobHandle = VIX_INVALID_HANDLE;

// Mount virtual CD-ROM with VMware Tools installer.

jobHandle = VixVM_InstallTools(vmHandle,

0, // options

NULL, // commandLineArgs

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

goto abort;

}

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;


在虚拟机开机或者暂停恢复时,可以用Vix_GetProperties()获取VMware Tools的运行状态,如果没有正常运行,可以调用VixVM_WaitForToolsInGuest()函数等待VMware Tools正常运行起来。

示例代码:

int toolsState = 0;

// Check if VMware Tools active.

err = Vix_GetProperties(vmHandle,

VIX_PROPERTY_VM_TOOLS_STATE,

&toolsState,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

goto abort;

}

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

if (VIX_TOOLSSTATE_RUNNING != toolsState) {

// Wait for VMware Tools to be active.

jobHandle = VixVM_WaitForToolsInGuest(VixHandle vmHandle,

120, // timeoutInSeconds,

NULL, // callbackProc,

NULL); // clientData

err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the timeout…

}

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

}


(7)登录

要进行客户系统上的文件操作时,需要首先登录客户系统,这里的登录并不是实际上客户系统中账户登录,而是获取一种权限。登录可以用VixVM_LoginInGuest()函数实现。在登录之前首先确保系统是活跃状态,并且VMware Tools正常运行。

 示例代码:

#include<stdio.h>

#include<stdlib.h>

#include “vix.h”

int main(int argc, char * argv[])

{

VixHandle hostHandle = VIX_INVALID_HANDLE;

VixHandle jobHandle = VIX_INVALID_HANDLE;

VixHandle vmHandle = VIX_INVALID_HANDLE;

VixError err;

char filepath[]=”//home//mrgao//vmware//vm-xp//vm-xp.vmx”;

// Connect as current user on local host.

jobHandle = VixHost_Connect(VIX_API_VERSION,

VIX_SERVICEPROVIDER_VMWARE_WORKSTATION,

NULL, // hostName

0, // hostPort

NULL, // userName

NULL, // password,

0, // options

VIX_INVALID_HANDLE, // propertyListHandle

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle,

VIX_PROPERTY_JOB_RESULT_HANDLE,

&hostHandle,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“connect error!\n”);

goto abort;

}

printf(“connect success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

jobHandle = VixVM_Open(hostHandle,

filepath,

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle,

VIX_PROPERTY_JOB_RESULT_HANDLE,

&vmHandle,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“open host error!\n”);

goto abort;

}

printf(“open host success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

//Authenticate with guest operating system.

jobHandle = VixVM_LoginInGuest(vmHandle,

“Administrator”, // userName

“helloworld”, // password

0, // options

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“login error!\n”);

goto abort;

}

printf(“login success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

abort:

VixHost_Disconnect(hostHandle);

}


(8)快照与快照恢复

快照相关操作函数有设置快照,获取当前快照,获取根快照,按照名字获取快照,获取根快照数量,删除快照,快照恢复等,对应的函数分别为:

VixVM_CreateSnapshot()            //设置快照,记得设置快照前保证已打开虚拟机

VixVM_GetCurrentSnapshot()        //获取当前快照

VixVM_GetNamedSnapshot()          //按照名字获取快照

VixVM_GetNumRootSnapshot()        //获取根快照数量

VixVM_GetRootSnapshot()           //获取根快照

VixVM_RemoveSnapshot()            //删除快照,注意每次只能删除一个

VixVM_RevertToSnapshot()          //快照恢复

示例代码:

#include<stdio.h>

#include<stdlib.h>

#include “vix.h”

int main(int argc, char * argv[])

{

VixHandle hostHandle = VIX_INVALID_HANDLE;

VixHandle jobHandle = VIX_INVALID_HANDLE;

VixHandle vmHandle = VIX_INVALID_HANDLE;

VixError err;

VixHandle snapshotHandle = VIX_INVALID_HANDLE;

char filepath[]=”//home//mrgao//vmware//vm-xp//vm-xp.vmx”;

int result;

int index;

// Connect as current user on local host.

jobHandle = VixHost_Connect(VIX_API_VERSION,

VIX_SERVICEPROVIDER_VMWARE_WORKSTATION,

NULL, // hostName

0, // hostPort

NULL, // userName

NULL, // password,

0, // options

VIX_INVALID_HANDLE, // propertyListHandle

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle,

VIX_PROPERTY_JOB_RESULT_HANDLE,

&hostHandle,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“connect error!\n”);

goto abort;

}

printf(“connect success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

//open a host

jobHandle = VixVM_Open(hostHandle,

filepath,

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle,

VIX_PROPERTY_JOB_RESULT_HANDLE,

&vmHandle,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“open host error!\n”);

goto abort;

}

printf(“open host success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

/*

//create a snapshot

jobHandle = VixVM_CreateSnapshot(vmHandle,

“snapshottest”, // name

NULL, // description

VIX_SNAPSHOT_INCLUDE_MEMORY, // options

VIX_INVALID_HANDLE, // propertyListHandle

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle,

VIX_PROPERTY_JOB_RESULT_HANDLE,

&snapshotHandle,

VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“create snapshot error!\n”);

goto abort;

}

printf(“create snapshot success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

*/

//get a current snapshot

err = VixVM_GetCurrentSnapshot(vmHandle, &snapshotHandle);

if (VIX_OK != err) {

// Handle the error…

printf(“get a current snapshot error!\n”);

goto abort;

}

printf(“get a current snapshot success!\n”);

//get a named snapshot

err = VixVM_GetNamedSnapshot(vmHandle, “snapshottest”,&snapshotHandle);

if (VIX_OK != err) {

// Handle the error…

printf(“get a named snapshot error!\n”);

goto abort;

}

printf(“get a named snapshot success!\n”);

/*

//get a num of root snapshot and get all root snapshot

//注意,通过for循环里获取单个vmHandle并删除,可以实现删除多个快照

err=VixVM_GetNumRootSnapshots(vmHandle,&result);

if (VIX_OK != err) {

// Handle the error…

printf(“get a root snapshot num error!\n”);

goto abort;

}

printf(“get a root snapshot num success!is %d\n”,result);

 

for (index = 0; index < result; index++ ) {

err = VixVM_GetRootSnapshot(vmHandle,index,&snapshotHandle);

if (VIX_OK != err) {

// Handle the error…

printf(“get a root snapshot %d error!\n”,index);

goto abort;

}

printf(“get root snapshots success!\n”);

jobHandle = VixVM_RemoveSnapshot(vmHandle,

snapshotHandle,

0, // options

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“remove a root snapshot %d error!\n”,index);

goto abort;

}

printf(“remove root snapshots success!\n”);

Vix_ReleaseHandle(jobHandle);

Vix_ReleaseHandle(snapshotHandle);

snapshotHandle = VIX_INVALID_HANDLE;

}

*/

//revert to snapshot

//注意,如果已经在可视化窗口中打开了虚拟机,在恢复时候会提示虚拟机已打开,须在关闭状态下使用该函数

jobHandle = VixVM_RevertToSnapshot(vmHandle,

snapshotHandle,

VIX_VMPOWEROP_LAUNCH_GUI, // options,如果保存快照时是开启状态需用这个flag

VIX_INVALID_HANDLE, // propertyListHandle

NULL, // callbackProc

NULL); // clientData

err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);

if (VIX_OK != err) {

// Handle the error…

printf(“revert to snapshot error!\n”);

goto abort;

}

printf(“revert to snapshot success!\n”);

Vix_ReleaseHandle(jobHandle);

jobHandle = VIX_INVALID_HANDLE;

abort:

VixHost_Disconnect(hostHandle);

Vix_ReleaseHandle(snapshotHandle);

Vix_ReleaseHandle(vmHandle);

}


至此,VIX API的基础学习结束。


版权声明:本文为ajfgurjfmvvlsfkjglkh原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。