通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部

  

通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部

  

本文将以宿主上直接写文件到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虚拟机内部