[libvirt] PATCH: Be more flexible in emulator choice on x86 archs

Daniel P. Berrange berrange at redhat.com
Fri Mar 20 11:18:57 UTC 2009


On Fri, Mar 20, 2009 at 11:57:24AM +0100, Daniel Veillard wrote:
> On Mon, Mar 16, 2009 at 06:03:59PM +0000, Daniel P. Berrange wrote:
> > Currently we are pretty strict about what emulator binary we allow for
> > QEMU guests on x86 arches. In particular, for arch+domain type combos:
> > 
> >  - i686+qemu must use 'qemu' binary
> >  - x86_64+qemu must use 'qemu-system-x86_64' binary
> >  - kvm must use 'qemu-kvm' or 'kvm' binaries
> >  - i686+kvm on x86_64 host is not allowed
> > 
> > These restrictions are overkill because
> > 
> >  - i686+qemu could use 'qemu-system-x86_64' if '-cpu qemu32' is added
> >  - i686+qemu could use 'qemu-kvm' if '-cpu qemu32 -no-kvm' is added
> >  - x86_64+qemu could use 'qemu-kvm' if '-no-kvm' is added
> >  - i686+kvm on x86_64 host can be used if '-cpu qemu32' is added
> > 
> > This patch makes QEMU driver more flexible in this way when setting up
> > its capabilities information. It also makes it aware of the -no-kvm
> > and -cpu flag, using them where required by the os type + arch + emulator
> > combinations specified in the guest XML.
> > 
> > This should finally remove the confusion where a user in virt-manager
> > selectrs 'i686' and then wonders why we've disallowed choice of 'kvm'.
> > It also fixes 'virsh version' when only qemu-kvm is installed.
> > 
> > The matrix should now work thus:
> > 
> > 1. qemu, qemu-system-x86_64, qemu-kvm all available
> > 
> >      qemu+i686   => qemu
> >      qemu+x86_64 => qemu-system-x86_64
> >      kvm+i686    => qemu-kvm -cpu qemu32
> >      kvm+x86_64  => qemu-kvm
> > 
> > 2. qemu, qemu-kvm available
> > 
> >      qemu+i686   => qemu
> >      qemu+x86_64 => qemu-kvm -no-kvm
> >      kvm+i686    => qemu-kvm -cpu qemu32
> >      kvm+x86_64  => qemu-kvm
> > 
> > 3. qemu-system-x86_64, qemu-kvm available
> > 
> >      qemu+i686   => qemu-system-x86_64 -cpu qemu32
> >      qemu+x86_64 => qemu-system-x86_64
> >      kvm+i686    => qemu-kvm -cpu qemu32
> >      kvm+x86_64  => qemu-kvm
> > 
> > 4. qemu-kvm available
> > 
> >      qemu+i686   => qemu-kvm -no-kvm -cpu qemu32
> >      qemu+x86_64 => qemu-kvm -no-kvm
> >      kvm+i686    => qemu-kvm -cpu qemu32
> >      kvm+x86_64  => qemu-kvm
> > 
> > 
> > The only real remaining problem is that we don't cope with scenario
> > where the KVM enabled binary is called 'qemu-system-x64_64' instead
> > of 'qemu-kvm' or 'kvm'.
> 
>   The confusion around this deserve a patch, and that sounds one way
> to get this solved ... but I find the approach "here is a hard coded
> path", then "oh we finally need to add a second hardcoded path" a bit
> worrying. This also doesn't cope with the occasional troubles where
> people have a binary outside of /usr/bin. Maybe some of this logic could
> be reduced and relying on configuration data would allow a fully
> flexible system (where the user can bite himself too, but heh), by
> suggesting architecture emulation binary names (with the above as
> the default) and a separate path list to lookup those binaries.
> Or we could just allow symlinks to be set in /usr/local/bin
> pointing to whatever the binaries names may be on that system or
> something approaching.

I agree, this approach we're currently using has pretty much reached
the end of its practicality. In particular it is impossible to solve
the problem of figuring out whether a plain 'qemu' binary supports
kvm natively. To adress that, we'd actually need to run the binary
and probe its output. This would require pretty much re-writing this
entire capabilities setup logic from scratch. Similarly coping with
varying path locations is another problem we can't easily solve with
this current code.  

To address this I think we'd need to completely change the logic to
do something like

 - For each directory in $PATH
     For each emulator name in (qemu, qemu-system-x864, etc)
        If emulator exists
           run  $emulator -help

So this lets us build up a list of all available emulators and their
capabilities (eg, whether each supports qemu, kqemu, kvm).

>From that list, we can then populate the list of supported combinations
of guest, arch, domain type. 

If we honour $PATH, then it probably wouldn't be neccessary to add
config params for it.

>   But ACK, as is this solves the problem,

Ok, will commit it shortly.

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list