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的基础学习结束。