定制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>

在这里插入图片描述
在这里插入图片描述
保存退出
在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"}'

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

三、创建qga安装包

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

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

报错: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

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

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

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

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

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

{ 'command': 'hello-world' }

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

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

在这个文件开头部分添加

void qmp_hello_world(Error **errp)
{
    int ret;
    ret = system("touch /Hello-world");
    ret=ret;

    return;
}

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

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/

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

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

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

Patch1253: qemu-ga-new-cmd.patch

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

%patch1253 -p4

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

ll rpmbuild/SOURCES/

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

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

在这里插入图片描述
输入

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

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

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

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

Systemctl status qemu-guest-agent
Systemctl start qemu-guest-agent
Systemctl status qemu-guest-agent

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

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

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

setenforce 0

在host页面执行下面命令

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

在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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值