docs: update Xen-on-KVM documentation

Add notes about console and network support, and how to launch PV guests.
Clean up the disk configuration examples now that that's simpler, and
remove the comment about IDE unplug on q35/AHCI now that it's fixed.

Update the -initrd option documentation to explain how to quote commas
in module command lines, and reference it when documenting PV guests.

Also update stale avocado test filename in MAINTAINERS.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Paul Durrant <paul@xen.org>
This commit is contained in:
David Woodhouse 2023-10-19 15:30:23 +01:00
parent a73049953b
commit cc9d10b9e8
3 changed files with 90 additions and 31 deletions

View file

@ -490,7 +490,7 @@ S: Supported
F: include/sysemu/kvm_xen.h
F: target/i386/kvm/xen*
F: hw/i386/kvm/xen*
F: tests/avocado/xen_guest.py
F: tests/avocado/kvm_xen_guest.py
Guest CPU Cores (other accelerators)
------------------------------------

View file

@ -15,46 +15,24 @@ Setup
-----
Xen mode is enabled by setting the ``xen-version`` property of the KVM
accelerator, for example for Xen 4.10:
accelerator, for example for Xen 4.17:
.. parsed-literal::
|qemu_system| --accel kvm,xen-version=0x4000a,kernel-irqchip=split
|qemu_system| --accel kvm,xen-version=0x40011,kernel-irqchip=split
Additionally, virtual APIC support can be advertised to the guest through the
``xen-vapic`` CPU flag:
.. parsed-literal::
|qemu_system| --accel kvm,xen-version=0x4000a,kernel-irqchip=split --cpu host,+xen_vapic
|qemu_system| --accel kvm,xen-version=0x40011,kernel-irqchip=split --cpu host,+xen-vapic
When Xen support is enabled, QEMU changes hypervisor identification (CPUID
0x40000000..0x4000000A) to Xen. The KVM identification and features are not
advertised to a Xen guest. If Hyper-V is also enabled, the Xen identification
moves to leaves 0x40000100..0x4000010A.
The Xen platform device is enabled automatically for a Xen guest. This allows
a guest to unplug all emulated devices, in order to use Xen PV block and network
drivers instead. Under Xen, the boot disk is typically available both via IDE
emulation, and as a PV block device. Guest bootloaders typically use IDE to load
the guest kernel, which then unplugs the IDE and continues with the Xen PV block
device.
This configuration can be achieved as follows
.. parsed-literal::
|qemu_system| -M pc --accel kvm,xen-version=0x4000a,kernel-irqchip=split \\
-drive file=${GUEST_IMAGE},if=none,id=disk,file.locking=off -device xen-disk,drive=disk,vdev=xvda \\
-drive file=${GUEST_IMAGE},index=2,media=disk,file.locking=off,if=ide
It is necessary to use the pc machine type, as the q35 machine uses AHCI instead
of legacy IDE, and AHCI disks are not unplugged through the Xen PV unplug
mechanism.
VirtIO devices can also be used; Linux guests may need to be dissuaded from
umplugging them by adding 'xen_emul_unplug=never' on their command line.
Properties
----------
@ -63,7 +41,10 @@ The following properties exist on the KVM accelerator object:
``xen-version``
This property contains the Xen version in ``XENVER_version`` form, with the
major version in the top 16 bits and the minor version in the low 16 bits.
Setting this property enables the Xen guest support.
Setting this property enables the Xen guest support. If Xen version 4.5 or
greater is specified, the HVM leaf in Xen CPUID is populated. Xen version
4.6 enables the vCPU ID in CPUID, and version 4.17 advertises vCPU upcall
vector support to the guest.
``xen-evtchn-max-pirq``
Xen PIRQs represent an emulated physical interrupt, either GSI or MSI, which
@ -83,8 +64,78 @@ The following properties exist on the KVM accelerator object:
through simultaneous grants. For guests with large numbers of PV devices and
high throughput, it may be desirable to increase this value.
OS requirements
---------------
Xen paravirtual devices
-----------------------
The Xen PCI platform device is enabled automatically for a Xen guest. This
allows a guest to unplug all emulated devices, in order to use paravirtual
block and network drivers instead.
Those paravirtual Xen block, network (and console) devices can be created
through the command line, and/or hot-plugged.
To provide a Xen console device, define a character device and then a device
of type ``xen-console`` to connect to it. For the Xen console equivalent of
the handy ``-serial mon:stdio`` option, for example:
.. parsed-literal::
-chardev stdio,mux=on,id=char0,signal=off -mon char0 \\
-device xen-console,chardev=char0
The Xen network device is ``xen-net-device``, which becomes the default NIC
model for emulated Xen guests, meaning that just the default NIC provided
by QEMU should automatically work and present a Xen network device to the
guest.
Disks can be configured with '``-drive file=${GUEST_IMAGE},if=xen``' and will
appear to the guest as ``xvda`` onwards.
Under Xen, the boot disk is typically available both via IDE emulation, and
as a PV block device. Guest bootloaders typically use IDE to load the guest
kernel, which then unplugs the IDE and continues with the Xen PV block device.
This configuration can be achieved as follows:
.. parsed-literal::
|qemu_system| --accel kvm,xen-version=0x40011,kernel-irqchip=split \\
-drive file=${GUEST_IMAGE},if=xen \\
-drive file=${GUEST_IMAGE},file.locking=off,if=ide
VirtIO devices can also be used; Linux guests may need to be dissuaded from
umplugging them by adding '``xen_emul_unplug=never``' on their command line.
Booting Xen PV guests
---------------------
Booting PV guest kernels is possible by using the Xen PV shim (a version of Xen
itself, designed to run inside a Xen HVM guest and provide memory management
services for one guest alone).
The Xen binary is provided as the ``-kernel`` and the guest kernel itself (or
PV Grub image) as the ``-initrd`` image, which actually just means the first
multiboot "module". For example:
.. parsed-literal::
|qemu_system| --accel kvm,xen-version=0x40011,kernel-irqchip=split \\
-chardev stdio,id=char0 -device xen-console,chardev=char0 \\
-display none -m 1G -kernel xen -initrd bzImage \\
-append "pv-shim console=xen,pv -- console=hvc0 root=/dev/xvda1" \\
-drive file=${GUEST_IMAGE},if=xen
The Xen image must be built with the ``CONFIG_XEN_GUEST`` and ``CONFIG_PV_SHIM``
options, and as of Xen 4.17, Xen's PV shim mode does not support using a serial
port; it must have a Xen console or it will panic.
The example above provides the guest kernel command line after a separator
(" ``--`` ") on the Xen command line, and does not provide the guest kernel
with an actual initramfs, which would need to listed as a second multiboot
module. For more complicated alternatives, see the command line
documentation for the ``-initrd`` option.
Host OS requirements
--------------------
The minimal Xen support in the KVM accelerator requires the host to be running
Linux v5.12 or newer. Later versions add optimisations: Linux v5.17 added

View file

@ -3986,14 +3986,22 @@ ERST
DEF("initrd", HAS_ARG, QEMU_OPTION_initrd, \
"-initrd file use 'file' as initial ram disk\n", QEMU_ARCH_ALL)
SRST
``-initrd file``
Use file as initial ram disk.
``-initrd "file1 arg=foo,file2"``
This syntax is only available with multiboot.
Use file1 and file2 as modules and pass arg=foo as parameter to the
first module.
Use file1 and file2 as modules and pass ``arg=foo`` as parameter to the
first module. Commas can be provided in module parameters by doubling
them on the command line to escape them:
``-initrd "bzImage earlyprintk=xen,,keep root=/dev/xvda1,initrd.img"``
Multiboot only. Use bzImage as the first module with
"``earlyprintk=xen,keep root=/dev/xvda1``" as its command line,
and initrd.img as the second module.
ERST
DEF("dtb", HAS_ARG, QEMU_OPTION_dtb, \