qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [QAPI+QGA 3/3] QEMU Guest Agent (virtagent) v7


From: Zhi Yong Wu
Subject: Re: [Qemu-devel] [QAPI+QGA 3/3] QEMU Guest Agent (virtagent) v7
Date: Fri, 15 Jul 2011 09:15:18 +0800

On Fri, Jul 15, 2011 at 4:00 AM, Michael Roth <address@hidden> wrote:
> This is Set 3/3 of the QAPI+QGA patchsets.
>
> These patches apply on top of qapi-backport-set2-v6, and can also be obtained 
> from:
> git://repo.or.cz/qemu/mdroth.git qapi-backport-set3-v7
>
> (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 V6:
>  - Made "/dev/virtio-ports/org.qemu.guest_agent.0" default device path for 
> agent
>  - Consolidated uneeded fcntl() calls into qemu_open()
>  - JSON/QMP parse errors now propagated to client
>  - Replaced non-assertion uses of g_error() with exit()
>  - Added guest-file-flush
>  - Removed limit on max read size for guest-file-read
>  - 'count' parameters to guest-file-read/guest-file-write are now optional 
> (default to 4KB and size of provided buffer, base64-decoded, respectively)
>  - Removed redundant 'file_' and 'shutdown_' prefixes from 
> guest-file-*/guest-shutdown commands, switched to "-" in place of "_" in 
> parameter names, renamed guest-file-read's "buf" param to "buf-b64" and 
> guest-file-write's "data_b64" param to "buf-b64" for consistency.
>  - guest-fsfreeze-freeze now returns error objects on error rather as part of 
> it's integer return values, and on error will unfreeze previously frozen 
> filesystems.
>  - GUEST_FSFREEZE_STATUS_INPROGRESS removed, GUEST_FSFREEZE_STATUS_ERROR now 
> serves the explicit purpose of noting a failure to find a previously mounted 
> filesytem/directory after initial freeze, or failure to unfreeze 1 or more 
> filesystems.
>  - -c/--channel option to qemu-ga is now -m/--method
>
> 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
HI, Macheal.
Is qemu-ga built in guest? if yes, it will require the guest to set up
a gcc environment. Can we make it built on the host?

>
> 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=qga0 \
>  -device virtio-serial \
>  -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0"
>
> use guest agent:
>  ./qemu-ga -h
>  ./qemu-ga -m virtio-serial -p /dev/virtio-ports/org.qemu.guest_agent.0
>
> start/use qmp:
> address@hidden:~$ sudo socat unix-connect:/tmp/qga.sock readline
>  {"execute":"guest-sync", "arguments":{"id":1234}}
>  {"return": 1234}
>
>  {"execute":"guest-ping"}
>  {"return": {}}
>
>  {"execute": "guest-info"}
>  {"return": {"version": "1.0"}}
>
>  // write "hello world!\n" to /tmp/testqga
>  {"execute":"guest-file-open", 
> "arguments":{"path":"/tmp/testqga","mode":"w+"}}
>  {"return": 0}
>  {"execute":"guest-file-write", 
> "arguments":{"handle":0,"buf-b64":"aGVsbG8gd29ybGQhCg=="}}
>  {"return": {"count": 13, "eof": false}}
>  {"execute":"guest-file-close", "arguments":{"handle":0}}
>  {"return": {}}
>
>  // read back the "hello world!\n" from /tmp/testqga
>  {"execute":"guest-file-open", "arguments":{"path":"/tmp/testqga","mode":"r"}}
>  {"return": 1}
>  {"execute":"guest-file-read", "arguments":{"handle":1,"count":1024}}
>  {"return": {"buf-b64": "aGVsbG8gd29ybGQhCg==", "count": 13, "eof": true}}
>  {"execute":"guest-file-close","arguments":{"handle":1}}
>  {"return": {}}
>
>  Makefile                        |   25 ++-
>  configure                       |    1 +
>  qapi-schema-guest.json          |  217 +++++++++++++
>  qemu-ga.c                       |  671 
> +++++++++++++++++++++++++++++++++++++++
>  qerror.c                        |   13 +
>  qerror.h                        |    6 +
>  qga/guest-agent-command-state.c |   73 +++++
>  qga/guest-agent-commands.c      |  512 +++++++++++++++++++++++++++++
>  qga/guest-agent-core.h          |   31 ++
>  9 files changed, 1544 insertions(+), 5 deletions(-)
>
>
>



-- 
Regards,

Zhi Yong Wu



reply via email to

[Prev in Thread] Current Thread [Next in Thread]