本文将以宿主上直接写文件到VM内部为例讲解为何要注入以及如何实现
标记:qemu-ga, qemu客人代理,kvm, guest-file-write,注入
<强>小慢哥的原创文章,欢迎转载强>
<人力资源/>目录
?为什么要“注入”到VM内部
?如何实现“注入“
?步骤1。为虚拟机配置频道
?步骤2。部署qemu-ga
?步骤3。注入操作说明
?第四。Base64计算
?顾不上。开始注入
?附1。qemu-ga支持的所有指令
?附2。配置多个频道
?参考文档
为什么要“注入”到VM内部
<强>原因很简单:在VM外部无法实现,只能进入到VM内来实现强>
KVM不像码头工人(容器)只是对进程进行cgroup隔离,KVM是全封闭的环境。
对于基于KVM的虚拟机来说,通常存在如下需求:
?<强>在线修改密码强>
?<强>在线增加公钥强>
?<强>在线采集性能>强(如cpu使用率,负载,内存使用量等性能指标)
?<强>其他各种在线功能强>
上述这些场景的共性:仅在VM外部是无法实现的。因此就有了多种解决方案,但无论哪种解决方案都要同时满足以下2点才能实现:
?<>强通道强>:在VM内部与外部(宿主)之间打开一个通道,可以进行数据交互
?<>强剂强>:在VM内部种下一个代理,用于接收外部的指令并反馈结果
在VM内部种下代理的做法可以形象地称之为<强>“注入注入“强>
<人力资源/>如何实现“注入”
<强>第一步,打开通道强>
有2类方法:
?<>强走网络强>:会复杂一些,需要提前预插入一张管理网卡,或者利用已有网卡+特殊的路由来确保数据能走出去,这带来了较为复杂的网络拓扑
?<>强走设备强>:简单很多,只需在VM内部和宿主之间建立一个设备通道即可。比如为KVM虚拟机增加一个字符设备,并在宿主上映射为一个套接字文件。字符设备与套接字之间形成了一个通道,通过该通道就可以进行内外数据互通
"走网络”不是本文想要介绍的,接下来所有内容均为“走设备”
<强>第二步,启动剂强>
在虚拟机里启动一个代理,实时读取字符设备,实现与宿主的数据交互。
在通道中发送与接收什么样的数据,是可以自己定义的,也可以使用KVM官方实现的解决方案,称为Qemu客人代理,简称qemu-ga。它包含2方面:
?<强>频道中传送数据的协议定义强>:基于JSON的格式
?<强> VM内的代理强>:启动一个名叫qemu-ga的守护进程,该进程将从字符设备里获取传进来的json指令,然后根据指令执行相关命令,并将结果通过字符设备返回给宿主
qemu-ga的好用之处在于其封装的指令兼容了一些不同的操作系统,比如写文件指令guest-file-write,既可以用于linux也可以用于窗户。
关于qemu-ga的配置与使用,笔者之前已写过一篇文章《基于QMP实现对qemu虚拟机进行交互》,详细介绍其工作原理及基本使用方法,这里附上地址
<代码> https://www.toutiao.com/i6646012291059810823/代码>
由于本文主题是“注入写文件”,因此接下来将重点阐述如何写文件,不过也会将qemu-ga的部署与启用方法再次贴出。
<人力资源/>步骤1。为虚拟机配置通道
通过libvirt启动的虚拟机,可以在XML里增加一段配置
<代码> & lt;通道类型=皍nix”比; & lt;源模式==鞍蠖ā甭肪丁?tmp/channel.sock”/比; & lt;目标类型=皏irtio”name=' org.qemu.guest_agent.0/比; & lt;/channel> 代码>
注意:上面这段配置要放在<代码>,lt; devices& gt;> 代码段落中
<人力资源/>步骤2。部署qemu-ga
1 ? ?<>强安装qemu-ga 强>
在VM内部安装并启动qemu-ga, linux和windows均支持qemu-ga,许多linux发行商都会提供自己的qemu-ga,比如rhel/centos, fedora, ubuntu, opensuse都有提供编译好的qemu-ga,可以直接下载使用。而windows系统需要下载virtio-win,其中有包含一些virtio的赢得驱动以及qemu-ga安装包,也可以仅下载qemu-ga安装包
<代码> # rhel/centos yum安装qemu-guest-agent #窗口,最新virtio-win iso https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/#窗口,最新qemu-ga安装包 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-qemu-ga/通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部