当前位置:编程学习 > 网站相关 >>

应用Libvirt连接KVM虚拟化平台

  发布一段C代码,用于连接指定的KVM宿主机器,获得该宿主机器的配置信息,以及该主机上所有的虚拟主机列表、状态及配置信息:
      
#include <stdio.h>
#include <stdlib.h>
#include <libvirt/libvirt.h>
 
void ListDom(virConnectPtr conn)
{
    char **inactiveDom;
    virDomainPtr *allDom;
    int nInActiveDoms = virConnectNumOfDefinedDomains(conn);  
    allDom = malloc(sizeof(virDomainPtr)* nInActiveDoms);
    int i = 0;
    char str[200];
     virDomainInfo t;
    if(nInActiveDoms != 0)
    {
        printf("inactive num: %d\n",nInActiveDoms);
        inactiveDom = malloc(sizeof(char*) * (nInActiveDoms));
        nInActiveDoms  = virConnectListDefinedDomains(conn , inactiveDom , nInActiveDoms);   
        printf("numOfInactiveDom*************:%d\n", nInActiveDoms);
   
        for(i=0 ; i<nInActiveDoms; i++)
        { 
            printf("name:%s\n",inactiveDom[i]); 
            allDom[i] = virDomainLookupByName(conn , inactiveDom[i]);
            virDomainGetUUIDString(allDom[i],str);
            printf("uuid:%s | os:%s\n",str,virDomainGetOSType(allDom[i]));    
            virDomainGetInfo(allDom[i],&t);
            printf("HostName:%s\n",virDomainGetName(allDom[i]));
            printf("state:%d|maxmem:%d|memused:%d|cpunum:%d|cputime:%ld\n",t.state,t.maxMem,t.memory,t.nrVirtCpu,t.cpuTime);
          }
    }
}
void ListActiveDom(virConnectPtr conn)
{
    int numOfActiveDom = virConnectNumOfDomains(conn); 
    int activeDom[numOfActiveDom]; 
    virDomainPtr *allDomains;      
     virDomainInfo t;
    int i ;
    char str[200];
    allDomains = malloc(sizeof(virDomainPtr)* numOfActiveDom);  
    numOfActiveDom = virConnectListDomains(conn , activeDom , numOfActiveDom);  
    
    printf("Active Dom: \n");   
    for(i=0 ; i<numOfActiveDom ; i++){
        printf("id:%d\n",activeDom[i]);  
        allDomains[i] = virDomainLookupByID(conn ,activeDom[i]);  //ͨ¹ýidÈ¡Domain  
        virDomainGetUUIDString(allDomains[i],str);
        printf("uuid:%s | os:%s\n",str,virDomainGetOSType(allDomains[i]));    
        printf("HostName:%s\n",virDomainGetName(allDomains[i]));
        virDomainGetInfo(allDomains[i],&t);
        printf("state:%d|maxmem:%d|memused:%d|cpunum:%d|cputime:%ld\n",t.state,t.maxMem,t.memory,t.nrVirtCpu,t.cpuTime);
    }
}
int main(int argc, char *argv[])
{
    virConnectPtr conn;
    char* caps;
    virNodeInfo nodeinfo;    
    char str[200];
    char *struuid[200];
    int max = 0;
    int i = 0;
    virNodeMemoryStats *pMem;
    int pN[100];
    while(1)
    {
       printf("Input KVM Host:>");
       gets(str);
       printf("\n");
       if(strcmp(str,"quit") == 0)
       {
          printf("Bye-Bye\n");
          exit(0);
       }
       conn = virConnectOpen(str);
       if (conn == NULL) {
           fprintf(stderr, "Failed to open connection to qemu:///system\n");
           continue;
       }
       caps = virConnectGetCapabilities(conn);
       fprintf(stdout, "Capabilities:\n%s\n", caps);
       free(caps);
 
       printf("HostName: %s\n",virConnectGetHostname(conn)); 
       fprintf(stdout, "Virtualization type: %s\n", virConnectGetType(conn));
 
       virNodeGetInfo(conn, &nodeinfo);
       fprintf(stdout, "Model: %s\n", nodeinfo.model);
       fprintf(stdout, "Memory size: %lukb\n", nodeinfo.memory);
       fprintf(stdout, "Number of CPUs: %u\n", nodeinfo.cpus);
       fprintf(stdout, "MHz of CPUs: %u\n", nodeinfo.mhz);
       fprintf(stdout, "Number of NUMA nodes: %u\n", nodeinfo.nodes);
       fprintf(stdout, "Number of CPU sockets: %u\n", nodeinfo.sockets);
       fprintf(stdout, "Number of CPU cores per socket: %u\n", nodeinfo.cores);
       fprintf(stdout, "Number of CPU threads per core: %u\n", nodeinfo.threads);
    /*   printf("Sysinfor :[%s]\n",virConnectGetSysinfo(conn,0));
 
       pMem = malloc(sizeof(virNodeMemoryStats)* 100);
       virNodeGetMemoryStats(conn,VIR_NODE_MEMORY_STATS_ALL_CELLS,pMem,pN,0);
        for(i = 0; i < 10; i++)www.zzzyk.com
        {  
            printf("MEM STAT\n%s - %ld\n",pMem[i].field,pMem[i].value);
        }*/
       ListDom(conn);
       ListActiveDom(conn);
       virConnectClose(conn);
    }
    return 0;
}
 
 
执行效果如下:
[root@kvm T]# ./t 
Input KVM Host:>qemu+ssh:///system
补充:综合编程 , 其他综合 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,