剖析PVE虚拟机中qemu-guest-agent实现原理

一、qemu-guest-agent介绍

qemu guest agent简称qga, 是在虚拟机中运行的守护进程,他可以管理应用程序,执行宿主机发出的命令,返回自身信息,如:ip 信息、服务状态等。

二、PVE内虚拟机开启qemu-guest-agent

pve中的虚拟机默认状态下不会开启qemu-guest-agent,通过配置选项中的配置开启qemu-guest-agent,点击确认,虚拟机再次启动时,则会生效。 

配置 qemu-guest-agent

 同时如果是linux虚拟机,会自动在虚拟机内部安装qemu-guest-agent客户端,如果没有,也可以手动在虚拟机内部安装qemu-guest-agent服务,并使服务处于开启状态。

这时打开pve页面观察虚拟机该要信息,就可以发现,已经拿到了网卡的ip和mac,如果没有则是虚拟机内部没有配置网卡。添加一块网卡即可显示。

三、分析qemu-guest-agent实现原理

查阅资料发现QEMU是通过串口发布GA,虚拟机内部的串口和宿主机上的unix socket文件,那么两者是如何实现的呢。

查看虚拟机启动命令

/usr/bin/kvm -id 104 -name Copy-of-VM-centos,debug-threads=on -no-shutdown -chardev socket,id=qmp,path=/var/run/qemu-server/104.qmp,server=on,wait=off -mon chardev=qmp,mode=control -chardev socket,id=qmp-event,path=/var/run/qmeventd.sock,reconnect=5 -mon chardev=qmp-event,mode=control -pidfile /var/run/qemu-server/104.pid -daemonize -smbios type=1,uuid=c6b48a9b-ecbd-4273-8b01-bdc0d06729d3 -smp 4,sockets=2,cores=2,maxcpus=4 -nodefaults -boot menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg -vnc unix:/var/run/qemu-server/104.vnc,password=on -cpu kvm64,enforce,+kvm_pv_eoi,+kvm_pv_unhalt,+lahf_lm,+sep -m 4096 -object iothread,id=iothread-virtioscsi0 -device pci-bridge,id=pci.1,chassis_nr=1,bus=pci.0,addr=0x1e -device pci-bridge,id=pci.2,chassis_nr=2,bus=pci.0,addr=0x1f -device pci-bridge,id=pci.3,chassis_nr=3,bus=pci.0,addr=0x5 -device vmgenid,guid=5c627e4a-d183-4241-a12a-2df2b9b15862 -device piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2 -device usb-tablet,id=tablet,bus=uhci.0,port=1 -device VGA,id=vga,bus=pci.0,addr=0x2 -chardev socket,path=/var/run/qemu-server/104.qga,server=on,wait=off,id=qga0 -device virtio-serial,id=qga0,bus=pci.0,addr=0x8 -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3,free-page-reporting=on -iscsi initiator-name=iqn.1993-08.org.debian:01:6ec169c0533f -drive file=/mnt/ssd/template/iso/CentOS-7-x86_64-DVD-2009.iso,if=none,id=drive-ide2,media=cdrom,aio=io_uring -device ide-cd,bus=ide.1,unit=0,drive=drive-ide2,id=ide2,bootindex=101 -device virtio-scsi-pci,id=virtioscsi0,bus=pci.3,addr=0x1,iothread=iothread-virtioscsi0 -drive file=/mnt/ssd/images/104/vm-104-disk-0.qcow2,if=none,id=drive-scsi0,format=qcow2,cache=none,aio=io_uring,detect-zeroes=on -device scsi-hd,bus=virtioscsi0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0,id=scsi0,bootindex=100 -machine type=pc+pve0

 发现与为开启 qemu-guest-agent 之前差别,发现多出来了三行命令。

-chardev socket,path=/var/run/qemu-server/104.qga,server=on,wait=off,id=qga0

-device virtio-serial,id=qga0,bus=pci.0,addr=0x8

-device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0

读取这三条配置命令可以发现,一个字符设备,两个物理设备,分析路径可以找到 /var/run/qemu-server/104.qga,在宿主机上,这就是前文所说的unix socket文件。

 第二个设备,为物理设备则是出现在了虚拟机内部,virtio-serial 为虚拟串口,id 为qga0,bus=pci.0为设备与总线连接,addr 为地址。

第三个设备则是虚拟机内部的虚拟串口名称配置,表示与 id 为qga0的虚拟串口相连,名称为org.qemu.guest_agent.0,我们去虚拟机内部查看。

 可以看到在dev下的virtio-ports文件内多出了一个名为org.qemu.guest_agent.0的设备,这应该就是虚拟串口文件。

四、测试unix socket文件与org.qemu.guest_agent.0串口的关联

为了验证我们找到的两个文件是否真的是qemu-guest-agent连接的桥梁为此进行如下验证

在宿主机执行

socat - UNIX-CONNECT:/var/run/qemu-server/104.qga

 在虚拟机监听执行

tail -f /dev/virtio-ports/org.qemu.guest_agent.0

注意,虚拟机需要关闭qemu-guest-agent 服务,否则文件会被占用。

两端都打后,在宿主机输入内容,则虚拟机上也会显示。

注:此种方法需要先执行,虚拟机命令,在执行宿主机命令。

由此可以确定qemu-guest-agent实现原理就是通过宿主机的socket文件,和虚拟机虚拟串口设备绑定实现的通信。windows虚拟机和linux虚拟机,实现逻辑大致相同,唯一不同之处则是,Linux 虚拟机是通过虚拟串口直接通信,而window则是通过全局命名空间简介访问虚拟串口。后续会单开一篇文章介绍。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值