Qemu-guest-agent(QGA)介面例項開發
vm 根目錄磁碟使用量採集
功能介紹:主機上libvirt呼叫qga介面獲取vm內部根目錄磁碟使用量。
QGA介面:guest-filesystem-usagerate
介面引數:size(磁碟總容量),used(磁碟使用量),available(磁碟可用量)
Vm內部QGA服務:qemu-ga
介面原始碼下載(含qemu-ga):https://download.csdn.net/download/qq_28693567/10611270
1.建立一個裝載virtio-serial裝置的vm,並在vm內部執行QGA服務
(1)virtio-serial的xml:
<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/test.agent'/>
<target type='virtio' name='org.qemu.guest_agent.0' state='disconnected'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
(2) vm內部檢視串列埠裝置
[[email protected] qemu-2.11.0]# ls /dev/virtio-ports/org.qemu.guest_agent.0
/dev/virtio-ports/org.qemu.guest_agent.0
(3)執行qga服務
[[email protected] qemu-2.11.0]# /home/qemu-ga
2.主機上libvirt呼叫QGA介面
(1) 檢視vm列表
virsh list
(2) 採集vm 根目錄資料,假設vm的host id是3
virsh qemu-agent-command 3 '{"execute":"qmp-guest-filesystem-usagerate"} '
{"return":{"available":25784112,"size":36805060,"used":11020948}}
3.Qga介面開發,請參考https://blog.csdn.net/qq_28693567/article/details/78963839
4.原始碼
(1)介面實現程式碼,檔案路徑qemu-2.11.0/qga/commands-posix.c
struct FilesystemUse *qmp_guest_filesystem_usagerate(Error **err)
{
struct FilesystemUse *ptr;
char cmd[100] = "df |grep '/dev/mapper/centos-root'|awk -F ' ' 'END {print $0}'";
char line[100];
char * spit;
FILE * pipe = NULL;
int i;
//ptr = (struct FilesystemUse *)malloc(sizeof(struct FilesystemUse));
ptr = g_new0(FilesystemUse, 1);
if(( pipe = popen(cmd, "r")) != NULL)
{
if(fgets(line, sizeof(line),pipe) != NULL){
spit = strtok(line, " ");
for( i=0; i<6; i++ ){
if( spit )
{
if(i == 1){ptr->size = atoi(spit);} /* the unit is 1K-blocks */
if(i == 2){ptr->used = atoi(spit);} /* the unit is 1K-blocks */
if(i == 3){ptr->available = atoi(spit);} /* the unit is 1K-blocks */
//if(i == 5){ptr->mountpoint = spit;}
//if(i == 0){ptr->filesystem = spit;}
spit = strtok(NULL," ");
}
}
spit = strtok(NULL," ");
}
}
return ptr;
}
(2)訊息結構體,檔案路徑qemu-2.11.0/qga/qapi-schema.json
{ 'struct': 'FilesystemUse',
'data': {'*filesystem': 'str', '*mountpoint': 'str', 'size': 'uint64', 'used': 'uint64', 'available':'uint64'} }
{ 'command': 'guest-filesystem-usagerate', 'returns': 'FilesystemUse' }
(3)介面函式宣告檔案,檔案路徑qga/qapi-generated/qga-qmp-commands.h
FilesystemUse *qmp_guest_filesystem_usagerate(Error **err)