* [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
@ 2011-02-28 16:42 Jes Sorensen
2011-02-28 17:44 ` Anthony Liguori
0 siblings, 1 reply; 24+ messages in thread
From: Jes Sorensen @ 2011-02-28 16:42 UTC (permalink / raw)
To: QEMU Developers
Cc: Juan Quintela, Dor Laor, Michael Roth, Anthony Liguori,
Gerd Hoffmann, Adam Litke, Amit Shah
Hi,
On last week's call we discussed the issue of splitting non core
features of QEMU into it's own process to reduce the security risks etc.
I wrote up a summary of my thoughts on this to try to cover the various
issues. Feedback welcome and hopefully we can continue the discussion on
a future call - maybe next week?
I would like to be part of the discussion, but it's a public holiday
here March 1st, so I won't be on that call.
Cheers,
Jes
Separating host-side virtagent and other tasks from core QEMU
=============================================================
To improve auditing of the core QEMU code, it would be ideal to be
able to separate the core QEMU functionality from utility
functionality by moving the utility functionality into its own
process. This process will be referred to as the QEMU client below.
Components which are candidates for moving out of QEMU include:
- virtagent
- vnc server (and other graphical displays such as SDL, spice and
curses)
- human monitor
The idea is to have QEMU launch as a daemon, and then allow for one of
more client processes to connect to it. These will then offer the
various services. The main issue to discuss is how to handle various
state information, reconnects, and migration.
Security
========
The primary reason for this discussion is security, however there are
other benefits from this split, as will be mentioned below. During a
demo of virtagent I hit a case where a bug in the agent command
handling code caused a crash of the host QEMU process. While it is
probably a simple bug, it shows how adding more complexity to the QEMU
process increases the risk of adding security problems that could
potentially be exploited by a hostile guest.
By splitting non core functionality into a QEMU client process, the
host process will be isolated from a large number of potential
security problems, ie. in case a client process is killed or crashes,
it should not affect the main QEMU process. In addition it makes it
easier to audit the core QEMU functionality.
virtagent
=========
In short virtagent provides a set of simple commands, most of which
do not have state associated with them. These include shutdown, ping,
fsfreeze/fsthaw, etc. Other commands might be multi-stage commands
which could fail if the client is disconnected from the daemon while
the command is in progress. These include copy-paste and file copy.
vnc server
==========
The vnc server simply needs a connection to the video memory of the
QEMU process, video mode state, as well as channels for sending
keyboard and mouse events. It is stateless by nature and supports
reconnects. This applies to the other graphical display engines (SDL,
spice, and curses) as well.
Human monitor
=============
The human monitor is effectively stateless. It issues commands and
prints the result. There is no state in the monitor and it can be
built directly on top of QMP.
An additional benefit here is that it would allow for multiple
monitors.
Disconnects
===========
It must be possible for a client process getting killed or
disconnected from the QEMU process, in which case is should be
possible to launch a new client that connects to the QEMU
process. In this case, commands needs to be provided allowing the
client process to query the QEMU process and virtagent for current
state information. In-progress commands may fail, and will need to be
re-run, such as copy-paste and and file copy. However neither of
these are vital commands and a re-run of such commands is acceptable
behavior.
Migration
=========
Given that migration moves the guest to a new QEMU process, normally
on a different host, any connection from management tools to the
monitor, QMP sockets, virtio-serial, etc. require a new connection
through the new QEMU process. Stateless connections, such as the
monitor, QMP and the vnc-server handles reconnects without problems,
and should not have any issues during migration that are different
from the issues in the current implementation.
The main issues causing problems are stateful events such as
copy-paste, which is handled via a guest agent. The copy-paste problem
can be handled by blocking copy-paste operations during migration,
until the guest agent is reachable through the QEMU process on the new
host. This does mean that copy-paste can block or fail temporarily
(depending on whether is it implemented as -EBUSY or just blocks),
however it is not a mission critical feature, and it can also block or
fail temporarily during normal operation on a non virtual system.
Per the nature of the operation, a file copy via a guest agent is
going to fail and will have to be restarted after migration has
completed, in case it does not complete. This is again a non critical
feature and requiring a restart is acceptable.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-02-28 16:42 [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features Jes Sorensen
@ 2011-02-28 17:44 ` Anthony Liguori
2011-03-01 12:07 ` Dor Laor
2011-03-02 10:19 ` Jes Sorensen
0 siblings, 2 replies; 24+ messages in thread
From: Anthony Liguori @ 2011-02-28 17:44 UTC (permalink / raw)
To: Jes Sorensen
Cc: Juan Quintela, Dor Laor, QEMU Developers, Michael Roth,
Anthony Liguori, Gerd Hoffmann, Adam Litke, Amit Shah
[-- Attachment #1: Type: text/plain, Size: 5958 bytes --]
On Feb 28, 2011 10:44 AM, "Jes Sorensen" <Jes.Sorensen@redhat.com> wrote:
>
> Hi,
>
> On last week's call we discussed the issue of splitting non core
> features of QEMU into it's own process to reduce the security risks etc.
>
> I wrote up a summary of my thoughts on this to try to cover the various
> issues. Feedback welcome and hopefully we can continue the discussion on
> a future call - maybe next week?
>
> I would like to be part of the discussion, but it's a public holiday
> here March 1st, so I won't be on that call.
>
> Cheers,
> Jes
>
>
> Separating host-side virtagent and other tasks from core QEMU
> =============================================================
>
> To improve auditing of the core QEMU code, it would be ideal to be
> able to separate the core QEMU functionality from utility
> functionality by moving the utility functionality into its own
> process. This process will be referred to as the QEMU client below.
Separating as in moving code outside of qemu.git, making code optionally
built in, making code optionally built in or loadable as a separate
executable that is automatically launched, or making code always built
outside the main executable?
I'm very nervous about having a large number of daemons necessary to run
QEMU. I think a reasonable approach would be a single front-end daemond.
Once QAPI is merged, there is a very incremental approach we can take for
this sort of work. Take your favorite subsystem (like gdbstub or SDL) and
make it only use QMP apis. Once we're only using QMP internally in a
subsystem, then building it out of the main QEMU and using libqmp should be
fairly easy.
Regards,
Anthony Liguori
> Components which are candidates for moving out of QEMU include:
> - virtagent
> - vnc server (and other graphical displays such as SDL, spice and
> curses)
> - human monitor
These are all much harder than they may seem. There's a ton of QMP
functions that would be needed before we could even try to do this.
> The idea is to have QEMU launch as a daemon, and then allow for one of
> more client processes to connect to it. These will then offer the
> various services. The main issue to discuss is how to handle various
> state information, reconnects, and migration.
>
> Security
> ========
>
> The primary reason for this discussion is security, however there are
> other benefits from this split, as will be mentioned below. During a
> demo of virtagent I hit a case where a bug in the agent command
> handling code caused a crash of the host QEMU process. While it is
> probably a simple bug, it shows how adding more complexity to the QEMU
> process increases the risk of adding security problems that could
> potentially be exploited by a hostile guest.
>
> By splitting non core functionality into a QEMU client process, the
> host process will be isolated from a large number of potential
> security problems, ie. in case a client process is killed or crashes,
> it should not affect the main QEMU process. In addition it makes it
> easier to audit the core QEMU functionality.
>
> virtagent
> =========
>
> In short virtagent provides a set of simple commands, most of which
> do not have state associated with them. These include shutdown, ping,
> fsfreeze/fsthaw, etc. Other commands might be multi-stage commands
> which could fail if the client is disconnected from the daemon while
> the command is in progress. These include copy-paste and file copy.
>
> vnc server
> ==========
>
> The vnc server simply needs a connection to the video memory of the
> QEMU process, video mode state, as well as channels for sending
> keyboard and mouse events. It is stateless by nature and supports
> reconnects. This applies to the other graphical display engines (SDL,
> spice, and curses) as well.
>
> Human monitor
> =============
>
> The human monitor is effectively stateless. It issues commands and
> prints the result. There is no state in the monitor and it can be
> built directly on top of QMP.
>
> An additional benefit here is that it would allow for multiple
> monitors.
>
> Disconnects
> ===========
>
> It must be possible for a client process getting killed or
> disconnected from the QEMU process, in which case is should be
> possible to launch a new client that connects to the QEMU
> process. In this case, commands needs to be provided allowing the
> client process to query the QEMU process and virtagent for current
> state information. In-progress commands may fail, and will need to be
> re-run, such as copy-paste and and file copy. However neither of
> these are vital commands and a re-run of such commands is acceptable
> behavior.
>
> Migration
> =========
>
> Given that migration moves the guest to a new QEMU process, normally
> on a different host, any connection from management tools to the
> monitor, QMP sockets, virtio-serial, etc. require a new connection
> through the new QEMU process. Stateless connections, such as the
> monitor, QMP and the vnc-server handles reconnects without problems,
> and should not have any issues during migration that are different
> from the issues in the current implementation.
>
> The main issues causing problems are stateful events such as
> copy-paste, which is handled via a guest agent. The copy-paste problem
> can be handled by blocking copy-paste operations during migration,
> until the guest agent is reachable through the QEMU process on the new
> host. This does mean that copy-paste can block or fail temporarily
> (depending on whether is it implemented as -EBUSY or just blocks),
> however it is not a mission critical feature, and it can also block or
> fail temporarily during normal operation on a non virtual system.
>
> Per the nature of the operation, a file copy via a guest agent is
> going to fail and will have to be restarted after migration has
> completed, in case it does not complete. This is again a non critical
> feature and requiring a restart is acceptable.
>
[-- Attachment #2: Type: text/html, Size: 7053 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-02-28 17:44 ` Anthony Liguori
@ 2011-03-01 12:07 ` Dor Laor
2011-03-01 12:40 ` Anthony Liguori
2011-03-02 10:21 ` Jes Sorensen
2011-03-02 10:19 ` Jes Sorensen
1 sibling, 2 replies; 24+ messages in thread
From: Dor Laor @ 2011-03-01 12:07 UTC (permalink / raw)
To: Anthony Liguori
Cc: Juan Quintela, Jes Sorensen, Michael Roth, QEMU Developers,
Anthony Liguori, Gerd Hoffmann, Adam Litke, Amit Shah
On 02/28/2011 07:44 PM, Anthony Liguori wrote:
>
> On Feb 28, 2011 10:44 AM, "Jes Sorensen" <Jes.Sorensen@redhat.com
> <mailto:Jes.Sorensen@redhat.com>> wrote:
> >
> > Hi,
> >
> > On last week's call we discussed the issue of splitting non core
> > features of QEMU into it's own process to reduce the security risks etc.
> >
> > I wrote up a summary of my thoughts on this to try to cover the various
> > issues. Feedback welcome and hopefully we can continue the discussion on
> > a future call - maybe next week?
> >
> > I would like to be part of the discussion, but it's a public holiday
> > here March 1st, so I won't be on that call.
> >
> > Cheers,
> > Jes
> >
> >
> > Separating host-side virtagent and other tasks from core QEMU
> > =============================================================
> >
> > To improve auditing of the core QEMU code, it would be ideal to be
> > able to separate the core QEMU functionality from utility
> > functionality by moving the utility functionality into its own
> > process. This process will be referred to as the QEMU client below.
>
> Separating as in moving code outside of qemu.git, making code optionally
> built in, making code optionally built in or loadable as a separate
> executable that is automatically launched, or making code always built
> outside the main executable?
>
> I'm very nervous about having a large number of daemons necessary to run
> QEMU. I think a reasonable approach would be a single front-end daemond.
s/daemon/son processes/
Qemu is the one that should spawn them and they should be transparent
from the management. This way running qemu stays the same and qemu just
need to add the logic to get a SIGCHILD and potentially re-execute an
dead son process.
>
> Once QAPI is merged, there is a very incremental approach we can take
> for this sort of work. Take your favorite subsystem (like gdbstub or
> SDL) and make it only use QMP apis. Once we're only using QMP
> internally in a subsystem, then building it out of the main QEMU and
> using libqmp should be fairly easy.
>
> Regards,
>
> Anthony Liguori
>
> > Components which are candidates for moving out of QEMU include:
> > - virtagent
> > - vnc server (and other graphical displays such as SDL, spice and
> > curses)
> > - human monitor
>
> These are all much harder than they may seem. There's a ton of QMP
> functions that would be needed before we could even try to do this.
>
> > The idea is to have QEMU launch as a daemon, and then allow for one of
> > more client processes to connect to it. These will then offer the
> > various services. The main issue to discuss is how to handle various
> > state information, reconnects, and migration.
> >
> > Security
> > ========
> >
> > The primary reason for this discussion is security, however there are
> > other benefits from this split, as will be mentioned below. During a
> > demo of virtagent I hit a case where a bug in the agent command
> > handling code caused a crash of the host QEMU process. While it is
> > probably a simple bug, it shows how adding more complexity to the QEMU
> > process increases the risk of adding security problems that could
> > potentially be exploited by a hostile guest.
> >
> > By splitting non core functionality into a QEMU client process, the
> > host process will be isolated from a large number of potential
> > security problems, ie. in case a client process is killed or crashes,
> > it should not affect the main QEMU process. In addition it makes it
> > easier to audit the core QEMU functionality.
> >
> > virtagent
> > =========
> >
> > In short virtagent provides a set of simple commands, most of which
> > do not have state associated with them. These include shutdown, ping,
> > fsfreeze/fsthaw, etc. Other commands might be multi-stage commands
> > which could fail if the client is disconnected from the daemon while
> > the command is in progress. These include copy-paste and file copy.
> >
> > vnc server
> > ==========
> >
> > The vnc server simply needs a connection to the video memory of the
> > QEMU process, video mode state, as well as channels for sending
> > keyboard and mouse events. It is stateless by nature and supports
> > reconnects. This applies to the other graphical display engines (SDL,
> > spice, and curses) as well.
> >
> > Human monitor
> > =============
> >
> > The human monitor is effectively stateless. It issues commands and
> > prints the result. There is no state in the monitor and it can be
> > built directly on top of QMP.
> >
> > An additional benefit here is that it would allow for multiple
> > monitors.
> >
> > Disconnects
> > ===========
> >
> > It must be possible for a client process getting killed or
> > disconnected from the QEMU process, in which case is should be
> > possible to launch a new client that connects to the QEMU
> > process. In this case, commands needs to be provided allowing the
> > client process to query the QEMU process and virtagent for current
> > state information. In-progress commands may fail, and will need to be
> > re-run, such as copy-paste and and file copy. However neither of
> > these are vital commands and a re-run of such commands is acceptable
> > behavior.
> >
> > Migration
> > =========
> >
> > Given that migration moves the guest to a new QEMU process, normally
> > on a different host, any connection from management tools to the
> > monitor, QMP sockets, virtio-serial, etc. require a new connection
> > through the new QEMU process. Stateless connections, such as the
> > monitor, QMP and the vnc-server handles reconnects without problems,
> > and should not have any issues during migration that are different
> > from the issues in the current implementation.
> >
> > The main issues causing problems are stateful events such as
> > copy-paste, which is handled via a guest agent. The copy-paste problem
> > can be handled by blocking copy-paste operations during migration,
> > until the guest agent is reachable through the QEMU process on the new
> > host. This does mean that copy-paste can block or fail temporarily
> > (depending on whether is it implemented as -EBUSY or just blocks),
> > however it is not a mission critical feature, and it can also block or
> > fail temporarily during normal operation on a non virtual system.
> >
> > Per the nature of the operation, a file copy via a guest agent is
> > going to fail and will have to be restarted after migration has
> > completed, in case it does not complete. This is again a non critical
> > feature and requiring a restart is acceptable.
> >
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-01 12:07 ` Dor Laor
@ 2011-03-01 12:40 ` Anthony Liguori
2011-03-01 14:25 ` Dor Laor
2011-03-02 10:21 ` Jes Sorensen
1 sibling, 1 reply; 24+ messages in thread
From: Anthony Liguori @ 2011-03-01 12:40 UTC (permalink / raw)
To: dlaor
Cc: Juan Quintela, Jes Sorensen, QEMU Developers, Michael Roth,
Anthony Liguori, Gerd Hoffmann, Adam Litke, Amit Shah
[-- Attachment #1: Type: text/plain, Size: 7126 bytes --]
On Mar 1, 2011 7:07 AM, "Dor Laor" <dlaor@redhat.com> wrote:
>
> On 02/28/2011 07:44 PM, Anthony Liguori wrote:
>>
>>
>> On Feb 28, 2011 10:44 AM, "Jes Sorensen" <Jes.Sorensen@redhat.com
>> <mailto:Jes.Sorensen@redhat.com>> wrote:
>> >
>> > Hi,
>> >
>> > On last week's call we discussed the issue of splitting non core
>> > features of QEMU into it's own process to reduce the security risks
etc.
>> >
>> > I wrote up a summary of my thoughts on this to try to cover the
various
>> > issues. Feedback welcome and hopefully we can continue the discussion
on
>> > a future call - maybe next week?
>> >
>> > I would like to be part of the discussion, but it's a public holiday
>> > here March 1st, so I won't be on that call.
>> >
>> > Cheers,
>> > Jes
>> >
>> >
>> > Separating host-side virtagent and other tasks from core QEMU
>> > =============================================================
>> >
>> > To improve auditing of the core QEMU code, it would be ideal to be
>> > able to separate the core QEMU functionality from utility
>> > functionality by moving the utility functionality into its own
>> > process. This process will be referred to as the QEMU client below.
>>
>> Separating as in moving code outside of qemu.git, making code optionally
>> built in, making code optionally built in or loadable as a separate
>> executable that is automatically launched, or making code always built
>> outside the main executable?
>>
>> I'm very nervous about having a large number of daemons necessary to run
>> QEMU. I think a reasonable approach would be a single front-end daemond.
>
>
> s/daemon/son processes/
> Qemu is the one that should spawn them and they should be transparent from
the management. This way running qemu stays the same and qemu just need to
add the logic to get a SIGCHILD and potentially re-execute an dead son
process.
Spice is the logical place to start, no? It's the largest single dependency
we have and it does some scary things with qemu_mutex. I would use spice as
a way to prove the concept.
Regards,
Anthony Liguori
>
>
>>
>> Once QAPI is merged, there is a very incremental approach we can take
>> for this sort of work. Take your favorite subsystem (like gdbstub or
>> SDL) and make it only use QMP apis. Once we're only using QMP
>> internally in a subsystem, then building it out of the main QEMU and
>> using libqmp should be fairly easy.
>>
>> Regards,
>>
>> Anthony Liguori
>>
>> > Components which are candidates for moving out of QEMU include:
>> > - virtagent
>> > - vnc server (and other graphical displays such as SDL, spice and
>> > curses)
>> > - human monitor
>>
>> These are all much harder than they may seem. There's a ton of QMP
>> functions that would be needed before we could even try to do this.
>>
>> > The idea is to have QEMU launch as a daemon, and then allow for one of
>> > more client processes to connect to it. These will then offer the
>> > various services. The main issue to discuss is how to handle various
>> > state information, reconnects, and migration.
>> >
>> > Security
>> > ========
>> >
>> > The primary reason for this discussion is security, however there are
>> > other benefits from this split, as will be mentioned below. During a
>> > demo of virtagent I hit a case where a bug in the agent command
>> > handling code caused a crash of the host QEMU process. While it is
>> > probably a simple bug, it shows how adding more complexity to the QEMU
>> > process increases the risk of adding security problems that could
>> > potentially be exploited by a hostile guest.
>> >
>> > By splitting non core functionality into a QEMU client process, the
>> > host process will be isolated from a large number of potential
>> > security problems, ie. in case a client process is killed or crashes,
>> > it should not affect the main QEMU process. In addition it makes it
>> > easier to audit the core QEMU functionality.
>> >
>> > virtagent
>> > =========
>> >
>> > In short virtagent provides a set of simple commands, most of which
>> > do not have state associated with them. These include shutdown, ping,
>> > fsfreeze/fsthaw, etc. Other commands might be multi-stage commands
>> > which could fail if the client is disconnected from the daemon while
>> > the command is in progress. These include copy-paste and file copy.
>> >
>> > vnc server
>> > ==========
>> >
>> > The vnc server simply needs a connection to the video memory of the
>> > QEMU process, video mode state, as well as channels for sending
>> > keyboard and mouse events. It is stateless by nature and supports
>> > reconnects. This applies to the other graphical display engines (SDL,
>> > spice, and curses) as well.
>> >
>> > Human monitor
>> > =============
>> >
>> > The human monitor is effectively stateless. It issues commands and
>> > prints the result. There is no state in the monitor and it can be
>> > built directly on top of QMP.
>> >
>> > An additional benefit here is that it would allow for multiple
>> > monitors.
>> >
>> > Disconnects
>> > ===========
>> >
>> > It must be possible for a client process getting killed or
>> > disconnected from the QEMU process, in which case is should be
>> > possible to launch a new client that connects to the QEMU
>> > process. In this case, commands needs to be provided allowing the
>> > client process to query the QEMU process and virtagent for current
>> > state information. In-progress commands may fail, and will need to be
>> > re-run, such as copy-paste and and file copy. However neither of
>> > these are vital commands and a re-run of such commands is acceptable
>> > behavior.
>> >
>> > Migration
>> > =========
>> >
>> > Given that migration moves the guest to a new QEMU process, normally
>> > on a different host, any connection from management tools to the
>> > monitor, QMP sockets, virtio-serial, etc. require a new connection
>> > through the new QEMU process. Stateless connections, such as the
>> > monitor, QMP and the vnc-server handles reconnects without problems,
>> > and should not have any issues during migration that are different
>> > from the issues in the current implementation.
>> >
>> > The main issues causing problems are stateful events such as
>> > copy-paste, which is handled via a guest agent. The copy-paste problem
>> > can be handled by blocking copy-paste operations during migration,
>> > until the guest agent is reachable through the QEMU process on the new
>> > host. This does mean that copy-paste can block or fail temporarily
>> > (depending on whether is it implemented as -EBUSY or just blocks),
>> > however it is not a mission critical feature, and it can also block or
>> > fail temporarily during normal operation on a non virtual system.
>> >
>> > Per the nature of the operation, a file copy via a guest agent is
>> > going to fail and will have to be restarted after migration has
>> > completed, in case it does not complete. This is again a non critical
>> > feature and requiring a restart is acceptable.
>> >
>>
>
[-- Attachment #2: Type: text/html, Size: 9387 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-01 12:40 ` Anthony Liguori
@ 2011-03-01 14:25 ` Dor Laor
2011-03-01 14:29 ` Anthony Liguori
` (2 more replies)
0 siblings, 3 replies; 24+ messages in thread
From: Dor Laor @ 2011-03-01 14:25 UTC (permalink / raw)
To: Anthony Liguori
Cc: Juan Quintela, Jes Sorensen, Michael Roth, QEMU Developers,
Anthony Liguori, Gerd Hoffmann, Adam Litke, Amit Shah,
spice-devel
On 03/01/2011 02:40 PM, Anthony Liguori wrote:
>
> On Mar 1, 2011 7:07 AM, "Dor Laor" <dlaor@redhat.com
> <mailto:dlaor@redhat.com>> wrote:
> >
> > On 02/28/2011 07:44 PM, Anthony Liguori wrote:
> >>
> >>
> >> On Feb 28, 2011 10:44 AM, "Jes Sorensen" <Jes.Sorensen@redhat.com
> <mailto:Jes.Sorensen@redhat.com>
> >> <mailto:Jes.Sorensen@redhat.com <mailto:Jes.Sorensen@redhat.com>>>
> wrote:
> >> >
> >> > Hi,
> >> >
> >> > On last week's call we discussed the issue of splitting non core
> >> > features of QEMU into it's own process to reduce the security
> risks etc.
> >> >
> >> > I wrote up a summary of my thoughts on this to try to cover the
> various
> >> > issues. Feedback welcome and hopefully we can continue the
> discussion on
> >> > a future call - maybe next week?
> >> >
> >> > I would like to be part of the discussion, but it's a public holiday
> >> > here March 1st, so I won't be on that call.
> >> >
> >> > Cheers,
> >> > Jes
> >> >
> >> >
> >> > Separating host-side virtagent and other tasks from core QEMU
> >> > =============================================================
> >> >
> >> > To improve auditing of the core QEMU code, it would be ideal to be
> >> > able to separate the core QEMU functionality from utility
> >> > functionality by moving the utility functionality into its own
> >> > process. This process will be referred to as the QEMU client below.
> >>
> >> Separating as in moving code outside of qemu.git, making code optionally
> >> built in, making code optionally built in or loadable as a separate
> >> executable that is automatically launched, or making code always built
> >> outside the main executable?
> >>
> >> I'm very nervous about having a large number of daemons necessary to run
> >> QEMU. I think a reasonable approach would be a single front-end
> daemond.
> >
> >
> > s/daemon/son processes/
> > Qemu is the one that should spawn them and they should be transparent
> from the management. This way running qemu stays the same and qemu just
> need to add the logic to get a SIGCHILD and potentially re-execute an
> dead son process.
>
> Spice is the logical place to start, no? It's the largest single
> dependency we have and it does some scary things with qemu_mutex. I
> would use spice as a way to prove the concept.
I agree it is desirable to the this for spice but it is allot more
complex than virtagent isolation. Spice is performance sensitive and
contains much more state. It needs to access the guest memory for
reading the surfaces. It can be solved but needs some major changes.
Adding spice-devel to the discussion.
Will virtagent be kept out of tree till we merge spice?
>
> Regards,
>
> Anthony Liguori
>
> >
> >
> >>
> >> Once QAPI is merged, there is a very incremental approach we can take
> >> for this sort of work. Take your favorite subsystem (like gdbstub or
> >> SDL) and make it only use QMP apis. Once we're only using QMP
> >> internally in a subsystem, then building it out of the main QEMU and
> >> using libqmp should be fairly easy.
> >>
> >> Regards,
> >>
> >> Anthony Liguori
> >>
> >> > Components which are candidates for moving out of QEMU include:
> >> > - virtagent
> >> > - vnc server (and other graphical displays such as SDL, spice and
> >> > curses)
> >> > - human monitor
> >>
> >> These are all much harder than they may seem. There's a ton of QMP
> >> functions that would be needed before we could even try to do this.
> >>
> >> > The idea is to have QEMU launch as a daemon, and then allow for one of
> >> > more client processes to connect to it. These will then offer the
> >> > various services. The main issue to discuss is how to handle various
> >> > state information, reconnects, and migration.
> >> >
> >> > Security
> >> > ========
> >> >
> >> > The primary reason for this discussion is security, however there are
> >> > other benefits from this split, as will be mentioned below. During a
> >> > demo of virtagent I hit a case where a bug in the agent command
> >> > handling code caused a crash of the host QEMU process. While it is
> >> > probably a simple bug, it shows how adding more complexity to the QEMU
> >> > process increases the risk of adding security problems that could
> >> > potentially be exploited by a hostile guest.
> >> >
> >> > By splitting non core functionality into a QEMU client process, the
> >> > host process will be isolated from a large number of potential
> >> > security problems, ie. in case a client process is killed or crashes,
> >> > it should not affect the main QEMU process. In addition it makes it
> >> > easier to audit the core QEMU functionality.
> >> >
> >> > virtagent
> >> > =========
> >> >
> >> > In short virtagent provides a set of simple commands, most of which
> >> > do not have state associated with them. These include shutdown, ping,
> >> > fsfreeze/fsthaw, etc. Other commands might be multi-stage commands
> >> > which could fail if the client is disconnected from the daemon while
> >> > the command is in progress. These include copy-paste and file copy.
> >> >
> >> > vnc server
> >> > ==========
> >> >
> >> > The vnc server simply needs a connection to the video memory of the
> >> > QEMU process, video mode state, as well as channels for sending
> >> > keyboard and mouse events. It is stateless by nature and supports
> >> > reconnects. This applies to the other graphical display engines (SDL,
> >> > spice, and curses) as well.
> >> >
> >> > Human monitor
> >> > =============
> >> >
> >> > The human monitor is effectively stateless. It issues commands and
> >> > prints the result. There is no state in the monitor and it can be
> >> > built directly on top of QMP.
> >> >
> >> > An additional benefit here is that it would allow for multiple
> >> > monitors.
> >> >
> >> > Disconnects
> >> > ===========
> >> >
> >> > It must be possible for a client process getting killed or
> >> > disconnected from the QEMU process, in which case is should be
> >> > possible to launch a new client that connects to the QEMU
> >> > process. In this case, commands needs to be provided allowing the
> >> > client process to query the QEMU process and virtagent for current
> >> > state information. In-progress commands may fail, and will need to be
> >> > re-run, such as copy-paste and and file copy. However neither of
> >> > these are vital commands and a re-run of such commands is acceptable
> >> > behavior.
> >> >
> >> > Migration
> >> > =========
> >> >
> >> > Given that migration moves the guest to a new QEMU process, normally
> >> > on a different host, any connection from management tools to the
> >> > monitor, QMP sockets, virtio-serial, etc. require a new connection
> >> > through the new QEMU process. Stateless connections, such as the
> >> > monitor, QMP and the vnc-server handles reconnects without problems,
> >> > and should not have any issues during migration that are different
> >> > from the issues in the current implementation.
> >> >
> >> > The main issues causing problems are stateful events such as
> >> > copy-paste, which is handled via a guest agent. The copy-paste problem
> >> > can be handled by blocking copy-paste operations during migration,
> >> > until the guest agent is reachable through the QEMU process on the new
> >> > host. This does mean that copy-paste can block or fail temporarily
> >> > (depending on whether is it implemented as -EBUSY or just blocks),
> >> > however it is not a mission critical feature, and it can also block or
> >> > fail temporarily during normal operation on a non virtual system.
> >> >
> >> > Per the nature of the operation, a file copy via a guest agent is
> >> > going to fail and will have to be restarted after migration has
> >> > completed, in case it does not complete. This is again a non critical
> >> > feature and requiring a restart is acceptable.
> >> >
> >>
> >
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-01 14:25 ` Dor Laor
@ 2011-03-01 14:29 ` Anthony Liguori
2011-03-02 10:25 ` Jes Sorensen
2011-03-02 10:28 ` Jes Sorensen
2 siblings, 0 replies; 24+ messages in thread
From: Anthony Liguori @ 2011-03-01 14:29 UTC (permalink / raw)
To: dlaor
Cc: Juan Quintela, Jes Sorensen, Michael Roth, QEMU Developers,
Gerd Hoffmann, Adam Litke, Amit Shah, spice-devel
On 03/01/2011 09:25 AM, Dor Laor wrote:
> On 03/01/2011 02:40 PM, Anthony Liguori wrote:
>>
>> On Mar 1, 2011 7:07 AM, "Dor Laor" <dlaor@redhat.com
>> <mailto:dlaor@redhat.com>> wrote:
>> >
>> > On 02/28/2011 07:44 PM, Anthony Liguori wrote:
>> >>
>> >>
>> >> On Feb 28, 2011 10:44 AM, "Jes Sorensen" <Jes.Sorensen@redhat.com
>> <mailto:Jes.Sorensen@redhat.com>
>> >> <mailto:Jes.Sorensen@redhat.com <mailto:Jes.Sorensen@redhat.com>>>
>> wrote:
>> >> >
>> >> > Hi,
>> >> >
>> >> > On last week's call we discussed the issue of splitting non core
>> >> > features of QEMU into it's own process to reduce the security
>> risks etc.
>> >> >
>> >> > I wrote up a summary of my thoughts on this to try to cover the
>> various
>> >> > issues. Feedback welcome and hopefully we can continue the
>> discussion on
>> >> > a future call - maybe next week?
>> >> >
>> >> > I would like to be part of the discussion, but it's a public
>> holiday
>> >> > here March 1st, so I won't be on that call.
>> >> >
>> >> > Cheers,
>> >> > Jes
>> >> >
>> >> >
>> >> > Separating host-side virtagent and other tasks from core QEMU
>> >> > =============================================================
>> >> >
>> >> > To improve auditing of the core QEMU code, it would be ideal to be
>> >> > able to separate the core QEMU functionality from utility
>> >> > functionality by moving the utility functionality into its own
>> >> > process. This process will be referred to as the QEMU client below.
>> >>
>> >> Separating as in moving code outside of qemu.git, making code
>> optionally
>> >> built in, making code optionally built in or loadable as a separate
>> >> executable that is automatically launched, or making code always
>> built
>> >> outside the main executable?
>> >>
>> >> I'm very nervous about having a large number of daemons necessary
>> to run
>> >> QEMU. I think a reasonable approach would be a single front-end
>> daemond.
>> >
>> >
>> > s/daemon/son processes/
>> > Qemu is the one that should spawn them and they should be transparent
>> from the management. This way running qemu stays the same and qemu just
>> need to add the logic to get a SIGCHILD and potentially re-execute an
>> dead son process.
>>
>> Spice is the logical place to start, no? It's the largest single
>> dependency we have and it does some scary things with qemu_mutex. I
>> would use spice as a way to prove the concept.
>
> I agree it is desirable to the this for spice but it is allot more
> complex than virtagent isolation. Spice is performance sensitive and
> contains much more state. It needs to access the guest memory for
> reading the surfaces. It can be solved but needs some major changes.
> Adding spice-devel to the discussion.
Yeah, but the viability of this mechanism is dependent on whether it can
support something that's complex, just like Spice. Considering that the
smaller pieces like VNC or virt-agent are at most a couple thousand of
lines of code, whereas Spice is close to a hundred thousand lines, the
benefit from moving Spice to a separate address space is significantly
higher.
> Will virtagent be kept out of tree till we merge spice?
Nothing should be held up from being merged because of an effort to put
things in a separate address space. But that's not to say that
virt-agent is something that's going to get merged tomorrow. I don't
know that there is even an agreed upon architecture at the moment.
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-02-28 17:44 ` Anthony Liguori
2011-03-01 12:07 ` Dor Laor
@ 2011-03-02 10:19 ` Jes Sorensen
2011-03-02 13:13 ` Michael Roth
1 sibling, 1 reply; 24+ messages in thread
From: Jes Sorensen @ 2011-03-02 10:19 UTC (permalink / raw)
To: Anthony Liguori
Cc: Juan Quintela, Dor Laor, QEMU Developers, Michael Roth,
Anthony Liguori, Gerd Hoffmann, Adam Litke, Amit Shah
On 02/28/11 18:44, Anthony Liguori wrote:
> On Feb 28, 2011 10:44 AM, "Jes Sorensen" <Jes.Sorensen@redhat.com> wrote:
>> > Separating host-side virtagent and other tasks from core QEMU
>> > =============================================================
>> >
>> > To improve auditing of the core QEMU code, it would be ideal to be
>> > able to separate the core QEMU functionality from utility
>> > functionality by moving the utility functionality into its own
>> > process. This process will be referred to as the QEMU client below.
> Separating as in moving code outside of qemu.git, making code optionally
> built in, making code optionally built in or loadable as a separate
> executable that is automatically launched, or making code always built
> outside the main executable?
>
> I'm very nervous about having a large number of daemons necessary to run
> QEMU. I think a reasonable approach would be a single front-end daemond.
>
> Once QAPI is merged, there is a very incremental approach we can take for
> this sort of work. Take your favorite subsystem (like gdbstub or SDL) and
> make it only use QMP apis. Once we're only using QMP internally in a
> subsystem, then building it out of the main QEMU and using libqmp should be
> fairly easy.
Hi Anthony,
Back from a day off playing with power drills and concrete walls :)
Sorry I should have made it a little more clear, it was obvious to me,
but not written down:
The idea is to keep everything as part of the QEMU package, ie. part of
qemu.git. My idea is really to have one QEMU host daemon and one QEMU
client, which provides the various services. You type make and you get
two binaries instead of one. We could allow other daemons to connect to
the host daemon, but that wouldn't be a primary target for this in my
book, and I am not sure we really want to do this.
It is absolutely vital for me that we do not make things much more
complicated for users with this move. I don't want to get into a
situation where we start forcing external packages or daemons in order
to run basic QEMU. If we start requiring such, we have failed! However,
I think it is a reasonable compromise to have one daemon you launch, and
then a simple client you launch straight after which will then provide
the same/similar views and interfaces that users are used to when they
launch current QEMU (monitor, vnc server etc).
I hope this clarifies things.
Cheers,
Jes
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-01 12:07 ` Dor Laor
2011-03-01 12:40 ` Anthony Liguori
@ 2011-03-02 10:21 ` Jes Sorensen
1 sibling, 0 replies; 24+ messages in thread
From: Jes Sorensen @ 2011-03-02 10:21 UTC (permalink / raw)
To: dlaor
Cc: Juan Quintela, Michael Roth, QEMU Developers, Anthony Liguori,
Gerd Hoffmann, Adam Litke, Amit Shah
On 03/01/11 13:07, Dor Laor wrote:
> On 02/28/2011 07:44 PM, Anthony Liguori wrote:
>> I'm very nervous about having a large number of daemons necessary to run
>> QEMU. I think a reasonable approach would be a single front-end daemond.
>
> s/daemon/son processes/
> Qemu is the one that should spawn them and they should be transparent
> from the management. This way running qemu stays the same and qemu just
> need to add the logic to get a SIGCHILD and potentially re-execute an
> dead son process.
I disagree here, I do not want to require QEMU to spawn the new
processes. Having a daemon you can use to connect will provide more
flexibility and isn't unreasonably complex.
Cheers,
Jes
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-01 14:25 ` Dor Laor
2011-03-01 14:29 ` Anthony Liguori
@ 2011-03-02 10:25 ` Jes Sorensen
2011-03-02 10:56 ` Dor Laor
2011-03-02 10:58 ` Alon Levy
2011-03-02 10:28 ` Jes Sorensen
2 siblings, 2 replies; 24+ messages in thread
From: Jes Sorensen @ 2011-03-02 10:25 UTC (permalink / raw)
To: dlaor
Cc: Juan Quintela, Michael Roth, QEMU Developers, Anthony Liguori,
Gerd Hoffmann, Adam Litke, Amit Shah, spice-devel
On 03/01/11 15:25, Dor Laor wrote:
> On 03/01/2011 02:40 PM, Anthony Liguori wrote:
>>
>> On Mar 1, 2011 7:07 AM, "Dor Laor" <dlaor@redhat.com
>> > Qemu is the one that should spawn them and they should be transparent
>> from the management. This way running qemu stays the same and qemu just
>> need to add the logic to get a SIGCHILD and potentially re-execute an
>> dead son process.
>>
>> Spice is the logical place to start, no? It's the largest single
>> dependency we have and it does some scary things with qemu_mutex. I
>> would use spice as a way to prove the concept.
>
> I agree it is desirable to the this for spice but it is allot more
> complex than virtagent isolation. Spice is performance sensitive and
> contains much more state. It needs to access the guest memory for
> reading the surfaces. It can be solved but needs some major changes.
> Adding spice-devel to the discussion.
I had a few thoughts about this already, which I think will work for
both spice and vnc. What we could do is to expose the video memory via
shared memory. That way a spice or vnc daemon could get direct access to
the memory, this would limit communication to keyboard/mouse events, as
well as video mode info, and possibly notifications to the client about
which ranges of memory have been updated.
Using shared memory this way should allow us to implement the video
clients without performance loss, in fact it should be beneficial since
it would allow them to run fully separate from the host daemon.
Cheers,
Jes
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-01 14:25 ` Dor Laor
2011-03-01 14:29 ` Anthony Liguori
2011-03-02 10:25 ` Jes Sorensen
@ 2011-03-02 10:28 ` Jes Sorensen
2011-03-02 10:42 ` Dor Laor
2 siblings, 1 reply; 24+ messages in thread
From: Jes Sorensen @ 2011-03-02 10:28 UTC (permalink / raw)
To: dlaor
Cc: Juan Quintela, Michael Roth, QEMU Developers, Anthony Liguori,
Gerd Hoffmann, Adam Litke, Amit Shah
On 03/01/11 15:25, Dor Laor wrote:
> On 03/01/2011 02:40 PM, Anthony Liguori wrote:
>> Spice is the logical place to start, no? It's the largest single
>> dependency we have and it does some scary things with qemu_mutex. I
>> would use spice as a way to prove the concept.
>
> I agree it is desirable to the this for spice but it is allot more
> complex than virtagent isolation. Spice is performance sensitive and
> contains much more state. It needs to access the guest memory for
> reading the surfaces. It can be solved but needs some major changes.
> Adding spice-devel to the discussion.
Please don't add broken misconfigured mailing lists, which require
moderator or subscription, to discussions on public lists.
Jes
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 10:28 ` Jes Sorensen
@ 2011-03-02 10:42 ` Dor Laor
2011-03-02 10:47 ` Jes Sorensen
0 siblings, 1 reply; 24+ messages in thread
From: Dor Laor @ 2011-03-02 10:42 UTC (permalink / raw)
To: Jes Sorensen
Cc: Juan Quintela, QEMU Developers, Michael Roth, Anthony Liguori,
Alon Levy, Gerd Hoffmann, Adam Litke, Amit Shah
On 03/02/2011 12:28 PM, Jes Sorensen wrote:
> On 03/01/11 15:25, Dor Laor wrote:
>> On 03/01/2011 02:40 PM, Anthony Liguori wrote:
>>> Spice is the logical place to start, no? It's the largest single
>>> dependency we have and it does some scary things with qemu_mutex. I
>>> would use spice as a way to prove the concept.
>>
>> I agree it is desirable to the this for spice but it is allot more
>> complex than virtagent isolation. Spice is performance sensitive and
>> contains much more state. It needs to access the guest memory for
>> reading the surfaces. It can be solved but needs some major changes.
>> Adding spice-devel to the discussion.
>
> Please don't add broken misconfigured mailing lists, which require
> moderator or subscription, to discussions on public lists.
Isn't it simpler to ask the spice list maintainer (Alon Levy, CCed) to
do it?
> Jes
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 10:42 ` Dor Laor
@ 2011-03-02 10:47 ` Jes Sorensen
0 siblings, 0 replies; 24+ messages in thread
From: Jes Sorensen @ 2011-03-02 10:47 UTC (permalink / raw)
To: dlaor
Cc: Juan Quintela, QEMU Developers, Michael Roth, Anthony Liguori,
Alon Levy, Gerd Hoffmann, Adam Litke, Amit Shah
On 03/02/11 11:42, Dor Laor wrote:
> On 03/02/2011 12:28 PM, Jes Sorensen wrote:
>> On 03/01/11 15:25, Dor Laor wrote:
>>> I agree it is desirable to the this for spice but it is allot more
>>> complex than virtagent isolation. Spice is performance sensitive and
>>> contains much more state. It needs to access the guest memory for
>>> reading the surfaces. It can be solved but needs some major changes.
>>> Adding spice-devel to the discussion.
>>
>> Please don't add broken misconfigured mailing lists, which require
>> moderator or subscription, to discussions on public lists.
>
> Isn't it simpler to ask the spice list maintainer (Alon Levy, CCed) to
> do it?
We cannot have a discussion on a mailing list if we constantly have to
wait for the list maintainer to approve it. There is really zero
justification for closing a development list of an open source project.
Spam is handled in other ways, this doesn't solve it.
Cheers,
Jes
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 10:25 ` Jes Sorensen
@ 2011-03-02 10:56 ` Dor Laor
2011-03-02 11:02 ` Jes Sorensen
2011-03-02 10:58 ` Alon Levy
1 sibling, 1 reply; 24+ messages in thread
From: Dor Laor @ 2011-03-02 10:56 UTC (permalink / raw)
To: Jes Sorensen
Cc: Juan Quintela, QEMU Developers, Michael Roth, Anthony Liguori,
Gerd Hoffmann, Adam Litke, Amit Shah, spice-devel
On 03/02/2011 12:25 PM, Jes Sorensen wrote:
> On 03/01/11 15:25, Dor Laor wrote:
>> On 03/01/2011 02:40 PM, Anthony Liguori wrote:
>>>
>>> On Mar 1, 2011 7:07 AM, "Dor Laor"<dlaor@redhat.com
>>> > Qemu is the one that should spawn them and they should be transparent
>>> from the management. This way running qemu stays the same and qemu just
>>> need to add the logic to get a SIGCHILD and potentially re-execute an
>>> dead son process.
>>>
>>> Spice is the logical place to start, no? It's the largest single
>>> dependency we have and it does some scary things with qemu_mutex. I
>>> would use spice as a way to prove the concept.
>>
>> I agree it is desirable to the this for spice but it is allot more
>> complex than virtagent isolation. Spice is performance sensitive and
>> contains much more state. It needs to access the guest memory for
>> reading the surfaces. It can be solved but needs some major changes.
>> Adding spice-devel to the discussion.
>
> I had a few thoughts about this already, which I think will work for
> both spice and vnc. What we could do is to expose the video memory via
> shared memory. That way a spice or vnc daemon could get direct access to
> the memory, this would limit communication to keyboard/mouse events, as
> well as video mode info, and possibly notifications to the client about
> which ranges of memory have been updated.
>
> Using shared memory this way should allow us to implement the video
> clients without performance loss, in fact it should be beneficial since
> it would allow them to run fully separate from the host daemon.
Why do you call it a daemon? Each VM instance should have only one, the
'host daemon' naming is misleading.
The proper solution long term is to sandbox qemu in a way that there
privileged mode and non privileged mode. It might be implemented using
separate address space or not. Most operations like vnc/rpc/spice/usb
should be run with less privileges.
The main issue is that doing it right will take time and we'll want
virt-agent be merged before the long term solution is ready. The best
approach would be gradual development
>
> Cheers,
> Jes
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 10:25 ` Jes Sorensen
2011-03-02 10:56 ` Dor Laor
@ 2011-03-02 10:58 ` Alon Levy
2011-03-02 11:04 ` Dor Laor
2011-03-02 11:05 ` Jes Sorensen
1 sibling, 2 replies; 24+ messages in thread
From: Alon Levy @ 2011-03-02 10:58 UTC (permalink / raw)
To: Jes Sorensen
Cc: Juan Quintela, dlaor, QEMU Developers, Michael Roth,
Anthony Liguori, Gerd Hoffmann, Adam Litke, Amit Shah,
spice-devel
On Wed, Mar 02, 2011 at 11:25:44AM +0100, Jes Sorensen wrote:
> On 03/01/11 15:25, Dor Laor wrote:
> > On 03/01/2011 02:40 PM, Anthony Liguori wrote:
> >>
> >> On Mar 1, 2011 7:07 AM, "Dor Laor" <dlaor@redhat.com
> >> > Qemu is the one that should spawn them and they should be transparent
> >> from the management. This way running qemu stays the same and qemu just
> >> need to add the logic to get a SIGCHILD and potentially re-execute an
> >> dead son process.
> >>
> >> Spice is the logical place to start, no? It's the largest single
> >> dependency we have and it does some scary things with qemu_mutex. I
> >> would use spice as a way to prove the concept.
> >
> > I agree it is desirable to the this for spice but it is allot more
> > complex than virtagent isolation. Spice is performance sensitive and
> > contains much more state. It needs to access the guest memory for
> > reading the surfaces. It can be solved but needs some major changes.
> > Adding spice-devel to the discussion.
>
> I had a few thoughts about this already, which I think will work for
> both spice and vnc. What we could do is to expose the video memory via
> shared memory. That way a spice or vnc daemon could get direct access to
> the memory, this would limit communication to keyboard/mouse events, as
> well as video mode info, and possibly notifications to the client about
> which ranges of memory have been updated.
>
> Using shared memory this way should allow us to implement the video
> clients without performance loss, in fact it should be beneficial since
> it would allow them to run fully separate from the host daemon.
>
I think that would work well for spice. Spice uses shared memory from the
pci device for both the framebuffer and surfaces/commands, but this is
not really relevant at this level. What about IO and irq? that would add
additional latencies, no? because each io exit would need to be ipc'ed over
to the spice/vnc process? and same way in the other direction, requesting
qemu to trigger an interrupt in the next vm entry.
> Cheers,
> Jes
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 10:56 ` Dor Laor
@ 2011-03-02 11:02 ` Jes Sorensen
0 siblings, 0 replies; 24+ messages in thread
From: Jes Sorensen @ 2011-03-02 11:02 UTC (permalink / raw)
To: dlaor
Cc: Juan Quintela, QEMU Developers, Michael Roth, Anthony Liguori,
Gerd Hoffmann, Adam Litke, Amit Shah, spice-devel
On 03/02/11 11:56, Dor Laor wrote:
> On 03/02/2011 12:25 PM, Jes Sorensen wrote:
>> On 03/01/11 15:25, Dor Laor wrote:
>> Using shared memory this way should allow us to implement the video
>> clients without performance loss, in fact it should be beneficial since
>> it would allow them to run fully separate from the host daemon.
>
> Why do you call it a daemon? Each VM instance should have only one, the
> 'host daemon' naming is misleading.
I refer to it as a daemon because it is something the client(s) will
connect to. But yes, there will be a daemon per VM.
> The proper solution long term is to sandbox qemu in a way that there
> privileged mode and non privileged mode. It might be implemented using
> separate address space or not. Most operations like vnc/rpc/spice/usb
> should be run with less privileges.
>
> The main issue is that doing it right will take time and we'll want
> virt-agent be merged before the long term solution is ready. The best
> approach would be gradual development
Yes I agree, I don't think this will happen overnight, and blocking
virtagent with this would be bad.
Cheers,
Jes
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 10:58 ` Alon Levy
@ 2011-03-02 11:04 ` Dor Laor
2011-03-02 12:39 ` Alon Levy
2011-04-26 9:14 ` Gerd Hoffmann
2011-03-02 11:05 ` Jes Sorensen
1 sibling, 2 replies; 24+ messages in thread
From: Dor Laor @ 2011-03-02 11:04 UTC (permalink / raw)
To: Jes Sorensen, Juan Quintela, Michael Roth, QEMU Developers,
Anthony Liguori, Gerd Hoffmann, Adam Litke, Amit Shah,
spice-devel
On 03/02/2011 12:58 PM, Alon Levy wrote:
> On Wed, Mar 02, 2011 at 11:25:44AM +0100, Jes Sorensen wrote:
>> On 03/01/11 15:25, Dor Laor wrote:
>>> On 03/01/2011 02:40 PM, Anthony Liguori wrote:
>>>>
>>>> On Mar 1, 2011 7:07 AM, "Dor Laor"<dlaor@redhat.com
>>>> > Qemu is the one that should spawn them and they should be transparent
>>>> from the management. This way running qemu stays the same and qemu just
>>>> need to add the logic to get a SIGCHILD and potentially re-execute an
>>>> dead son process.
>>>>
>>>> Spice is the logical place to start, no? It's the largest single
>>>> dependency we have and it does some scary things with qemu_mutex. I
>>>> would use spice as a way to prove the concept.
>>>
>>> I agree it is desirable to the this for spice but it is allot more
>>> complex than virtagent isolation. Spice is performance sensitive and
>>> contains much more state. It needs to access the guest memory for
>>> reading the surfaces. It can be solved but needs some major changes.
>>> Adding spice-devel to the discussion.
>>
>> I had a few thoughts about this already, which I think will work for
>> both spice and vnc. What we could do is to expose the video memory via
>> shared memory. That way a spice or vnc daemon could get direct access to
>> the memory, this would limit communication to keyboard/mouse events, as
>> well as video mode info, and possibly notifications to the client about
>> which ranges of memory have been updated.
>>
>> Using shared memory this way should allow us to implement the video
>> clients without performance loss, in fact it should be beneficial since
>> it would allow them to run fully separate from the host daemon.
>>
>
> I think that would work well for spice. Spice uses shared memory from the
> pci device for both the framebuffer and surfaces/commands, but this is
Is that the only DMA do you do? That's good for this model.
> not really relevant at this level. What about IO and irq? that would add
> additional latencies, no? because each io exit would need to be ipc'ed over
> to the spice/vnc process? and same way in the other direction, requesting
> qemu to trigger an interrupt in the next vm entry.
The qxl device can be in the privileged qemu (as a start) and it will
handle irqs directly. Even today you need to notify the spice server
thread, so nothing will change
>
>> Cheers,
>> Jes
>>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 10:58 ` Alon Levy
2011-03-02 11:04 ` Dor Laor
@ 2011-03-02 11:05 ` Jes Sorensen
1 sibling, 0 replies; 24+ messages in thread
From: Jes Sorensen @ 2011-03-02 11:05 UTC (permalink / raw)
To: dlaor, Juan Quintela, Michael Roth, QEMU Developers,
Anthony Liguori, Gerd Hoffmann, Adam Litke, Amit Shah,
spice-devel
On 03/02/11 11:58, Alon Levy wrote:
> On Wed, Mar 02, 2011 at 11:25:44AM +0100, Jes Sorensen wrote:
>> I had a few thoughts about this already, which I think will work for
>> both spice and vnc. What we could do is to expose the video memory via
>> shared memory. That way a spice or vnc daemon could get direct access to
>> the memory, this would limit communication to keyboard/mouse events, as
>> well as video mode info, and possibly notifications to the client about
>> which ranges of memory have been updated.
>>
>> Using shared memory this way should allow us to implement the video
>> clients without performance loss, in fact it should be beneficial since
>> it would allow them to run fully separate from the host daemon.
>>
>
> I think that would work well for spice. Spice uses shared memory from the
> pci device for both the framebuffer and surfaces/commands, but this is
> not really relevant at this level. What about IO and irq? that would add
> additional latencies, no? because each io exit would need to be ipc'ed over
> to the spice/vnc process? and same way in the other direction, requesting
> qemu to trigger an interrupt in the next vm entry.
I am glad the shmem approach will work for Spice. There would be
something there with IRQs etc, I agree. but there are methods to help
that too, we could use a shared memory event ring for example.
Cheers,
Jes
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 11:04 ` Dor Laor
@ 2011-03-02 12:39 ` Alon Levy
2011-04-26 9:14 ` Gerd Hoffmann
1 sibling, 0 replies; 24+ messages in thread
From: Alon Levy @ 2011-03-02 12:39 UTC (permalink / raw)
To: Dor Laor
Cc: Juan Quintela, Jes Sorensen, QEMU Developers, Michael Roth,
Anthony Liguori, Gerd Hoffmann, Adam Litke, Amit Shah,
spice-devel
On Wed, Mar 02, 2011 at 01:04:58PM +0200, Dor Laor wrote:
> On 03/02/2011 12:58 PM, Alon Levy wrote:
> >On Wed, Mar 02, 2011 at 11:25:44AM +0100, Jes Sorensen wrote:
> >>On 03/01/11 15:25, Dor Laor wrote:
> >>>On 03/01/2011 02:40 PM, Anthony Liguori wrote:
> >>>>
> >>>>On Mar 1, 2011 7:07 AM, "Dor Laor"<dlaor@redhat.com
> >>>> > Qemu is the one that should spawn them and they should be transparent
> >>>>from the management. This way running qemu stays the same and qemu just
> >>>>need to add the logic to get a SIGCHILD and potentially re-execute an
> >>>>dead son process.
> >>>>
> >>>>Spice is the logical place to start, no? It's the largest single
> >>>>dependency we have and it does some scary things with qemu_mutex. I
> >>>>would use spice as a way to prove the concept.
> >>>
> >>>I agree it is desirable to the this for spice but it is allot more
> >>>complex than virtagent isolation. Spice is performance sensitive and
> >>>contains much more state. It needs to access the guest memory for
> >>>reading the surfaces. It can be solved but needs some major changes.
> >>>Adding spice-devel to the discussion.
> >>
> >>I had a few thoughts about this already, which I think will work for
> >>both spice and vnc. What we could do is to expose the video memory via
> >>shared memory. That way a spice or vnc daemon could get direct access to
> >>the memory, this would limit communication to keyboard/mouse events, as
> >>well as video mode info, and possibly notifications to the client about
> >>which ranges of memory have been updated.
> >>
> >>Using shared memory this way should allow us to implement the video
> >>clients without performance loss, in fact it should be beneficial since
> >>it would allow them to run fully separate from the host daemon.
> >>
> >
> >I think that would work well for spice. Spice uses shared memory from the
> >pci device for both the framebuffer and surfaces/commands, but this is
>
> Is that the only DMA do you do? That's good for this model.
>
Yes. We have two memory bars (another for rom) and an io bar. The bars contain
the framebuffer (primary surface backing store, also used in vga mode), the
non primary surfaces backing store and the rings (display, cursor, and release).
In qxl (native) mode the rings are read/written to all the time, the rest by demand.
In vga mode it's identical to vnc, the framebuffer is written from the guest and
we track the dirty regions.
> >not really relevant at this level. What about IO and irq? that would add
> >additional latencies, no? because each io exit would need to be ipc'ed over
> >to the spice/vnc process? and same way in the other direction, requesting
> >qemu to trigger an interrupt in the next vm entry.
>
> The qxl device can be in the privileged qemu (as a start) and it
> will handle irqs directly. Even today you need to notify the spice
> server thread, so nothing will change
ok, so qxl remains in qemu process. But all those io exits (well, most) end
up as calls to spice-server, now in another process. So latency wise it's the
same.
> >
> >>Cheers,
> >>Jes
> >>
>
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 10:19 ` Jes Sorensen
@ 2011-03-02 13:13 ` Michael Roth
2011-03-02 13:18 ` Jes Sorensen
0 siblings, 1 reply; 24+ messages in thread
From: Michael Roth @ 2011-03-02 13:13 UTC (permalink / raw)
To: Jes Sorensen
Cc: Juan Quintela, Dor Laor, QEMU Developers, Anthony Liguori,
Gerd Hoffmann, Adam Litke, Amit Shah
On 03/02/2011 04:19 AM, Jes Sorensen wrote:
> On 02/28/11 18:44, Anthony Liguori wrote:
>> On Feb 28, 2011 10:44 AM, "Jes Sorensen"<Jes.Sorensen@redhat.com> wrote:
>>>> Separating host-side virtagent and other tasks from core QEMU
>>>> =============================================================
>>>>
>>>> To improve auditing of the core QEMU code, it would be ideal to be
>>>> able to separate the core QEMU functionality from utility
>>>> functionality by moving the utility functionality into its own
>>>> process. This process will be referred to as the QEMU client below.
>> Separating as in moving code outside of qemu.git, making code optionally
>> built in, making code optionally built in or loadable as a separate
>> executable that is automatically launched, or making code always built
>> outside the main executable?
>>
>> I'm very nervous about having a large number of daemons necessary to run
>> QEMU. I think a reasonable approach would be a single front-end daemond.
>>
>> Once QAPI is merged, there is a very incremental approach we can take for
>> this sort of work. Take your favorite subsystem (like gdbstub or SDL) and
>> make it only use QMP apis. Once we're only using QMP internally in a
>> subsystem, then building it out of the main QEMU and using libqmp should be
>> fairly easy.
>
> Hi Anthony,
>
> Back from a day off playing with power drills and concrete walls :)
>
> Sorry I should have made it a little more clear, it was obvious to me,
> but not written down:
>
> The idea is to keep everything as part of the QEMU package, ie. part of
> qemu.git. My idea is really to have one QEMU host daemon and one QEMU
> client, which provides the various services. You type make and you get
> two binaries instead of one. We could allow other daemons to connect to
> the host daemon, but that wouldn't be a primary target for this in my
> book, and I am not sure we really want to do this.
>
> It is absolutely vital for me that we do not make things much more
> complicated for users with this move. I don't want to get into a
> situation where we start forcing external packages or daemons in order
> to run basic QEMU. If we start requiring such, we have failed! However,
> I think it is a reasonable compromise to have one daemon you launch, and
> then a simple client you launch straight after which will then provide
> the same/similar views and interfaces that users are used to when they
> launch current QEMU (monitor, vnc server etc).
I think the challenge with this approach is defining an IPC mechanism
that is robust enough to support it. For instance, on one end of the
spectrum we have Spice, where shared memory paired with some mechanism
for IO notification between the client/server might make sense. But then
we have things like the human monitor where a socket interface or pipe
is clearly more the more straight-forward route.
We may find that it more desirable to have multiple classes of client
components, each contain within a client process with it's own IPC
mechanism. Although, multiple IPC mechanisms doesn't sound particularly
enticing either...but 2 might not be so unreasonable.
>
> I hope this clarifies things.
>
> Cheers,
> Jes
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 13:13 ` Michael Roth
@ 2011-03-02 13:18 ` Jes Sorensen
2011-03-02 13:49 ` Michael Roth
0 siblings, 1 reply; 24+ messages in thread
From: Jes Sorensen @ 2011-03-02 13:18 UTC (permalink / raw)
To: Michael Roth
Cc: Juan Quintela, Dor Laor, QEMU Developers, Anthony Liguori,
Gerd Hoffmann, Adam Litke, Amit Shah
On 03/02/11 14:13, Michael Roth wrote:
> On 03/02/2011 04:19 AM, Jes Sorensen wrote:
>> It is absolutely vital for me that we do not make things much more
>> complicated for users with this move. I don't want to get into a
>> situation where we start forcing external packages or daemons in order
>> to run basic QEMU. If we start requiring such, we have failed! However,
>> I think it is a reasonable compromise to have one daemon you launch, and
>> then a simple client you launch straight after which will then provide
>> the same/similar views and interfaces that users are used to when they
>> launch current QEMU (monitor, vnc server etc).
>
> I think the challenge with this approach is defining an IPC mechanism
> that is robust enough to support it. For instance, on one end of the
> spectrum we have Spice, where shared memory paired with some mechanism
> for IO notification between the client/server might make sense. But then
> we have things like the human monitor where a socket interface or pipe
> is clearly more the more straight-forward route.
>
> We may find that it more desirable to have multiple classes of client
> components, each contain within a client process with it's own IPC
> mechanism. Although, multiple IPC mechanisms doesn't sound particularly
> enticing either...but 2 might not be so unreasonable.
Hi Michael,
I think we need two types for sure, even for the video case, we will
still need a control channel as well. However, I don't think it is
desirable to split things up more than we have to, so if we can keep it
within one client process that is good. Maybe there are cases where it
makes sense to split it into more processes, I could be convinced, but I
think we really need to be careful making it too much of a complex mess
either.
Cheers,
Jes
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 13:18 ` Jes Sorensen
@ 2011-03-02 13:49 ` Michael Roth
2011-03-03 13:29 ` Jes Sorensen
0 siblings, 1 reply; 24+ messages in thread
From: Michael Roth @ 2011-03-02 13:49 UTC (permalink / raw)
To: Jes Sorensen
Cc: Juan Quintela, Dor Laor, QEMU Developers, Anthony Liguori,
Gerd Hoffmann, Adam Litke, Amit Shah
On 03/02/2011 07:18 AM, Jes Sorensen wrote:
> On 03/02/11 14:13, Michael Roth wrote:
>> On 03/02/2011 04:19 AM, Jes Sorensen wrote:
>
>>> It is absolutely vital for me that we do not make things much more
>>> complicated for users with this move. I don't want to get into a
>>> situation where we start forcing external packages or daemons in order
>>> to run basic QEMU. If we start requiring such, we have failed! However,
>>> I think it is a reasonable compromise to have one daemon you launch, and
>>> then a simple client you launch straight after which will then provide
>>> the same/similar views and interfaces that users are used to when they
>>> launch current QEMU (monitor, vnc server etc).
>>
>> I think the challenge with this approach is defining an IPC mechanism
>> that is robust enough to support it. For instance, on one end of the
>> spectrum we have Spice, where shared memory paired with some mechanism
>> for IO notification between the client/server might make sense. But then
>> we have things like the human monitor where a socket interface or pipe
>> is clearly more the more straight-forward route.
>>
>> We may find that it more desirable to have multiple classes of client
>> components, each contain within a client process with it's own IPC
>> mechanism. Although, multiple IPC mechanisms doesn't sound particularly
>> enticing either...but 2 might not be so unreasonable.
>
> Hi Michael,
>
> I think we need two types for sure, even for the video case, we will
> still need a control channel as well. However, I don't think it is
> desirable to split things up more than we have to, so if we can keep it
> within one client process that is good. Maybe there are cases where it
> makes sense to split it into more processes, I could be convinced, but I
> think we really need to be careful making it too much of a complex mess
> either.
Yup, if it's doable I'd prefer a single client process as well. Just
hard to predict how difficult it'll be to support 2 or more mechanisms.
Although, I'd imagine we'd end up with something like qemu's io loop,
with event-driven shmem and fd-based work, which does seem doable.
>
> Cheers,
> Jes
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 13:49 ` Michael Roth
@ 2011-03-03 13:29 ` Jes Sorensen
0 siblings, 0 replies; 24+ messages in thread
From: Jes Sorensen @ 2011-03-03 13:29 UTC (permalink / raw)
To: Michael Roth
Cc: Juan Quintela, Dor Laor, QEMU Developers, Anthony Liguori,
Gerd Hoffmann, Adam Litke, Amit Shah
On 03/02/11 14:49, Michael Roth wrote:
> On 03/02/2011 07:18 AM, Jes Sorensen wrote:
>> I think we need two types for sure, even for the video case, we will
>> still need a control channel as well. However, I don't think it is
>> desirable to split things up more than we have to, so if we can keep it
>> within one client process that is good. Maybe there are cases where it
>> makes sense to split it into more processes, I could be convinced, but I
>> think we really need to be careful making it too much of a complex mess
>> either.
>
> Yup, if it's doable I'd prefer a single client process as well. Just
> hard to predict how difficult it'll be to support 2 or more mechanisms.
> Although, I'd imagine we'd end up with something like qemu's io loop,
> with event-driven shmem and fd-based work, which does seem doable.
That is pretty much what I had in mind. Will have to see how it works
out, but I think it is very feasible :)
Cheers,
Jes
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-03-02 11:04 ` Dor Laor
2011-03-02 12:39 ` Alon Levy
@ 2011-04-26 9:14 ` Gerd Hoffmann
2011-04-26 13:15 ` Anthony Liguori
1 sibling, 1 reply; 24+ messages in thread
From: Gerd Hoffmann @ 2011-04-26 9:14 UTC (permalink / raw)
To: dlaor
Cc: Juan Quintela, Jes Sorensen, QEMU Developers, Michael Roth,
Anthony Liguori, Adam Litke, Amit Shah, spice-devel
Hi,
>> I think that would work well for spice. Spice uses shared memory from the
>> pci device for both the framebuffer and surfaces/commands, but this is
>
> Is that the only DMA do you do? That's good for this model.
Yes. Spice does both reads and writes though, so a way to tag pages as
dirty is needed.
cheers,
Gerd
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features
2011-04-26 9:14 ` Gerd Hoffmann
@ 2011-04-26 13:15 ` Anthony Liguori
0 siblings, 0 replies; 24+ messages in thread
From: Anthony Liguori @ 2011-04-26 13:15 UTC (permalink / raw)
To: Gerd Hoffmann
Cc: Juan Quintela, Jes Sorensen, dlaor, Michael Roth,
QEMU Developers, Anthony Liguori, Adam Litke, Amit Shah,
spice-devel
On 04/26/2011 04:14 AM, Gerd Hoffmann wrote:
> Hi,
>
>>> I think that would work well for spice. Spice uses shared memory from
>>> the
>>> pci device for both the framebuffer and surfaces/commands, but this is
>>
>> Is that the only DMA do you do? That's good for this model.
>
> Yes. Spice does both reads and writes though, so a way to tag pages as
> dirty is needed.
Just implementing Spice as it currently is in a separate process isn't
going to be useful IMHO.
I would think that the best approach would be to parse all of the ring
requests in QEMU itself, and issue higher level commands to a separate
process. You can still have the video memory segment mapped in a
separate process but QEMU should know enough about what's going on to
take care of dirtying the memory.
Sort of like how we deal with SCSI passthrough. We interpret enough of
the command to hand it off to something else and then handle the return
logic.
Having QEMU as an intermediary is important to preserve our current
security model. We shouldn't be passing unsanitized guest input to an
external process.
Regards,
Anthony Liguori
> cheers,
> Gerd
>
>
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2011-04-26 13:15 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-02-28 16:42 [Qemu-devel] QEMU: Discussion of separating core functionality vs supportive features Jes Sorensen
2011-02-28 17:44 ` Anthony Liguori
2011-03-01 12:07 ` Dor Laor
2011-03-01 12:40 ` Anthony Liguori
2011-03-01 14:25 ` Dor Laor
2011-03-01 14:29 ` Anthony Liguori
2011-03-02 10:25 ` Jes Sorensen
2011-03-02 10:56 ` Dor Laor
2011-03-02 11:02 ` Jes Sorensen
2011-03-02 10:58 ` Alon Levy
2011-03-02 11:04 ` Dor Laor
2011-03-02 12:39 ` Alon Levy
2011-04-26 9:14 ` Gerd Hoffmann
2011-04-26 13:15 ` Anthony Liguori
2011-03-02 11:05 ` Jes Sorensen
2011-03-02 10:28 ` Jes Sorensen
2011-03-02 10:42 ` Dor Laor
2011-03-02 10:47 ` Jes Sorensen
2011-03-02 10:21 ` Jes Sorensen
2011-03-02 10:19 ` Jes Sorensen
2011-03-02 13:13 ` Michael Roth
2011-03-02 13:18 ` Jes Sorensen
2011-03-02 13:49 ` Michael Roth
2011-03-03 13:29 ` Jes Sorensen
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.