使用Libvirt API查看虚拟机(C语言版)

使用Libvirt API查看虚拟机(C语言版)

1、使用virsh的交互模式查看管理虚拟机

(1) 使用virt-manager创建虚拟机后,会在“/etc/libvirt/qemu”目录下生成相应的配置文件ubuntu16.04.xml。
在这里插入图片描述
使用“cat ubuntu16.04.xml”查看该配置文件。
使用Libvirt API查看虚拟机(C语言版)_第1张图片
(2) 使用命令“service libvirt-bin status”或命令“ps –el|grep libvirtd”查看libvirtd进程是否启动。
使用Libvirt API查看虚拟机(C语言版)_第2张图片
(3) 复制“/etc/libvirt/qemu”目录下的“ubuntu16.04.xml”文件,改名为“demo.xml”,命令为“cp ubuntu16.04.xml demo.xml”,然后使用“vim demo.xml”打开文件,修改如下内容:
修改标签内容,该标签内容表示虚拟机名;(第9行)
修改标签值,不要重复;(第10行)使用Libvirt API查看虚拟机(C语言版)_第3张图片
修改标签内容,指定自己的虚拟机镜像文件;(第41行)
使用Libvirt API查看虚拟机(C语言版)_第4张图片
修改标签如下,使用vnc连接虚拟机。(第82行)
其中“port=’-1’”表示不设置端口,默认使用的是“5900”;
在这里插入图片描述
(4) virsh分为命令模式和交互模式。使用virsh命令的“-c”参数来建立本地连接,查看本地运行的虚拟机,命令为“virsh –c qemu:///session”(或直接使用“virsh”命令)。进入virsh交互模式后,使用“list”命令可以查看当前运行的虚拟机信息。
使用Libvirt API查看虚拟机(C语言版)_第5张图片
“list --all”命令可以查看当前全部,包括启动和未启动的虚拟机 。
使用Libvirt API查看虚拟机(C语言版)_第6张图片
(5) 使用virsh的“define demo.xml”命令定义虚拟机(取消定义虚拟机的命令为“undefine”),该命令执行后,虚拟机只是从指定的XML文件进行定义,并没有真正的启动。因此,再次执行“list --all”命令同样没有任何虚拟机信息。使用virsh命令下的“start demo”命令开启虚拟机,再使用“list --all”进行查看。
使用Libvirt API查看虚拟机(C语言版)_第7张图片
(6) 在virsh中使用命令“vncdisplay demo”可以查看vnc的端口号。
使用Libvirt API查看虚拟机(C语言版)_第8张图片
然后再打开一个终端输入命令“vncviewer :0”,可以查看虚拟机demo的界面。
使用Libvirt API查看虚拟机(C语言版)_第9张图片
也可以在virt-manager中查看虚拟机。
使用Libvirt API查看虚拟机(C语言版)_第10张图片
(7) 使用virsh查看虚拟机其他相关信息,使用“vcpuinfo demo”查看虚拟cpu信息。
使用Libvirt API查看虚拟机(C语言版)_第11张图片
(8) 使用“domid demo”查看虚拟机demo的域编号。
使用Libvirt API查看虚拟机(C语言版)_第12张图片
domname 2”命令表示通过虚拟机的id编号查看其name属性,“dominfo 2”表示通过虚拟机的id编号值查看虚拟机信息。
使用Libvirt API查看虚拟机(C语言版)_第13张图片
(9) 使用“shutdown demo”命令关闭虚拟机。
使用Libvirt API查看虚拟机(C语言版)_第14张图片
(10) 在定义虚拟机的同时启动虚拟机,使用“virsh create /etc/libvirt/qemu/demo.xml”命令。
使用Libvirt API查看虚拟机(C语言版)_第15张图片
(11) 在virsh下输入“quit”命令退出virsh。
在这里插入图片描述

2、使用libvirt API查询虚拟机状态

(1) 使用virsh命令“virsh create /etc/libvirt/qemu/demo.xml”开启demo虚拟机,“list”查看demo的id号。
使用Libvirt API查看虚拟机(C语言版)_第16张图片
(2) 再打开一个终端,在vim中使用libvirt API编写程序libvirt-conn.c,命令为“vim libvirt-conn.c”。修改代码最后“getInfo()”函数的参数为上一步“list”中虚拟机的编号,这里修改为“3” 。
libvirt-conn.c代码用于查询某个域的信息。

#include 
#include 
#include 

virConnectPtr conn=NULL;//virConnectPtr代表到Hypervisor的连接

virConnectPtr getConn() { //建立到Hypervisor的连接
    //建立一个到本地Hypervisor的连接
    conn=virConnectOpenReadOnly(NULL);
    if(conn==NULL) {
    printf("error,cann't connect!");
        exit(1);
    }
    return conn;
}

int getInfo(int id) { //获取指定id的客户机的信息
    const char *name = NULL;
    virDomainPtr dom=NULL;//代表节点(服务器)上的域(虚拟机)
    virDomainInfo info;//代表节点上的域信息
    conn=getConn();
    //根据域的id值在conn连接上查找相应的域
    dom=virDomainLookupByID(conn,id);
    if(dom==NULL) {
        printf("error,cann't find domain!");
        virConnectClose(conn);
        exit(1);
    }
    //virDomainGetInfo函数将指定域的信息放置在virDomainInfo中,失败时返回-1
    if(virDomainGetInfo(dom,&info)<0) {
        printf("error,cann't get info!");
        virDomainFree(dom);//释放相应的域
        exit(1);
    }
    name = virDomainGetName(dom);
    printf("id\t名称\t\t状态\n");
    //info.state表示节点中的域的运行状态
    printf("%d\t%s\t\t%d\n",id,name,info.state);
    //表示该域分配的最大内存
    printf("the Domain allowed max memory is : %ld KB\n",info.maxMem);
    //表示该域使用的内存
    printf("the Domain used memory is : %ld KB\n",info.memory);
    //表示该域的虚拟CPU个数
    printf("the Domain vCPU number is : %d\n",info.nrVirtCpu);
    if(dom!=NULL) {
        virDomainFree(dom);
    }
    if(conn!=NULL) {
        virConnectClose(conn);//释放连接
    }
    return 0;
}

int main() {
    getInfo(3);
    return 0;
}

(3) 使用命令“gcc libvirt-conn.c -o libvirt-conn -lvirt”编译libvirt-conn.c文件。使用gcc编译时,需要加上“-lvirt”参数,这个参数表示使用gcc编译源文件时需要指定程序连接时依赖的库文件,“-lvirt”表示连接libvirt库。
在这里插入图片描述
(4) 编译成功后生成libvirt-conn可执行文件,使用命令“./libvirt-conn”运行该可执行文件。
libvirt-conn.c代码用于查询某个域的信息。

id 名称 状态
“id”显示虚拟机的id号;“名称”显示虚拟机名称;
“状态”中的“1”由info.state得来,表示节点中的域的运行状态为正在运行;
“the Domain allowed max memory is : 1048576 KB”:表示该域分配的最大内存为1048576KB,即1G;
“the Domain used memory is : 1048576 KB”:表示该域使用的内存为1G;
“the Domain vCPU number is : 1”:表示该域的虚拟CPU个数为1;

使用Libvirt API查看虚拟机(C语言版)_第17张图片
(5) 可以使用vnc(端口号为0)查看虚拟机,也可以使用virt-manager查看虚拟机。

你可能感兴趣的:(KVM)