• qmp的简单使用


    QMP是一种基于JSON格式的传输协议,可使用QMP与一个QEMU虚拟机实例进行交互,例如查询虚拟机的相关状态等,以下就QMP的使用进行简单介绍。

    可以通过libvirt向一个运行的虚拟机发送qmp命令,也可以使用qemu命令启动一个虚拟机,之后发送qmp命令。上述两种方式各有优点,第一种方式可用于相关工具的开发及使用,第二种方式由于可以看到qemu中的相关输出,因此可用于开发阶段的调试。

    补充:之前以为通过libvirt的方式(即virsh命令)发送qmp命令看不到qemu端的输出,实际上其输出存放在/var/log/libvirt/qemu/文件夹下的日志文件中,其中log文件名与虚拟机名字关联。因此该种方式也可以用于开发阶段。

    (一)简单使用

    可通过如下命令开启虚拟机并使用qmp,其中/usr/local/bin/qemu-system-x86_64-libvmi 为虚拟机使用的qemu,/home/cmj/sourcecode/test.img为虚拟机镜像,使用端口号4444进行通信。因为qmp本质上是一种Unix socket的本地通信机制,通信内容基于json格式。

    /usr/local/bin/qemu-system-x86_64-libvmi --enable-kvm -m 1024 /home/cmj/sourcecode/test.img -chardev socket,id=qmp,port=4444,host=localhost,server -mon chardev=qmp,mode=control,pretty=on

    运行上述命令后输出如下:

    使用 telnet localhost 4444连接qemu,如下:

    输入使能qmp命令:

    {"execute":"qmp_capabilities"}

    查询kvm信息:

    {"execute":"query-kvm"}

    execute指定要执行的命令,return返回命令执行后的结果,若没有返回数据则为空。

    (二)添加新的qmp命令

     可以通过修改qemu添加自定义的qmp命令用于交互,具体如下:

    (1) 在qapi-schema.json的尾部指定一个新的qmp命令,编译的过程中会自动生成该命令的json格式的解析参数:

    command为发送的命令格式,为get_testdata;data为传入的参数,此处传入两个参数,均为整型;返回值为testdata,testdata为自定义的数据类型,如上图第一行,该数据类型包含两个int型的变量。

    (2)在qmp.c中添加该命令的具体实现:

    testdata *qmp_get_testdata( int64_t index_value,int64_t count_value, Error **errp )
    {
    
        printf("qmp test get data
    ");
    
        testdata *data;
        data = g_malloc0(sizeof(*data));
        
        data->index = index_value;
        data->count = count_value;
        printf("index:%d count:%d
    ",data->index,data->count);
        return data;
    }

    命令必须以qmp开头,testdata *表示返回该类型的指针,参数errp用于返回错误信息。不需要添加该函数的声明,因为qapi可自动化实现函数声明的任务。

    (3)在文件qmp-commands.hx中添加以下内容:

    在该文件中,注释内容放在SQMP和EQMP之间。name为命令名称;args_type为参数及类型,i表示int型。

    (4)make 编译修改后的qemu

    注意若修改的qemu与虚拟机之前使用的qemu不是同一个时,需要将虚拟机使用的qemu改为刚刚修改的qemu,修改虚拟机的xml文件为修改后的qemu:

    修改后使用virsh define text.xml 重新定义

    (5)开启虚拟机进行新的qmp命令测试

    a. 使用qemu命令开启虚拟机,使用Telnet连接,输入{"execute":"qmp_capabilities"} 使能命令后,输入新定义的qmp命令:arguments为定义的参数

    执行完毕后,return中返回index及count,qemu端的输出如下:

    b. 向运行的虚拟机发送qmp命令

    virsh start test开启虚拟机之后,发送qmp命令如下:

    virsh -c qemu:///system qemu-monitor-command test "{ "execute": "get_testdata", "arguments": { "index_value": 1, "count_value": 101} }"

    其中test为虚拟机名称,arguments为参数。

    执行结果如下:

    以上则为qmp命令的简单使用。

    参考:https://blog.csdn.net/wangwei222/article/details/80055615

    https://www.cnblogs.com/YaoDD/p/5328088.html

  • 相关阅读:
    [Luogu1993] 小K的农场
    [Noip2013] 车站分级
    [Noip2003]加分二叉树
    [Luogu3797] 妖梦斩木棒
    UPC 6616 Small Mulitple
    STL容器之优先队列
    Dijkstra和Floyd算法
    最短路径问题---Dijkstra算法详解
    并查集
    洛谷 P1217
  • 原文地址:https://www.cnblogs.com/ccxikka/p/9694884.html
Copyright © 2020-2023  润新知