[Libvir] Proposed XML format for capabilities, with examples [long]
Daniel P. Berrange
berrange at redhat.com
Thu Mar 15 14:27:04 UTC 2007
On Wed, Mar 14, 2007 at 11:59:57AM +0000, Richard W.M. Jones wrote:
>
> My thoughts are that capabilities need to return the following
> information about the underlying driver/hypervisor:
>
> * Host CPU flags (1,8)
> * List of guest architectures supported. For each of these:
> - Model of virtualised CPU (10,13)
> example: x86_64
> - Name of the virtualised machine (if applic.)
> example: pc
> - Virtualised CPU features: PAE, ...
> - Fullvirt flag: can we run an unmodified OS as a guest? (2,9)
> or Paravirt: what sort of paravirt API does a guest need
> (eg. xen, pvops, VMI, ...)?
> - The <domain type='?'> for this guest
> example: kqemu
> - The <domain><os><type machine='?'> for this guest (if applic.)
> example: pc
> - Suggested emulator and loader paths (5)
> - Driver-specific flags which libvirt clients would not be
> required to understand, but could be used to enhance
> libvirt clients.
> examples: uses kqemu, uses kvm (3,4,11)
>
> (Notes: (a) I have flattened qemu's nested arch/machine list, because I
> there is not a natural hierarchy. (b) The guest architectures list is a
> Cartesian product, although at the moment the worst case (qemu) would
> only have about 14 entries. An alternate way to do this is discussed at
> the end. (c) The host CPU model is already provided by virNodeGetInfo).
Currently this shows a Cartesian product of (arch,ostype,domaintype,flags)
but I think we should reduce it to merely (arch,ostype) and use a slightly
more heirarchical structure. The domaintype & flags only really add a
slight specialization of the basic (arch,ostype) info, so I think it is
worthwhile.
Also rather than having '<paravirt>xen</paravirt>' and '<fullyvirt/>'
I think we should just call it 'os_type' since this info is used to
populate the <os><type>..</type></os> field in the domain XML. A
second reason is that KVM is very likely to blur the boundaries between
paravirt & fullyvirt. ie, KVM is in its heart a fullyvirt system, but
it supports various paravirt extensions - a fullyvirt guest OS can
detect these paravirt extensions & make use of them on the fly. So
its better not to express a hard paravirt/fullyvirt split in the XML.
So I'm suggesting just <os_type>xen</os_type> and <os_type>hvm</os_type>
> Example: Xen
> ------------
>
> For Xen the primary source for capabilities are the files
> /sys/hypervisor/properties/capabilities and /proc/cpuinfo. A Xen driver
> might present the following description of its capabilities:
>
> <capabilities>
> <host>
> <cpu_flags>
> <cpu_flag> vmx </cpu_flag>
> <cpu_flag> pae </cpu_flag> <!-- etc -->
> </cpu_flags>
> </host>
>
> <guest_architectures>
> <guest_architecture>
> <model> x86_64 </model>
> <paravirt> xen </paravirt>
> <domain_type> xen </domain_type>
> <emulator> /usr/lib/xen/bin/qemu-dm </emulator>
> </guest_architecture>
>
> <guest_architecture>
> <model> i686 </model>
> <pae/>
> <paravirt> xen </paravirt>
> <domain_type> xen </domain_type>
> <emulator> /usr/lib/xen/bin/qemu-dm </emulator>
> </guest_architecture>
>
> <guest_architecture>
> <model> i686 </model>
> <fullvirt/>
> <domain_type> xen </domain_type>
> <loader> /usr/lib/xen/boot/hvmloader </loader>
> <emulator> /usr/lib/xen/bin/qemu-dm </emulator>
> </guest_architecture>
>
> <guest_architecture>
> <model> i686 </model>
> <pae/>
> <fullvirt/>
> <domain_type> xen </domain_type>
> <loader> /usr/lib/xen/boot/hvmloader </loader>
> <emulator> /usr/lib/xen/bin/qemu-dm </emulator>
> </guest_architecture>
>
> <guest_architecture>
> <model> x86_64 </model>
> <fullvirt/>
> <domain_type> xen </domain_type>
> <loader> /usr/lib/xen/boot/hvmloader </loader>
> <emulator> /usr/lib/xen/bin/qemu-dm </emulator>
> </guest_architecture>
> </guest_architectures>
> </capabilities>
This would look like:
<capabilities>
<host>
<cpu>
<arch>x86_64</arch>
<features>
<vmx/>
<pae/>
</features>
</cpu>
</host>
<!-- xen-3.0-x86_64p -->
<guest>
<os_type>xen</os_type>
<arch name="x86_64">
<wordsize>64</wordsize>
<domain type="xen"/>
</arch>
<features>
<pae/>
</features>
</guest>
<!-- xen-3.0-x86_32p -->
<guest>
<os_type>xen</os_type>
<arch name="i686">
<wordsize>32</wordsize>
<domain type="xen"/>
</arch>
<features>
<pae/>
</features>
</guest>
<!-- hvm-3.0-x86_64p -->
<guest>
<os_type>hvm</os_type>
<arch name="x86_64">
<machine >pc</machine>
<machine>isapc</machine>
<emulator>/usr/lib/xen/qemu-dm</emulator>
<loader>/usr/lib/xen/hvmloader</loader>
<domain type="xen"/>
</arch>
<features>
<pae/>
<nonpae/>
</features>
</guest>
<!-- hvm-3.0-x86_64p -->
<guest>
<os_type>hvm</os_type>
<arch name="i686">
<machine >pc</machine>
<machine>isapc</machine>
<emulator>/usr/lib/xen/qemu-dm</emulator>
<loader>/usr/lib/xen/hvmloader</loader>
<domain type="xen"/>
</arch>
<features>
<pae/>
<nonpae/>
</features>
</guest>
</capabilities>
Notice I have an expliciyt '<nonpae/>' flag, because PAE is really a
tri-state. A domain can support PAE, or none-PAE or both.
> Example: qemu + kqemu + kvm
> ---------------------------
>
> Qemu has by far the longest list of supported guest architectures. Out
> of the box it supports 10 distinct machine types and then you can add 4
> extra machine types if the kernel can do kqemu and kvm, making 14 in
> all. Below I have abbreviated this list for clarity.
>
> <capabilities>
> <host>
> <cpu_flags>
> <cpu_flag> vmx </cpu_flag>
> <cpu_flag> pae </cpu_flag> <!-- etc -->
> </cpu_flags>
> </host>
>
> <guest_architectures>
> <guest_architecture>
> <model> sparc </model>
> <machine> sun4m </machine>
> <fullvirt/>
> <domain_type> qemu </domain_type>
> <machine_type> sun4m </machine_type>
> <emulator> /usr/bin/qemu-system-sparc </emulator>
> </guest_architecture>
>
> <guest_architecture>
> <model> i686 </model>
> <machine> pc </machine>
> <fullvirt/>
> <domain_type> qemu </domain_type>
> <machine_type> pc </machine_type>
> <emulator> /usr/bin/qemu </emulator>
> </guest_architecture>
>
> <guest_architecture>
> <model> x86_64 </model>
> <machine> pc </machine>
> <fullvirt/>
> <domain_type> kqemu </domain_type>
> <machine_type> pc </machine_type>
> <emulator> /usr/bin/qemu </emulator>
> <qemu_uses_kqemu />
> </guest_architecture>
>
> <guest_architecture>
> <model> x86_64 </model>
> <machine> pc </machine>
> <fullvirt/>
> <domain_type> kvm </domain_type>
> <machine_type> pc </machine_type>
> <emulator> /usr/bin/qemu-kvm </emulator>
> <qemu_uses_kvm />
> </guest_architecture>
> </guest_architecture>
> </capabilities>
<capabilities>
<host>
<cpu>
<arch>x86_64</arch>
<features>
<vmx/>
<pae/>
</features>
</cpu>
</host>
<guest>
<os_type>hvm</os_type>
<arch name="x86_64">
<wordsize>64</wordsize>
<machine >pc</machine>
<machine>isapc</machine>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<domain type="qemu"/>
<domain type="kqemu"/>
<domain type="kvm">
<emulator>/usr/bin/qemu-kvm</emulator>
</domain>
</arch>
<features>
<pae/>
<nonpae/>
</features>
</guest>
<guest>
<os_type>hvm</os_type>
<arch name="i686">
<wordsize>32</wordsize>
<machine >pc</machine>
<machine>isapc</machine>
<emulator>/usr/bin/qemu</emulator>
<domain type="qemu"/>
</arch>
<features>
<nonpae/>
</features>
</guest>
<guest>
<os_type>hvm</os_type>
<arch name="sparc">
<wordsize>32</wordsize>
<machine >sun4m</machine>
<emulator>/usr/bin/qemu-system-sparc</emulator>
<domain type="qemu"/>
</arch>
<features>
<pae/>
<nonpae/>
</features>
</guest>
<guest>
<os_type>hvm</os_type>
<arch name="ppc">
<wordsize>32</wordsize>
<machine>prep</machine>
<machine>g3bw</machine>
<machine>mac99</machine>
<emulator>/usr/bin/qemu-system-ppc</emulator>
<domain type="qemu"/>
</arch>
<features>
<pae/>
<nonpae/>
</features>
</guest>
</capabilities>
Notice in this example, that the <domain type='kvm'> block inside the
the <arch> can override / specialize arch data. eg we provide an
alternate <emulator> block for KVM.
Als notice mutliple <machine> elements - the first is taken to be the
implicit default machine. Alternatively we could add an explicit
default="true" attribute.
So in summary, with Xen this results in N * <guest> blocks where N equals
the number of entries in /sys/hypervisor/properties/capabilities, and
with QEMU N == number of QEMU architectures (ie 7).
Regards,
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
More information about the libvir-list
mailing list