qemu-guest-agent windows下的監控開發

        windows下的qemu-guest-agent(簡稱qga)的名字叫做qemu-guest-agent-win32,目前最新版的版本號是qemu-guest-agent-win32-0.12.1.2-2.355.el6_4.9.x86_64,下載下來是一個rpm包,在centos6上安裝後就會出現qemu-ga.exe和一個readme。可以看出windows下的qga是根據el6(rhel6/centos6)上的qemu-guest-agent編譯出來的,而qemu-guest-agent的源碼是包含在qemu的源碼中的,所以我們只需要下載qemu-kvm.el6版本的源碼就可以。qemu-kvm-0.12.1.2-2.355.el6_4.9.x86_64是centos6.4上的qemu-kvm版本,爲什麼不用centos6.5的qemu-kvm呢,那是因爲6.4上的src.rpm包裏的specfile是直接可以打包出qemu-guest-agent-win32.rpm的,而6.5的src.rpm包裏的specfile是沒有這一項的,而且6.5對windows版本僅更新了settime和gettime這兩個功能,所以如果只是想快速添加自己的功能,可以直接下centos6.4的qemu-kvm。


1、下載源碼
        從centos6.4的源下載qemu-kvm-0.12.1.2-2.355.0.1.el6_4.9.x86_64.src.rpm,安裝src.rpm包,源碼和補丁解壓到$HOME/rpmbuild/SOURCES,此時的源碼還不是真正的源碼,因爲qga的代碼是作爲補丁在patch文件中的,到SPECS文件夾中rpmbuild –bp qemu-kvm.spec將補丁和tar包的代碼全部解壓到BUILD文件夾中,現在纔是真正的源代碼,可以找到qga文件夾,其中就是qga的代碼了,有win32的就是windows下的代碼。


2、創建打包環境
        爲了更方便的修改代碼和打包,將剛纔解壓到BUILD中的代碼打包成tar.gz包,更換掉SOURCES中的包,刪除SOURCES中的所有patch文件,修改SPECS中specfile將文件中的Patch*和%patch* -p格式的全部刪掉或者註釋掉。現在打包就可以直接打包修改過的源代碼了。


3、文件介紹
        與qga-win32有關的文件有qapi-schema-guest.json,qemu-ga.c,qga/*-win32。qagi-schema-guest.json中定義功能名稱,輸入輸出數據類型,新加的功能函數的具體實現如果是加在commands-win32.c中時則也要在commands-posix.c中加入,linux和windows兩邊功能要一致不然編譯會報錯,即使linux函數沒有實現具體功能,commands.c中是兩邊通用功能。commands-win32.c中就是windows下具體的功能函數,命名爲qmp_*。qemu-ga.c中有windows下服務的創建,有默認virtio路徑,可以在這裏修改。


4、代碼的修改
        舉例:現在我們加入windows下的文件創建功能。
qapi-schema-guest.json中添加功能名稱:

##
# @guest-file-create:
#
# create a file in the guest and retrieve a sign for it
#
# @filepath: Full path to the file in the guest to create.
#
# Returns: 0 on success,-1 on failure.
#
# Since: 0.0.1
##
{ 'command': 'guest-file-create',
  'data':    { 'path': 'str' },
  'returns': 'int' }
commands-win32.c中添加功能函數:
int64_t qmp_guest_file_create(const char *path, Error **err)
{
	const char *mode;
	mode = "wb";
	FILE *fh;

	slog("guest-file-create called, filepath: %s", path);
	fh = fopen(path, mode);
	if (NULL == fh) {
		slog("error on open %s", path);
		error_set(err, QERR_QGA_COMMAND_FAILED, "fopen() failed");
		return -1;
	}
	fclose(fh);
	return 0;

}
commands-posix.c中添加對應函數,可利用現有error不添加功能。

int64_t qmp_guest_file_create(const char *path, Error **err)
{
	error_set(err, QERR_UNSUPPORTED);
	return -1;
}

5、功能的驗證
修改代碼後打包替換掉SOURCES中的tar.gz包,會生成新的rpm包或者直接在BUILD中qemu-kvm-win32-build下拷貝qemu-ga.exe。

利用libvirt創建虛擬機win7,在XML文件device中加入

<channel type='unix'>
   <source mode='bind' path='/var/lib/libvirt/qemu/test.org.qemu.ga.0'/>
   <target type='virtio' name='org.qemu.ga.0'/>
 </channel>
path爲宿主機上的unix domain socket文件路徑,會在虛擬機創建時生成,name爲虛擬機內部生成的serial設備名字。qemu-guest-agent默認的名字是org.qemu.guest_agent.0,由於我修改的vdsm上該名字已經被佔用,所以自己新加一個serial。
將qemu-ga.exe放入win7中,下載需要的dll放在同一個路徑下,使用cmd運行qemu-ga,如果既沒有修改服務,也沒有使用默認設備,可以使用-p來指定自己的serial設備名:
qemu-ga.exe –p \\.\Global\org.qemu.ga.0
在宿主機端使用socat來快速連接:

socat \var\lib\libvirt\qemu\test.org.qemu.ga.0 –
連上後就可以收發命令了
{“execute”:”guest-file-create”,”arguments”:{“path”:”c:\\test.txt”}}
如果成功會收到return 0的返回,並且c:\test.txt創建成功。qemu-ga由於是c語言寫的,linux下實現的很多功能可以直接拷貝到windows下使用,修改起來還是很方便的。


5、參考

exe(rpm)下載路徑:http://linuxsoft.cern.ch/cern/slc64/x86_64/yum/updates/repoview/qemu-guest-agent-win32.html
源碼下載路徑:http://nl.mirror.eurid.eu/centos-vault/6.4/updates/Source/SPackages/

參考文獻1:http://wiki.qemu.org/Features/QAPI/GuestAgent
參考文獻2:http://blog.csdn.net/hbsong75/article/details/9465683
參考文獻3:http://www.cnblogs.com/biangbiang/p/3222458.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章