# Xen hypervisor driver

The libvirt Xen driver provides the ability to manage virtual machines on any Xen release from 3.0.1 onwards.

## Deployment pre-requisites

The libvirt Xen driver uses a combination of channels to manage Xen virtual machines.

- XenD: Access to the Xen daemon is a mandatory requirement for the libvirt Xen driver. It requires that the UNIX socket interface be enabled in the `/etc/xen/xend-config.sxp` configuration file. Specifically the config settings `(xend-unix-server yes)`. This path is usually restricted to only allow the `root` user access. As an alternative, the HTTP interface can be used, however, this has significant security implications.
- XenStoreD: Access to the Xenstore daemon enables more efficient codepaths for looking up domain information which lowers the CPU overhead of management.
- Hypercalls: The ability to make direct hypercalls allows the most efficient codepaths in the driver to be used for monitoring domain status.
- XM config: When using Xen releases prior to 3.0.4, there is no inactive domain management in XenD. For such releases, libvirt will automatically process XM configuration files kept in the `/etc/xen` directory. It is important not to place any other non-config files in this directory.

## Connections to Xen driver

The libvirt Xen driver is a single-instance privileged driver, with a driver name of 'xen'. Some example conection URIs for the libvirt driver are:

        xen:///                        (local access, direct)
        xen+unix:///                   (local access, via daemon)
        xen://example.com/             (remote access, TLS/x509)
        xen+tcp://example.com/         (remote access, SASl/Kerberos)
        xen+ssh://root@example.com/    (remote access, SSH tunnelled)

## Example domain XML config

Below are some example XML configurations for Xen guest domains. For full details of the available options, consult the domain XML format guide.

### Paravirtualized guest bootloader

Using a bootloader allows a paravirtualized guest to be booted using a kernel stored inside its virtual disk image

    <domain type='xen' >
      <name>fc8</name>
      <bootloader>/usr/bin/pygrub</bootloader>
      <os>
        <type>linux</type>
      </os>
      <memory>131072</memory>
      <vcpu>1</vcpu>
      <devices>
        <disk type='file'>
          <source file='/var/lib/xen/images/fc4.img'/>
          <target dev='sda1'/>
        </disk>
        <interface type='bridge'>
          <source bridge='xenbr0'/>
          <mac address='aa:00:00:00:00:11'/>
          <script path='/etc/xen/scripts/vif-bridge'/>
        </interface>
        <console tty='/dev/pts/5'/>
      </devices>
    </domain>

### Paravirtualized guest direct kernel boot

For installation of paravirtualized guests it is typical to boot the domain using a kernel and initrd stored in the host OS

    <domain type='xen' >
      <name>fc8</name>
      <os>
        <type>linux</type>
        <kernel>/var/lib/xen/install/vmlinuz-fedora8-x86_64</kernel>
        <initrd>/var/lib/xen/install/initrd-vmlinuz-fedora8-x86_64</initrd>
        <cmdline> kickstart=http://example.com/myguest.ks </cmdline>
      </os>
      <memory>131072</memory>
      <vcpu>1</vcpu>
      <devices>
        <disk type='file'>
          <source file='/var/lib/xen/images/fc4.img'/>
          <target dev='sda1'/>
        </disk>
        <interface type='bridge'>
          <source bridge='xenbr0'/>
          <mac address='aa:00:00:00:00:11'/>
          <script path='/etc/xen/scripts/vif-bridge'/>
        </interface>
        <graphics type='vnc' port='-1'/>
        <console tty='/dev/pts/5'/>
      </devices>
    </domain>

### Fullyvirtualized guest BIOS boot

Fullyvirtualized guests use the emulated BIOS to boot off the primary harddisk, CDROM or Network PXE ROM.

    <domain type='xen' id='3'>
      <name>fv0</name>
      <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid>
      <os>
        <type>hvm</type>
        <loader>/usr/lib/xen/boot/hvmloader</loader>
        <boot dev='hd'/>
      </os>
      <memory>524288</memory>
      <vcpu>1</vcpu>
      <on_poweroff>destroy</on_poweroff>
      <on_reboot>restart</on_reboot>
      <on_crash>restart</on_crash>
      <features>
         <pae/>
         <acpi/>
         <apic/>
      </features>
      <clock sync="localtime"/>
      <devices>
        <emulator>/usr/lib/xen/bin/qemu-dm</emulator>
        <interface type='bridge'>
          <source bridge='xenbr0'/>
          <mac address='00:16:3e:5d:c7:9e'/>
          <script path='vif-bridge'/>
        </interface>
        <disk type='file'>
          <source file='/var/lib/xen/images/fv0'/>
          <target dev='hda'/>
        </disk>
        <disk type='file' device='cdrom'>
          <source file='/var/lib/xen/images/fc5-x86_64-boot.iso'/>
          <target dev='hdc'/>
          <readonly/>
        </disk>
        <disk type='file' device='floppy'>
          <source file='/root/fd.img'/>
          <target dev='fda'/>
        </disk>
        <graphics type='vnc' port='5904'/>
      </devices>
    </domain>

### Fullyvirtualized guest direct kernel boot

With Xen 3.2.0 or later it is possible to bypass the BIOS and directly boot a Linux kernel and initrd as a fullyvirtualized domain. This allows for complete automation of OS installation, for example using the Anaconda kickstart support.

    <domain type='xen' id='3'>
      <name>fv0</name>
      <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid>
      <os>
        <type>hvm</type>
        <loader>/usr/lib/xen/boot/hvmloader</loader>
        <kernel>/var/lib/xen/install/vmlinuz-fedora8-x86_64</kernel>
        <initrd>/var/lib/xen/install/initrd-vmlinuz-fedora8-x86_64</initrd>
        <cmdline> kickstart=http://example.com/myguest.ks </cmdline>
      </os>
      <memory>524288</memory>
      <vcpu>1</vcpu>
      <on_poweroff>destroy</on_poweroff>
      <on_reboot>restart</on_reboot>
      <on_crash>restart</on_crash>
      <features>
         <pae/>
         <acpi/>
         <apic/>
      </features>
      <clock sync="localtime"/>
      <devices>
        <emulator>/usr/lib/xen/bin/qemu-dm</emulator>
        <interface type='bridge'>
          <source bridge='xenbr0'/>
          <mac address='00:16:3e:5d:c7:9e'/>
          <script path='vif-bridge'/>
        </interface>
        <disk type='file'>
          <source file='/var/lib/xen/images/fv0'/>
          <target dev='hda'/>
        </disk>
        <disk type='file' device='cdrom'>
          <source file='/var/lib/xen/images/fc5-x86_64-boot.iso'/>
          <target dev='hdc'/>
          <readonly/>
        </disk>
        <disk type='file' device='floppy'>
          <source file='/root/fd.img'/>
          <target dev='fda'/>
        </disk>
        <graphics type='vnc' port='5904'/>
      </devices>
    </domain>