XenStore Paths

This document attempts to defines all the paths which are in common use by either guests, front-/back-end drivers, toolstacks etc.

The XenStore wire protocol itself is described in xenstore.txt.


This document is intended to be partially machine readable, such that test system etc can use it to validate whether the xenstore paths used by a test are allowable etc.

Therefore the following notation conventions apply:

A xenstore path is generically defined as:


    PATH/* [TAGS]

The first syntax defines a simple path with a single value. The second syntax defines an aggregated set of paths which are usually described externally to this document. The text will give a pointer to the appropriate external documentation.

PATH can contain simple regex constructs following the Perl compatible regexp syntax described in pcre(3) or perlre(1). In addition the following additional wild card names are defined and are evaluated before regexp expansion:

VALUES are strings and can take the following forms:

Additional TAGS may follow as a comma separated set of the following tags enclosed in square brackets.

Owning domain means the domain whose home path this tag is found under.

Lack of either a HVM or PV tag indicates that the path is valid for either type of domain (including PVonHVM and similar mixed domain types).

Domain Home Path

Every domain has a home path within the xenstore hierarchy. This is the path where the majority of the domain-visible information about each domain is stored.

This path is:


All non-absolute paths are relative to this path.

Although this path could be considered a "Home Directory" for the domain it would not usually be writable by the domain. The tools will create writable subdirectories as necessary.

Per Domain Paths

General Paths

~/vm = PATH []

A pointer back to the domain's /vm/$UUID path (described below).

~/name = STRING []

The guests name.

~/domid = INTEGER []

The domain's own ID.

~/image/device-model-pid = INTEGER [INTERNAL]

The process ID of the device model associated with this domain, if it has one.

~/cpu/[0-9]+/availability = ("online"|"offline") [PV]

One node for each virtual CPU up to the guest's configured maximum. Valid values are "online" and "offline". The guest is expected to react to changes in this path by bringing the appropriate VCPU on or offline using the VCPUOP interface described in xen/include/public/vcpu.h

This protocol is not currently well documented.

~/memory/static-max = MEMKB []

Specifies a static maximum amount memory which this domain should expect to be given. In the absence of in-guest memory hotplug support this set on domain boot and is usually the maximum amount of RAM which a guest can make use of. See docs/misc/libxl_memory.txt for a description of how memory is accounted for in toolstacks using the libxl library.

~/memory/target = MEMKB []

The current balloon target for the domain. The balloon driver within the guest is expected to make every effort to every effort use no more than this amount of RAM.

~/memory/videoram = MEMKB [HVM,INTERNAL]

The size of the video RAM this domain is configured with.

~/device/suspend/event-channel = ""|EVTCHN [w]

The domain's suspend event channel. The toolstack will create this path with an empty value which the guest may choose to overwrite.

If the guest overwrites this, it will be with the number of an unbound event channel port it has acquired. The toolstack is expected to use an interdomain bind, and then, when it wishes to ask the guest to suspend, to signal the event channel.

The guest does not need to explicitly acknowledge the request; indeed, there is no explicit signalling by the guest in the reverse direction. The guest, when it is ready, simply shuts down (SCHEDOP_shutdown) with reason code SHUTDOWN_suspend. The toolstack is expected to use XEN_DOMCTL_subscribe to be alerted to guest state changes, and XEN_SYSCTL_getdomaininfolist to verify that the domain has suspended.

Note that the use of this event channel suspend protocol is optional for both sides. By writing a non-empty string to the node, the guest is advertising its support. However, the toolstack is at liberty to use the xenstore-based protocol instead (see ~/control/shutdown, below) even if the guest has advertised support for the event channel protocol.

~/hvmloader/allow-memory-relocate = ("1"|"0") [HVM,INTERNAL]

If the default low MMIO hole (below 4GiB) is not big enough for all the devices, this indicates if hvmloader should relocate guest memory into the high memory region (above 4GiB). If "1", hvmloader will relocate memory as needed, until 2GiB is reached; if "0", hvmloader will not relocate guest memory.

~/hvmloader/bios = ("rombios"|"seabios"|"OVMF") [HVM,INTERNAL]

The BIOS used by this domain.

~/platform/* [HVM,INTERNAL]

Various platform properties.

~/platform/generation-id = INTEGER ":" INTEGER [HVM,INTERNAL]

The lower and upper 64-bit words of the 128-bit VM Generation ID.

This key is used by hvmloader to create the ACPI VM Generation ID device. It initialises a 16 octet region of guest memory with this value. The guest physical address of this region is saved in the HVMPARAMVMGENERATIONID_ADDR HVM parameter.

If this key is not present, is empty, or is all-zeros ("0:0") then the ACPI device is not created.

When restoring a guest, the toolstack may (in certain circumstances) need generate a new random generation ID and write it to guest memory at the guest physical address in HVMPARAMVMGENERATIONID_ADDR.

See Microsoft's "Virtual Machine Generation ID" specification for the circumstances where the generation ID needs to be changed.

Frontend device paths

Paravirtual device frontends are generally specified by their own directory within the XenStore hierarchy. Usually this is under ~/device/$TYPE/$DEVID although there are exceptions, e.g. ~/console for the first PV console.

~/device/vbd/$DEVID/* []

A virtual block device frontend. Described by xen/include/public/io/blkif.h

~/device/vfb/$DEVID/* []

A virtual framebuffer frontend. Described by xen/include/public/io/fbif.h

~/device/vkbd/$DEVID/* []

A virtual keyboard device frontend. Described by xen/include/public/io/kbdif.h

~/device/vif/$DEVID/* []

A virtual network device frontend. Described by xen/include/public/io/netif.h

~/console/* []

The primary PV console device. Described in console.txt

~/device/console/$DEVID/* []

A secondary PV console device. Described in console.txt

~/serial/$DEVID/* [HVM]

An emulated serial device. Described in console.txt

~/store/port = EVTCHN [DEPRECATED]

The event channel used by the domain's connection to XenStore.

This path is deprecated since the same information is provided via the start_info for PV guests and as an HVM param for HVM guests. There is an obvious chicken and egg problem with extracting this value from xenstore in order to setup the xenstore communication ring.

~/store/ring-ref = GNTREF [DEPRECATED]

The grant reference of the domain's XenStore ring.

As with ~/store/port this path is deprecated.

Backend Device Paths

Paravirtual device backends are generally specified by their own directory within the XenStore hierarchy. Usually this is under ~/backend/$TYPE/$DOMID/$DEVID.

~/backend/vbd/$DOMID/$DEVID/* []

A virtual block device backend. Described by xen/include/public/io/blkif.h

Uses the in-kernel blkback driver.

~/backend/qdisk/$DOMID/$DEVID/* []

A virtual block device backend. Described by xen/include/public/io/blkif.h

Uses the qemu based disk backend.

~/backend/tap/$DOMID/$DEVID/* []

A virtual block device backend. Described by xen/include/public/io/blkif.h

Uses the in-kernel blktap (v1) disk backend (deprecated).

~/backend/vfb/$DOMID/$DEVID/* []

A virtual framebuffer backend. Described by xen/include/public/io/fbif.h

~/backend/vkbd/$DOMID/$DEVID/* []

A virtual keyboard device backend. Described by xen/include/public/io/kbdif.h

~/backend/vif/$DOMID/$DEVID/* []

A virtual network device backend. Described by xen/include/public/io/netif.h

~/backend/console/$DOMID/$DEVID/* []

A PV console backend. Described in console.txt

~/device-model/$DOMID/* [INTERNAL]

Information relating to device models running in the domain. $DOMID is the target domain of the device model.

~/libxl/disable_udev = ("1"|"0") []

Indicates whether device hotplug scripts in this domain should be run by udev ("0") or will be run by the toolstack directly ("1").

Platform Feature and Control Paths

~/control/shutdown = (""|COMMAND) [w]

This is the PV shutdown control node. A toolstack can write various commands here to cause various guest shutdown, reboot or suspend activities. The guest acknowledges a request by writing the empty string back to the command node.

The precise protocol is not yet documented.

~/control/platform-feature-multiprocessor-suspend = (0|1) []

Indicates to the guest that this platform supports the multiprocessor suspend feature.

~/control/platform-feature-xs_reset_watches = (0|1) []

Indicates to the guest that this platform supports the XSRESETWATCHES xenstore message. See xen/include/public/io/xs_wire.h for the XenStore wire protocol definition.

Domain Controlled Paths

~/data/* [w]

A domain writable path. Available for arbitrary domain use.

Paths private to the toolstack

~/device-model/$DOMID/state [w]

Contains the status of the device models running on the domain.

~/libxl/$DOMID/qdisk-backend-pid [w]

Contains the PIDs of the device models running on the domain.

Virtual Machine Paths

The /vm/$UUID namespace is used by toolstacks to store various information relating to the domain which is not intended to be guest visible (hence they are all tagged [n,INTERNAL]).

Several of the keys here are not well defined and/or not well located and are liable to be replaced with more fully defined paths in the future.

/vm/$UUID/uuid = UUID [n,INTERNAL]

Value is the same UUID as the path.

/vm/$UUID/name = STRING [n,INTERNAL]

The domain's name.

/vm/$UUID/image/* [n,INTERNAL]

Various information relating to the domain builder used for this guest.

/vm/$UUID/start_time = INTEGER "." INTEGER [n,INTERNAL]

The time which the guest was started in SECONDS.MICROSECONDS format

/vm/$UUID/rtc/timeoffset = ""|INTEGER [n,HVM,INTERNAL]

The guest's virtual time offset from UTC in seconds.

Platform-Level paths

libxl Specific Paths


Created by libxl for every frontend/backend pair created for $DOMID. Used by libxl for enumeration and management of the device.


Path in xenstore to the frontend, normally /local/domain/$DOMID/device/$KIND/$DEVID


Path in xenstore to the backend, normally /local/domain/$BACKEND_DOMID/backend/$KIND/$DOMID/$DEVID


Trustworthy copy of /local/domain/$DOMID/backend/$KIND/$DEVID/$NODE.

/libxl/$DOMID/dm-version ("qemu_xen"|"qemu_xen_traditional") = [n,INTERNAL]

The device model version for a domain.

/libxl/$DOMID/remus/netbuf/$DEVID/ifb = STRING [n,INTERNAL]

ifb device used by Remus to buffer network output from the associated vif.