From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: bazulay@redhat.com, aliguori@us.ibm.com,
mdroth@linux.vnet.ibm.com, agl@us.ibm.com
Subject: [Qemu-devel] [PATCH 0/2] [RFC] qemu-ga: add support for guest command execution
Date: Tue, 6 Dec 2011 08:34:06 -0600 [thread overview]
Message-ID: <1323182048-12134-1-git-send-email-mdroth@linux.vnet.ibm.com> (raw)
The code is still in rough shape, but while we're on the topic of guest agents
I wanted to put out a working example of how exec functionality can be added
to qemu-ga to provide a mechansim for building arbitrarilly high-level
interfaces.
The hope is that by allowing qemu-ga to execute commands in the guest, paired
with file read/write access, we can instrument a guest "on the fly" to support
any type of hyperviser functionality, and do so without dramatically enlarging
the role qemu-ga plays as a small, QEMU-specific agent that is tightly
integrated with QEMU/QMP/libvirt.
These patches add the following interfaces:
guest-file-open-pipe
guest-exec
guest-exec-status
The guest-file-open-pipe interface is analagous to the existing guest-file-open
interface (it might be best to roll it into it actually): it returns a handle
that can be handled via the existing guest-file-{read,write,flush,close}
interface. Internally it creates a FIFO pair that we can use to associate
handles to the stdin/stdout/stderr of a guest-exec spawned process. We can also
also use them to redirect output into other processes, giving us the basic
tools to build a basic shell (or a full-blown one if we add TTY support) using
a single qemu-ga.
Theoretically we can even deploy other agents, including session-level agents,
and communicate with them via these same handles. Thus, ovirt could deploy and
run an agent via qemu-ga, Spice could deploy vdagent, etc. Since the interface
is somewhat tedious, I'm working on a wrapper script to try out some of
these scenarios, but a basic use case using the raw QMP interface is included
below.
Any thoughts/comments on this approach are appreciated.
EXAMPLE USAGE (execute `top -b -n1`):
{'execute': 'guest-file-open-pipe'}
{'return': 6}
{'execute': 'guest-exec', \
'arguments': {'detach': True, \
'handle_stdout': 6, \
'params': [{'param': '-b'}, \
{'param': '-n1'}], \
'path': 'top'}}
{'return': {'exit-code': 0, \
'exited': False, \
'handle_stderr': -1, \
'handle_stdin': -1, \
'handle_stdout': 6, \
'pid': 14267}}
{'execute': 'guest-file-read', \
'arguments': {'count': 65536, \
'handle': 6}}
{'return': {'buf-b64': '', \
'count': 0, \
'eof': False}}
{'execute': 'guest-file-read', \
'arguments': {'count': 65536, \
'handle': 6}}
{'return': {'buf-b64': 'dG9wIC0gMjI6N...', \
'count': 11064, \
'eof': True}}
/*
top - 22:41:49 up 1 day, 4:30, 3 users, load average: 0.00, 0.00, 0.00
Tasks: 114 total, 1 running, 113 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 99.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 504848k total, 445664k used, 59184k free, 49100k buffers
Swap: 323580k total, 224k used, 323356k free, 256392k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
14267 root 20 0 19272 1248 924 R 2 0.2 0:00.02 top
1 root 20 0 24008 2048 1280 S 0 0.4 0:00.85 init
2 root 20 0 0 0 0 S 0 0.0 0:00.30 kthreadd
3 root 20 0 0 0 0 S 0 0.0 0:01.09 ksoftirqd/0
...
*/
{'execute': 'guest-exec-status', \
'arguments': {'pid': 14267}}
{'return': {'exit-code': 0, \
'exited': True, \
'handle_stderr': -1, \
'handle_stdin': -1, \
'handle_stdout': 6, \
'pid': 14267}}
{'execute': 'guest-file-close'} \
'arguments': {'handle': 6}}
{'return': {}}
Michael Roth (2):
guest agent: add guest-file-open-pipe
guest agent: add guest-exec and guest-exec-status interfaces
qapi-schema-guest.json | 79 +++++++-
qga/guest-agent-commands.c | 478 +++++++++++++++++++++++++++++++++++++++++---
2 files changed, 531 insertions(+), 26 deletions(-)
--
1.7.4.1
next reply other threads:[~2011-12-06 14:34 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-06 14:34 Michael Roth [this message]
2011-12-06 14:34 ` [Qemu-devel] [PATCH 1/2] guest agent: add guest-file-open-pipe Michael Roth
2011-12-06 14:34 ` [Qemu-devel] [PATCH 2/2] guest agent: add guest-exec and guest-exec-status interfaces Michael Roth
2011-12-06 14:44 ` [Qemu-devel] [PATCH 0/2] [RFC] qemu-ga: add support for guest command execution Daniel P. Berrange
2011-12-06 16:43 ` Michael Roth
2011-12-18 12:56 ` Alon Levy
-- strict thread matches above, loose matches on Subject: below --
2013-10-07 14:06 srinath reddy
2013-10-08 21:12 ` Michael Roth
2013-10-08 21:19 ` Michael Roth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1323182048-12134-1-git-send-email-mdroth@linux.vnet.ibm.com \
--to=mdroth@linux.vnet.ibm.com \
--cc=agl@us.ibm.com \
--cc=aliguori@us.ibm.com \
--cc=bazulay@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).