From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:36482) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QhMXN-0007hV-Nt for qemu-devel@nongnu.org; Thu, 14 Jul 2011 10:05:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QhMXH-0001j8-Oh for qemu-devel@nongnu.org; Thu, 14 Jul 2011 10:05:09 -0400 Received: from e39.co.us.ibm.com ([32.97.110.160]:38159) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QhMXH-0001hb-7P for qemu-devel@nongnu.org; Thu, 14 Jul 2011 10:05:03 -0400 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e39.co.us.ibm.com (8.14.4/8.13.1) with ESMTP id p6EDoDkP032491 for ; Thu, 14 Jul 2011 07:50:13 -0600 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d03relay04.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p6EE4ZR9135144 for ; Thu, 14 Jul 2011 08:04:40 -0600 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p6E84XJx005667 for ; Thu, 14 Jul 2011 02:04:33 -0600 Message-ID: <4E1EF76E.4010309@linux.vnet.ibm.com> Date: Thu, 14 Jul 2011 09:04:30 -0500 From: Michael Roth MIME-Version: 1.0 References: <1309872100-27912-1-git-send-email-mdroth@linux.vnet.ibm.com> <20110714095539.6b3b90af@doriath> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [QAPI+QGA 3/3] QEMU Guest Agent (virtagent) v6 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Zhi Yong Wu Cc: aliguori@linux.vnet.ibm.com, Jes.Sorensen@redhat.com, agl@linux.vnet.ibm.com, qemu-devel@nongnu.org, Luiz Capitulino On 07/14/2011 08:53 AM, Zhi Yong Wu wrote: > On Thu, Jul 14, 2011 at 8:55 PM, Luiz Capitulino wrote: >> On Thu, 14 Jul 2011 10:53:51 +0800 >> Zhi Yong Wu wrote: >> >>> HI, Michael, >>> >>> On Tue, Jul 5, 2011 at 9:21 PM, Michael Roth wrote: >>>> This is Set 3/3 of the QAPI+QGA patchsets. >>>> >>>> These patches apply on top of qapi-backport-set2-v5, and can also be obtained from: >>>> git://repo.or.cz/qemu/mdroth.git qapi-backport-set3-v6 >>>> >>>> (Set1+2 are a backport of some of the QAPI-related work from Anthony's >>>> glib tree. The main goal is to get the basic code generation infrastructure in >>>> place so that it can be used by the guest agent to implement a QMP-like guest >>>> interface, and so that future work regarding the QMP conversion to QAPI can be >>>> decoupled from the infrastructure bits. Set3 is the Qemu Guest Agent >>>> (virtagent), rebased on the new code QAPI code generation infrastructure. This >>>> is the first user of QAPI, QMP will follow.) >>>> ___ >>>> >>>> CHANGES SINCE V5: >>>> - switched to using qemu malloc/list functions where possible >>>> - removed unused proxy_path field in struct GAState >>>> - pid file now opened write-only, removed lockf() in favor of O_EXCL, added SIGINT/SIGTERM signal handlers to handle cleanup >>>> - cleaned up error-handling, switched to asserts where appropriate, removed unecessary gotos and NULL checks for qemu_free()/qobject_decref() >>>> - refactored send_payload() using helper functions >>>> - fixed improper handling of pidfile fd==0 >>>> - changed guest-shutdown's "shutdown_mode" param to "mode" >>>> - switched to using kernel-generated FDs for guest-file-open rather than an autoincrement value >>>> - add maximum chunk size of guest-file-read/guest-file-write >>>> - added checks to avoid guest-file-write from writing data beyond the provided data buffer >>>> - made logging best-effort, removed handling of failures to log as errors >>>> - guest-shutdown exec errors now logged to guest syslog, clarified shutdown's asynchronous, no gauruntee nature in schema. >>>> >>>> CHANGES SINCE V4: >>>> - Removed timeout mechanism via worker thread/pthread_cancel due to potential memory leak. Will re-introduce guest-side timeout support in future version. >>>> - Fixed up fsfreeze code to use enums specified within the guest agent's qapi schema. >>>> - Fixed memory leak due to a log statement, and added missing cleanup functions for heap-allocated g_error objects. >>>> - Made "mode" param to guest-file-open optional, defaults to "r" (read-only) >>>> >>>> CHANGES SINCE V3: >>>> - Fixed error-handling issues in fsfreeze commands leading to certain mounted directories causing freeze/thaw operations to fail >>>> - Added cleanup hook to thaw filesystems on graceful guest agent exit >>>> - Removed unused enum values and added additional details to schema documentation >>>> - Fixed build issue that was missed due to deprecated files in source tree, removed unused includes >>>> >>>> CHANGES SINCE V2: >>>> - Rebased on new QAPI code generation framework >>>> - Dropped ability for QMP to act as a proxy for the guest agent, will be added when new QMP server is backported from Anthony's glib tree >>>> - Replaced negotiation/control events with a simple 2-way handshake implemented by a standard RPC (guest-sync) >>>> - Removed enforcement of "pristine" sessions, state is now global/persistant across multiple clients/connections >>>> - Fixed segfault in logging code >>>> - Added Jes' filesystem freeze patches >>>> - General cleanups >>>> >>>> CHANGES SINCE V1: >>>> - Added guest agent worker thread to execute RPCs in the guest. With this in place we have a reliable timeout mechanism for hung commands, currently set at 30 seconds. >>>> - Add framework for registering init/cleanup routines for stateful RPCs to clean up after themselves after a timeout. >>>> - Added the following RPCs: guest-file-{open,close,read,write,seek}, guest-shutdown, guest-info, and removed stubs for guest-view-file (now deprecated) >>>> - Added GUEST_AGENT_UP/GUEST_AGENT_DOWN QMP events >>>> - Switched to a TCP-style host-initiated 3-way handshake for channel negotiation, this simplifies client negotiation/interaction over the wire >>>> - Added configurable log level/log file/pid file options for guest agent >>>> - Various fixes for bugs/memory leaks and checkpatch.pl fixups >>>> >>>> ISSUES/TODOS: >>>> - Add unit tests for guest agent wire protocol >>>> >>>> OVERVIEW >>>> >>>> For a better overview of what these patches are meant to accomplish, please reference the RFC for virtagent: >>>> >>>> http://comments.gmane.org/gmane.comp.emulators.qemu/96096 >>>> >>>> These patches integrate the previous virtagent guest agent work directly in QAPI/QMP to leverage it's auto-generated marshalling code. This has numerous benefits: >>>> >>>> - addresses previous concerns over relying on external libraries to handle data encapsulation >>>> - reduces the need for manual unmarshalling of requests/responses, which makes adding new RPCs much safer/less error-prone, as well as cutting down on redundant code >>>> - QAPI documentation aligns completely with guest-side RPC implementation >>>> - is Just Better (TM) >>>> >>>> BUILD/USAGE >>>> >>>> build: >>>> ./configure --target-list=x86_64-softmmu >>>> make >>>> make qemu-ga #should be built on|for target guest >>>> >>>> start guest: >>>> qemu \ >>>> -drive file=/home/mdroth/vm/rhel6_64_base.raw,snapshot=off,if=virtio \ >>>> -net nic,model=virtio,macaddr=52:54:00:12:34:00 \ >>>> -net tap,script=/etc/qemu-ifup \ >>>> -vnc :1 -m 1024 --enable-kvm \ >>>> -chardev socket,path=/tmp/qga.sock,server,nowait,id=qga \ >>>> -device virtio-serial \ >>>> -device virtserialport,chardev=qga,name=qga" >>>> >>>> use guest agent: >>>> ./qemu-ga -h >>>> ./qemu-ga -c virtio-serial -p /dev/virtio-ports/qga >>> Is the above command "./qemu-ga" issued on guest teminal or hypervisor teminal? >> >> In the guest. > > Can we make it work similiar as a linux service? It may is more > convenient to use. > > [root@f12 ~]# service qemu-ga start/stop/status/restart > > [root@f12 ~]# chkconfig qemu-ga on/off > Definitely, we need the agent to act as a service to be able to rely on it remaining after restarts and whatnot. We have some init scripts and whatnot for in-house testing/deployment, but this is somewhat distro-dependent and is more of a packaging concern than something for qemu-devel. Although, if we do deployment via the guest tools ISO that I sent an RFC out for a while back, it may be worthwhile to cover this as part of that discussion since ideally we'd come up with something that Just Works on most distros. I hope to have a prototype of ISO generation scripts out within the next week or so. >> >>> >>>> >>>> start/use qmp: >>>> mdroth@illuin:~$ sudo socat unix-connect:/tmp/qga.sock readline >>>> {"execute":"guest-sync", "arguments":{"id":1234}} >>>> {"return": 1234} >>>> >>>> {"execute":"guest-info"} >>>> {"return": {}} >>>> >>>> {"execute": "guest-info"} >>>> {"return": {"version": "1.0"}} >>>> >>>> {"execute":"guest-file-open", "arguments":{"filepath":"/tmp/testqga","mode":"w+"}} >>>> {"return": 0} >>>> {"execute":"guest-file-write", "arguments":{"filehandle":0,"data_b64":"aGVsbG8gd29ybGQhCg==","count":13}} // writes "hello world!\n" >>>> {"return": {"count": 13, "eof": false}} >>>> >>>> {"execute":"guest-file-open", "arguments":{"filepath":"/tmp/testqga","mode":"r"}} >>>> {"return": 1} >>>> {"execute":"guest-file-read", "arguments":{"filehandle":1,"count":1024}} >>>> {"return": {"buf": "aGVsbG8gd29ybGQhCg==", "count": 13, "eof": true}} >>>> {"execute":"guest-file-close","arguments":{"filehandle":1}} >>>> {"return": {}} >>>> >>>> Makefile | 22 +- >>>> configure | 1 + >>>> qapi-schema-guest.json | 202 +++++++++++++ >>>> qemu-ga.c | 631 +++++++++++++++++++++++++++++++++++++++ >>>> qerror.c | 4 + >>>> qerror.h | 3 + >>>> qga/guest-agent-command-state.c | 73 +++++ >>>> qga/guest-agent-commands.c | 522 ++++++++++++++++++++++++++++++++ >>>> qga/guest-agent-core.h | 30 ++ >>>> 9 files changed, 1483 insertions(+), 5 deletions(-) >>>> >>>> >>>> >> >> > > >