kfraser@localhost.localdomain b07ced9c1f [LIBXC] Add an error reporting API to the libxc library.
- An 'xc_error' struct is used to pass around error
   details. Currently contains two members 'code' an enumeration of
   error types, and 'message' a free text description of the specific
   problem.

 - The xc_get_last_error() method returns a const pointer to the
   internal instance of this struct manged by libxc. By returning a
   const pointer we can add extra members to the end of the struct at
   any time without worrying about ABI of callers. This will let us
   provide more fine-grained info if needed in the future.

 - The xc_error instance is statically defined inside libxc and marked
   __thread. This ensures that errors are recorded per-thread, and
   that when dealing with errors we never need to call malloc - all
   storage needed is statically allocated.

 - The xc_clear_last_error() method resets any currently recorded
   error details

 - The xc_error_code_to_desc() method converts the integer error code
   into a generic user facing messsage. eg "Invalid kernel". Together
   with the 'message' field from xc_error, this provides the user
   visible feedback. eg "Invalid kernel: Non PAE-kernel on PAE host."

 - A callback can be registered with xc_set_error_handler to receive
   notification whenever an error is recorded, rather than querying
   for error details after the fact with xc_get_last_error

 - If built with -DDEBUG set, a default error handler will be
   registered which calls fprintf(stderr), thus maintaining current
   behaviour of logging errors to stderr during developer builds.

 - The python binding for libxc is updated to use xc_get_last_error
   to pull out error details whenever appropriate, instead of
   returning info based on 'errno'

 - The xc_set_error method is private to libxc internals, and is used
   for setting error details

 - The ERROR and PERROR macros have been updated to call xc_set_error
   automatically specifying XC_INTERNAL_ERROR as the error code. This
   gives a generic error report for all current failure points

 - Some uses of the ERROR macro have been replaced with explicit
   calls to xc_set_error to enable finer grained error reporting. In
   particular the code dealing with invalid kernel types uses this
   to report about PAE/architecture/wordsize mismatches

The patch has been tested by calling xm create against a varietry of
config files defining invalid kernels of various kinds. It has also
been tested with libvirt talking to xend. In both cases the error
messages were propagated all the way back up the stack.

There is only one place where I need to do further work. The suspend
& restore APIs in Xend invoke external helper programs rather than
calling libxc directly. This means that error details are essentially
lost. Since there is already code in XenD which scans STDERR from
these programs I will investigate adapting this to extract actual
error messages from these helpers.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2006-12-07 11:36:26 +00:00
2006-12-01 14:30:42 +00:00

################################
 __  __            _____  ___
 \ \/ /___ _ __   |___ / / _ \
  \  // _ \ '_ \    |_ \| | | |
  /  \  __/ | | |  ___) | |_| |
 /_/\_\___|_| |_| |____(_)___/

################################

http://www.xensource.com/xen/about.html

What is Xen?
============

Xen is a Virtual Machine Monitor (VMM) originally developed by the
Systems Research Group of the University of Cambridge Computer
Laboratory, as part of the UK-EPSRC funded XenoServers project.  Xen
is freely-distributable Open Source software, released under the GNU
GPL. Since its initial public release, Xen has grown a large
development community, spearheaded by XenSource Inc, a company created
by the original Xen development team to build enterprise products
around Xen.

The 3.0 release offers excellent performance, hardware support and
enterprise-grade features such as x86_32-PAE, x86_64, SMP guests and
live relocation of VMs. This install tree contains source for a Linux
2.6 guest; ports to Linux 2.4, NetBSD, FreeBSD and Solaris will follow
later (and are already available for previous Xen releases).

This file contains some quick-start instructions to install Xen on
your system. For full documentation, see the Xen User Manual. If this
is a pre-built release then you can find the manual at:
 dist/install/usr/share/doc/xen/pdf/user.pdf
If you have a source release, then 'make -C docs' will build the
manual at docs/pdf/user.pdf.

Quick-Start Guide - Pre-Built Binary Release
============================================

[NB. Unless noted otherwise, all the following steps should be
performed with root privileges.]

1. Install the binary distribution onto your filesystem:

    # sh ./install.sh

   Among other things, this will install Xen and Xen-ready Linux
   kernel files in /boot, kernel modules and Python packages in /lib,
   and various control tools in standard 'bin' directories.

2. Configure your bootloader to boot Xen and an initial Linux virtual
   machine. Note that Xen currently only works with GRUB and pxelinux
   derived boot loaders: less common alternatives such as LILO are
   *not* supported. You can most likely find your GRUB menu file at
   /boot/grub/menu.lst: edit this file to include an entry like the
   following:

    title Xen 3.0 / XenLinux 2.6
       kernel /boot/xen-3.0.gz console=vga
       module /boot/vmlinuz-2.6-xen root=<root-dev> ro console=tty0
       module /boot/initrd-2.6-xen.img

   NB: Not all kernel configs need an initial ram disk (initrd), but
   if you do specify one you'll need to use the 'module' grub directive
   rather than 'initrd'.

   The linux command line takes all the usual options, such as
   root=<root-dev> to specify your usual root partition (e.g.,
   /dev/hda1).

   The Xen command line takes a number of optional arguments described
   in the manual. The most common is 'dom0_mem=xxxM' which sets the
   amount of memory to allocate for use by your initial virtual
   machine (known as domain 0). Note that Xen itself reserves about
   32MB memory for internal use, which is not available for allocation
   to virtual machines.

3. Reboot your system and select the "Xen 3.0 / XenLinux 2.6" menu
   option. After booting Xen, Linux will start and your initialisation
   scripts should execute in the usual way.

Quick-Start Guide - Source Release
==================================

First, there are a number of prerequisites for building a Xen source
release. Make sure you have all the following installed, either by
visiting the project webpage or installing a pre-built package
provided by your Linux distributor:
    * GCC (preferably v3.2.x or v3.3.x; older versions are unsupported)
    * GNU Make
    * GNU Binutils
    * Development install of zlib (e.g., zlib-dev)
    * Development install of Python v2.3 or later (e.g., python-dev)
    * Development install of curses (e.g., libncurses-dev)
    * bridge-utils package (/sbin/brctl)
    * iproute package (/sbin/ip)
    * hotplug or udev

[NB. Unless noted otherwise, all the following steps should be
performed with root privileges.]

1. Download and untar the source tarball file. This will be a
   file named xen-unstable-src.tgz, or xen-$version-src.tgz.
   You can also pull the current version from the SCMS
   that is being used (Bitkeeper, scheduled to change shortly).

    # tar xzf xen-unstable-src.tgz

   Assuming you are using the unstable tree, this will
   untar into xen-unstable. The rest of the instructions
   use the unstable tree as an example, substitute the
   version for unstable.

2. cd to xen-unstable (or whatever you sensibly rename it to).
   The Linux, netbsd and freebsd kernel source trees are in
   the $os-$version-xen-sparse directories.

On Linux:

3. For the very first build, or if you want to destroy existing
   .configs and build trees, perform the following steps:

    # make world
    # make install

   This will create and install onto the local machine. It will build
   the xen binary (xen.gz), and a linux kernel and modules that can be
   used in both dom0 and an unprivileged guest kernel (vmlinuz-2.6.x-xen),
   the tools and the documentation.

   You can override the destination for make install by setting DESTDIR
   to some value.

   The make command line defaults to building the kernel vmlinuz-2.6.x-xen.
   You can override this default by specifying KERNELS=kernelname. For
   example, you can make two kernels - linux-2.6-xen0
   and linux-2.6-xenU - which are smaller builds containing only selected
   modules, intended primarily for developers that don't like to wait
   for a full -xen kernel to build. The -xenU kernel is particularly small,
   as it does not contain any physical device drivers, and hence is
   only useful for guest domains.

   To make these two kernels, simply specify

   KERNELS="linux-2.6-xen0 linux-2.6-xenU"

   in the make command line.

   If you want to build an x86_32 PAE capable xen and kernel to work
   on machines with >= 4GB of memory, use XEN_TARGET_X86_PAE=y on the
   make command line.

4. To rebuild an existing tree without modifying the config:
    # make dist

   This will build and install xen, kernels, tools, and
   docs into the local dist/ directory.

   You can override the destination for make install by setting DISTDIR
   to some value.

   make install and make dist differ in that make install does the
   right things for your local machine (installing the appropriate
   version of hotplug or udev scripts, for example), but make dist
   includes all versions of those scripts, so that you can copy the dist
   directory to another machine and install from that distribution.

5. To rebuild a kernel with a modified config:

    # make linux-2.6-xen-config CONFIGMODE=menuconfig     (or xconfig)
    # make linux-2.6-xen-build
    # make linux-2.6-xen-install

   Depending on your config, you may need to use 'mkinitrd' to create
   an initial ram disk, just like a native system e.g.
    # depmod 2.6.16-xen
    # mkinitrd -v -f --with=aacraid --with=sd_mod --with=scsi_mod initrd-2.6.16-xen.img 2.6.16-xen
Languages
C 91.8%
Python 1.7%
Assembly 1.7%
Makefile 1.1%
Shell 1%
Other 2.4%