一、qga简介
1、qga工具
qemu guest agent,简称qga,是一个运行在虚拟机内部的普通应用程序,可实现宿主机libvirt和虚拟机的通信,宿主机可通过向虚机中的qga发送命令控制虚机。
这种通信不依赖网络,而是通过virtio-serial的方式。使用virtio传递消息,对虚拟机和主机的网络设置没有任何要求,且效率更高,类似于VMware Tools。
2、宿主机libvirt和VM通信方式选择
宿主机若要和VM通信,需要满足以下两个条件:
1)vm内部和外部宿主机之间,打开一个通道,进行数据交互
2)vm内部需要安装agent,用于接收外部宿主机具体的指令,并反馈结果
其中,打开通道有2类方法:
(1)走网络:需预插入一张管理网卡,增加网络拓扑复杂性
(2)走设备:只需在VM内部和宿主之间建立一个设备通道,实现简单,为当前使用方式
QEMU通过串口设备的模拟,为宿主机和虚拟机提供了一个数据通道(channel),这个通道的两端分别是在虚拟机内看到的串口和在宿主机上看到的unix socket文件。
串口设备的速率较低,适合小数据量的交换。
3、基本实现原理
1)创建虚机时,需要在xml中配置channel段,写入相关参数,启动虚机时,会在宿主机上生成对应unix socket文件,同时,会在vm里生成一个字符设备,生成的unix socket和字符设备可以理解为一个channel隧道的两端
2)虚拟机镜像制作时,安装好qemu-ga守护进程并配置开启自启动,qemu-ga进程会监听字符设备。
3)宿主机上,将虚机中qga支持的rpc指令,通过channel发送,虚机中的qemu-guest-agent从串口设备收到数据后,执行相关指令。可实现文件读写、密码修改等
二、制作Guest镜像,部署qemu-ga
1、linux虚机安装qemu-ga
(1)rhel/centos安装qga
yum install qemu-guest-agent
(2)配置开机启动
systemctl enable qemu-guest-agent
(3)按需修改/etc/sysconfig/qemu-ga配置文件
[root@centos7-001 ~]# cat /etc/sysconfig/qemu-ga
# Default: /dev/virtio-ports/org.qemu.guest_agent.0
DEVPATH="/dev/virtio-ports/org.qemu.guest_agent.1"
# 禁用指定的指令
#BLACKLIST_RPC=""
2、Windows虚机安装qemu-ga
windows系统需要下载virtio-win,以及qemu-ga安装包
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-qemu-ga/
三、xml配置virtio对应设备,创建虚机
1、libvirt在虚拟机创建时启动virtio通道,在xml虚机配置中加入virtio通道设备,如下:
<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/org.qemu.guest_agent.1.instance-00000284.sock'/>
<target type='virtio' name='org.qemu.guest_agent.1'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
其中,path为virtio通道在主机本地的映射节点文件,宿主机可以基于此socket文件,通过unix sock实现与虚拟机的通信
</