echo "SSH_INITD_SCRIPT = '$(SSH_INITD_SCRIPT)'"; \
echo "EXPORT_DIR = '$(EXPORT_DIR)'"; \
echo "OS_SEARCH_PATH = [$(OS_SEARCH_PATH)]"; \
+ echo "XEN_BOOTLOADER = '$(XEN_BOOTLOADER)'"; \
echo "XEN_KERNEL = '$(XEN_KERNEL)'"; \
echo "XEN_INITRD = '$(XEN_INITRD)'"; \
echo "FILE_STORAGE_DIR = '$(FILE_STORAGE_DIR)'"; \
echo 's#@BINDIR@#$(bindir)#g'; \
echo 's#@SBINDIR@#$(sbindir)#g'; \
echo 's#@GANETI_VERSION@#$(PACKAGE_VERSION)#g'; \
+ echo 's#@CUSTOM_XEN_BOOTLOADER@#$(XEN_BOOTLOADER)#g'; \
echo 's#@CUSTOM_XEN_KERNEL@#$(XEN_KERNEL)#g'; \
echo 's#@CUSTOM_XEN_INITRD@#$(XEN_INITRD)#g'; \
echo 's#@RPL_FILE_STORAGE_DIR@#$(FILE_STORAGE_DIR)#g'; \
[iallocator_search_path="'$libdir/$PACKAGE_NAME/iallocators'"])
AC_SUBST(IALLOCATOR_SEARCH_PATH, $iallocator_search_path)
+# --with-xen-bootloader=...
+AC_ARG_WITH([xen-bootloader],
+ [AS_HELP_STRING([--with-xen-bootloader=PATH],
+ [bootloader for Xen hypervisor (default is empty)]
+ )],
+ [xen_bootloader="$withval"],
+ [xen_bootloader=])
+AC_SUBST(XEN_BOOTLOADER, $xen_bootloader)
+
# --with-xen-kernel=...
AC_ARG_WITH([xen-kernel],
[AS_HELP_STRING([--with-xen-kernel=PATH],
EXPORT_CONF_FILE = "config.ini"
+XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
XEN_KERNEL = _autoconf.XEN_KERNEL
XEN_INITRD = _autoconf.XEN_INITRD
HV_VNC_X509_VERIFY = "vnc_x509_verify"
HV_ACPI = "acpi"
HV_PAE = "pae"
+HV_USE_BOOTLOADER = "use_bootloader"
+HV_BOOTLOADER_ARGS = "bootloader_args"
+HV_BOOTLOADER_PATH = "bootloader_path"
HV_KERNEL_ARGS = "kernel_args"
HV_KERNEL_PATH = "kernel_path"
HV_INITRD_PATH = "initrd_path"
HV_VNC_X509_VERIFY: VTYPE_BOOL,
HV_ACPI: VTYPE_BOOL,
HV_PAE: VTYPE_BOOL,
+ HV_USE_BOOTLOADER: VTYPE_BOOL,
+ HV_BOOTLOADER_PATH: VTYPE_STRING,
+ HV_BOOTLOADER_ARGS: VTYPE_STRING,
HV_KERNEL_PATH: VTYPE_STRING,
HV_KERNEL_ARGS: VTYPE_STRING,
HV_INITRD_PATH: VTYPE_STRING,
HVC_DEFAULTS = {
HT_XEN_PVM: {
+ HV_USE_BOOTLOADER: False,
+ HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
+ HV_BOOTLOADER_ARGS: '',
HV_KERNEL_PATH: "/boot/vmlinuz-2.6-xenU",
HV_INITRD_PATH: '',
HV_ROOT_PATH: '/dev/sda1',
"""Xen PVM hypervisor interface"""
PARAMETERS = {
+ constants.HV_USE_BOOTLOADER: hv_base.NO_CHECK,
+ constants.HV_BOOTLOADER_PATH: hv_base.OPT_FILE_CHECK,
+ constants.HV_BOOTLOADER_ARGS: hv_base.NO_CHECK,
constants.HV_KERNEL_PATH: hv_base.REQ_FILE_CHECK,
constants.HV_INITRD_PATH: hv_base.OPT_FILE_CHECK,
constants.HV_ROOT_PATH: hv_base.REQUIRED_CHECK,
config = StringIO()
config.write("# this is autogenerated by Ganeti, please do not edit\n#\n")
- # kernel handling
- kpath = hvp[constants.HV_KERNEL_PATH]
- config.write("kernel = '%s'\n" % kpath)
+ # if bootloader is True, use bootloader instead of kernel and ramdisk
+ # parameters.
+ if hvp[constants.HV_USE_BOOTLOADER]:
+ # bootloader handling
+ bootloader_path = hvp[constants.HV_BOOTLOADER_PATH]
+ if bootloader_path:
+ config.write("bootloader = '%s'\n" % bootloader_path)
+ else:
+ raise errors.HypervisorError("Bootloader enabled, but missing"
+ " bootloader path")
- # initrd handling
- initrd_path = hvp[constants.HV_INITRD_PATH]
- if initrd_path:
- config.write("ramdisk = '%s'\n" % initrd_path)
+ bootloader_args = hvp[constants.HV_BOOTLOADER_ARGS]
+ if bootloader_args:
+ config.write("bootargs = '%s'\n" % bootloader_args)
+ else:
+ # kernel handling
+ kpath = hvp[constants.HV_KERNEL_PATH]
+ config.write("kernel = '%s'\n" % kpath)
+
+ # initrd handling
+ initrd_path = hvp[constants.HV_INITRD_PATH]
+ if initrd_path:
+ config.write("ramdisk = '%s'\n" % initrd_path)
# rest of the settings
config.write("memory = %d\n" % instance.beparams[constants.BE_MEMORY])