• 定制qga(作业截图)


    一、qga介绍

    qemu guest agent简称qga, 是运行在虚拟机内部的一个守护程序(qemu-guest-agent.service),
    他可以管理应用程序,执行宿主机发出的命令。

    二、证明qga命令可以正常使用

    首先安装好centos
    Ip a查找地址
    在这里插入图片描述
    鼠标右键选择Duplicate tab
    在这里插入图片描述
    ssh 192.168.122.123
    在这里插入图片描述
    在这里插入图片描述
    改名字
    鼠标右键选择rename tab改为guest
    在这里插入图片描述
    另一个改为host
    在guest上面做个测试
    rpm -qa | grep qemu
    在这里插入图片描述
    在host上面做个测试
    rpm -qa | grep qemu
    在这里插入图片描述
    首先在host,虚拟机XML配置文件中要存在如下内容:

    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    在这里插入图片描述
    保存退出
    在guest里面输入systemctl status qemu-guest-agent
    在这里插入图片描述
    因为是dead
    所以需要重启
    在host输入virsh shutdown centos
    在这里插入图片描述
    virsh start centos(启动虚拟机)
    在这里插入图片描述
    在guest重新连接
    在这里插入图片描述
    在guest输入一下命令
    systemctl start qemu-guest-agent
    systemctl status qemu-guest-agent
    在这里插入图片描述
    此时host可以控制guest
    在host输入一下命令

    virsh qemu-agent-command centos --cmd '{"execute":"guest-info"}'
    
    • 1

    在这里插入图片描述
    使用其中一个
    在这里插入图片描述
    结果
    在这里插入图片描述

    三、创建qga安装包

    上传到root目录下
    在这里插入图片描述
    安装

     rpm -i qemu-guest-agent-2.3.0-4.el7.src.rpm
    
    • 1

    报错:warning: group mockbuild does not exist - using root
    则sudo useradd -s /sbin/nologin mockbuild
    再次输入安装命令
    在这里插入图片描述
    在host下面执行命令看有没有问题

    rpmbuild -bp ~/rpmbuild/SPECS/qemu-guest-agent.spec --nodeps --force
    
    • 1

    在这里插入图片描述
    看是否成功
    在这里插入图片描述
    执行以下命令

    mkdir -p ~/tmp
    cp -r ~/rpmbuild/BUILD/qemu-2.3.0/ ~/tmp/
    cp -r ~/rpmbuild/BUILD/qemu-2.3.0/ ~/tmp/qemu-2.3.0.new
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    复制完查看
    在这里插入图片描述

    vim ~/tmp/qemu-2.3.0.new/qga/qapi-schema.json
    
    • 1

    在这个文件按shift加g到最下面,添加

    { 'command': 'hello-world' }
    
    • 1

    在这里插入图片描述
    保存退出

    vim ~/tmp/qemu-2.3.0.new/qga/commands-posix.c
    
    • 1

    在这个文件开头部分添加

    void qmp_hello_world(Error **errp)
    {
        int ret;
        ret = system("touch /Hello-world");
        ret=ret;
    
        return;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    保存退出
    在执行以下两条命令查看有没有问题

    diff -rNu ~/tmp/qemu-2.3.0 ~/tmp/qemu-2.3.0.new/ >~/qemu-ga-new-cmd.patch
    
    • 1
    cp ~/qemu-ga-new-cmd.patch ~/rpmbuild/SOURCES/
    
    • 1

    在这里插入图片描述
    继续修改文件

    vim ~/rpmbuild/SPECS/qemu-guest-agent.spec
    
    • 1

    进入之后搜索
    在这里插入图片描述
    在下面添加一行

    Patch1253: qemu-ga-new-cmd.patch
    
    • 1

    在这里插入图片描述
    再次搜索
    在这里插入图片描述
    在下面添加

    %patch1253 -p4
    
    • 1

    在这里插入图片描述
    保存退出
    查看

    ll rpmbuild/SOURCES/
    
    • 1

    在这里插入图片描述
    有了之后在执行下面命令

    rpmbuild -bb ~/rpmbuild/SPECS/qemu-guest-agent.spec --nodeps --force
    
    • 1

    在这里插入图片描述
    输入

    virsh qemu-agent-command centos --cmd '{"execute":"hello-world"}'
    
    • 1

    报错解决方法
    在这里插入图片描述
    安装
    在这里插入图片描述

    scp /root/rpmbuild/RPMS/x86_64/qemu-guest-agent-2.3.0-4.el7.x86_64.rpm 192.168.122.123:/root/
    
    • 1

    在guest上面
    在这里插入图片描述
    在这里插入图片描述
    输入

    Systemctl status qemu-guest-agent
    Systemctl start qemu-guest-agent
    Systemctl status qemu-guest-agent
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    在host页面执行下面命令

    virsh qemu-agent-command centos --cmd '{"execute":"hello-world"}'
    
    • 1

    在这里插入图片描述
    在guest页面执行下面命令

    setenforce 0
    
    • 1

    在host页面执行下面命令

    virsh qemu-agent-command centos --cmd '{"execute":"hello-world"}'
    
    • 1

    在guest页面执行下面命令
    在这里插入图片描述
    会有下面内容
    在这里插入图片描述

    四、总步骤

    qemu guest agent简称qga, 是运行在虚拟机内部的一个守护程序(qemu-guest-agent.service),
    他可以管理应用程序,执行宿主机发出的命令。
    
    
    首先,虚拟机XML配置文件中要存在如下内容:
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
    
    使用virsh命令启动虚拟机,假设虚拟机名字为centos
    virsh start centos
    
    在主机上执行命令的方法:
    virsh qemu-agent-command centos --cmd '{"execute":"guest-info"}'
    
    输出内容如下:
    
    证明qga命令可以正常使用。
    
    如何制作rpm包
    使用的是centos的系统,在安装定制化的qga时,使用rpm方式安装比较好。下面介绍一下创建qga安装包的方法(以qemu-guest-agent-2.3.0-4.el7为例)。
    
    安装源码包
    先下载源码包qemu-guest-agent-2.3.0-4.el7.src.rpm
    使用命令安装:
    rpm -i qemu-guest-agent-2.3.0-4.el7.src.rpm
    
    修改相关文件
    rpmbuild -bp ~/rpmbuild/SPECS/qemu-guest-agent.spec
    mkdir -p ~/tmp
    cp -r ~/rpmbuild/BUILD/qemu-2.3.0/ ~/tmp/
    cp -r ~/rpmbuild/BUILD/qemu-2.3.0/ ~/tmp/qemu-2.3.0.new
    修改文件 ~/tmp/qemu-2.3.0.new/qga/qapi-schema.json
    修改文件 ~/tmp/qemu-2.3.0.new/qga/commands-posix.c
    生成补丁文件
    diff -rNu ~/tmp/qemu-2.3.0 ~/tmp/qemu-2.3.0.new/ >~/qemu-ga-new-cmd.patch
    cp ~/qemu-ga-new-cmd.patch ~/rpmbuild/SOURCES/
    修改spec文件
    编辑文件~/rpmbuild/SPECS/qemu-guest-agent.spec
    
    找到Patchxxx这样的字符串,xxx表示数字,在其中xxx最大一行下面添加
    
    Patchxxy: patch_file
    假设xxx是最大的数字,则xxy=xxx+1
    
    在当前例子中是添加
    
    Patch1253: qemu-ga-new-cmd.patch
    
    找到%patchxxx -pn这样的字符串,xxx,n表示数字
    
    在其中xxx最大的一行下面添加%patchxxy -pm
    xxy,m为数字。假设xxx是最大的数字,则xxy=xxx+1
    
    在当前例子中是添加
    
    %patch1253 -p4
    -p后面跟随的数字的含义,可以网上搜一下patch的使用方法
    
    执行命令生成安装包
    rpmbuild -bb ~/rpmbuild/SPECS/qemu-guest-agent.spec
    
    命令执行完后,生成的安装包位于:
    
    ~/rpmbuild/RPMS/x86_64/qemu-guest-agent-2.3.0-4.el7.centos.x86_64.rpm
    
    如何定制qga命令
    定制qga命令本质是基于QAPI框架实现QMP命令。
    
    步骤1 : 在qapi schema(qapi模式)文件中添加命令的声明
    步骤2 : 在相应C源码文件中用C实现命令
    步骤3 : 测试命令是否正常
    下面,一步一步的说明如何做,由简及繁
    
    创建无返回值的命令
    新命令是“hello-world”,没有参数,也没有返回值。
    
    在文件qapi-schema.json中添加:
    
    { 'command': 'hello-world' }
    
    说明:
    
    command”关键字定义了一个新的QGA命令,新命令是JSON对象格式的;
    “hello-world”是命令的名称。
    用C语言实现命令“hello-world”
    
    C代码位置在commands-posix.c中:
    
    #include <stdlib.h>
    void qmp_hello_world(Error **errp)
    {
        int ret;
        ret = system("touch /Hello-world");
        ret=ret;
    
        return;
    }
    
    C语言代码说明:
    
    以“qmp_”作为C语言函数的前缀;
    qmp_hello_world()无返回值,与json代码对应;
    有形参“Error **”。这个参数必须有,后面我们会介绍如何返回错误以及使用更多的参数。如果命令不返回错误的话,就不要操作这个参数;
    不需要在头文件中对函数进行声明,QAPI会自动实现;
    C函数的功能是在系统根目录/下创建文件Hello-world;
    函数内与ret变量相关的部分是为了让代码编译通过。
    编译测试
    按照前述制作rpm包的部分,将上述修改添加到qga源码相关文件中,编译制作新的qga rpm包。制作完成后,将旧的qga卸载,安装新的。
    
    将虚拟机重新启动后,在物理机中按前述测试方法执行命令:
    virsh qemu-agent-command live-centos7.2 --cmd '{"execute":"hello-world"}'
    
    执行完后,物理主机内返回:
    
    同时,在虚拟机内根目录下可看到文件Hello-world
    注意:如果没有生成文件,则在虚拟机里面执行setenforce 0 
    
    创建使用参数的命令
    现在,我们给命令hello-world添加参数“message”,参数类型是可选参数,会包含字符串。
    
    在qapi-schema.json文件中修改命令声明
    { 'command': 'hello-world', 'data': { '*message': 'str' } }
    
    在命令声明中,新增加了成员“data”,对应的“:”符号后面的元素,是新增加的参数。message前面的星号,表示参数“message”是可选的。“str”表示“message”的类型,表示常量字符串。
    
    qga命令中支持的参数类型如下所示(针对qemu 2.3.0版本json文件):
    
    整数:int(与int64等价)、uint64、uint32、uint16、uint8、int64、int32、int16、int8
    布尔
    枚举
    str(修饰参数时对应于C语言中的const char *,在其它地方对应于C语言中的char *)
    size(与uint64等价)
    number(对应于C语言中的double)
    自定义的类型。
    更新文件commands-posix.c中的C语言代码
    
    #include <stdlib.h>
    
    void qmp_hello_world(bool has_message, const char *message, Error **errp)
    {
        int ret;
        char msg[1024] = {'\0'};
    
        ret = system("touch /Hello-world");
        if (has_message)
        {
            sprintf(msg,"echo \"%s\" > /Hello-world", message);
        }
        else
        {
            sprintf(msg,"echo \"%s\" > /Hello-world", "hello world");
        }
        ret = system(msg);
        ret = ret;
    
        return;
    }
    
    编译测试
    编译安装后,分别执行下述命令
    
    virsh qemu-agent-command live-centos7.2 --cmd '{"execute":"hello-world"}'
    
    virsh qemu-agent-command live-centos7.2 --cmd '{ "execute":"hello-world","arguments":{"message":"We love KVM"}}'
    
    两条命令都会返回
    
    “{"return":{}}”
    
    
    在虚拟机内文件/Hello-world中,分别会看到内容“hello world”和“We love KVMhttps://github.com/tiehuis/2048-cli
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
  • 相关阅读:
    PostGIS的10个最佳实践
    吴恩达《微调大型语言模型》笔记
    软件无线电处理平台解决方案:330-基于FMC接口的Kintex-7 XC7K325T PCIeX4 3U PXIe接口卡
    flink standalone部署模式
    CAD Exchanger SDK 3.23.0 的亮点
    Apache基于IP和端口
    【Servlet】Servlet学习之基础篇
    C语言指针从基础到进阶
    ABAP BASE64/STRING/XSTRING/BINARY 等之间的转换总结
    深度学习(part5)--深度学习框架Keras
  • 原文地址:https://blog.csdn.net/weixin_46048542/article/details/126923325