1. 程式人生 > >Qemu-guest-agent(QGA)介面例項開發

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)