This was discussed a little while back on both lists (the interesting/useful bit starts at http://lists.debian.org/debian-boot/2009/06/msg00094.html). It's taken me a while but I've finally got something which works for me. Below is a patch for debian-installer to build cdrom-xen variants for i386 and amd64. If nobody objects I would like to commit this to the d-i repository. I will follow up shortly with a short series of patches which introduces image "variants" to debian-cd and adds the Xen variant as an option for i386 and amd64 and a patch to the nightly cron jobs which enables this variant for the i386+amd64+powerpc multiarch netinst image. One thing which is outstanding is a udev update which is needed for CDROM devices to actually be detected. Support went into upstream in release 142 (sid currently has 141). Ian. commit a1c1d48b63f664ea988b4ffe2d999b0d40d86827 Author: Ian Campbell <ijc@hellion.org.uk> Date: Thu Aug 6 20:24:00 2009 +0100 Add cdrom-xen images to i386 and amd64. - Update xm-debian.cfg to include the ability to boot from an ISO - Add an i386 cdrom-xen target using the correct kernel+modules for use with Xen (686-bigmem) - Add an amd64 cdrom-xen target symlinking to the regular amd64 graphical kernel+initrd, since although a different kernel isn't needed for amd64 this keeps things similar for both x86 platforms. diff --git a/installer/build/boot/x86/xen/xm-debian.cfg b/installer/build/boot/x86/xen/xm-debian.cfg index d1d78e7..7c3ff51 100644 --- a/installer/build/boot/x86/xen/xm-debian.cfg +++ b/installer/build/boot/x86/xen/xm-debian.cfg @@ -11,16 +11,26 @@ # to start the Debian Installer. # # In the installation case the following additional variables exist: +# +# COMMON OPTIONS +# install-method: "cdrom" or "network" # install-arch: which architecture to install. e.g. i386 or amd64 -# install-suite: which Debian version to install. e.g. squeeze or sid -# install-mirror: which Debian mirror to use -# e.g. http://ftp.uk.debian.org/debian -# install-installer: URL to obtain the Debian Installer bits, by -# default these are located under install-mirror. To use a nightly -# snapshot: http://people.debian.org/~joeyh/d-i/images/daily/ -# install-kernel, install-ramdisk: URLs pointing to the installer kernel and +# install-installer: URL or path to the Debian Installer bits. By +# default for a network install these are located under +# install-mirror. For a CDROM install the default is a fixed path on +# the CD. +# install-kernel, install-ramdisk: URL/path to the installer kernel and # ramdisk to use, by default these are located via install-installer. # install-extra: extra command line arguments +# +# CDROM SPECIFIC OPTIONS +# install-media: Path to the Debian install media (i.e. an ISO) +# install-cdrom-device: Name of the CD-ROM device within the guest. +# +# NETWORK SPECIFIC OPTIONS +# install-suite: which Debian version to install. e.g. lenny, squeeze or sid +# install-mirror: which Debian mirror to use +# e.g. http://ftp.uk.debian.org/debian #============================================================================ @@ -125,18 +135,35 @@ def var_check_with_default(default, var, val): return default xm_vars.var('install', use='Install Debian, default: false', check=check_bool) +xm_vars.var("install-method", + use='Installation method to use "cdrom" or "network"', + check=lambda var, val: var_check_with_default('network', var, val)) -xm_vars.var("install-arch", - use='Debian mirror to install from (default: i386)', - check=lambda var, val: var_check_with_default('i386', var, val)) +# install-method == "network" xm_vars.var("install-mirror", use='Debian mirror to install from (default: http://ftp.debian.org/debian)', check=lambda var, val: var_check_with_default('http://ftp.debian.org/debian', var, val)) xm_vars.var("install-suite", - use='Debian suite to install (default: squeeze)', - check=lambda var, val: var_check_with_default("squeeze", var, val)) + use='Debian suite to install (default: lenny)', + check=lambda var, val: var_check_with_default("lenny", var, val)) + +# install-method == "cdrom" +xm_vars.var("install-media", + use='Installation media to use (default: None)', + check=lambda var, val: var_check_with_default(None, var, val)) +xm_vars.var("install-cdrom-device", + use='Installation media to use (default: xvdd)', + check=lambda var, val: var_check_with_default('xvdd', var, val)) + +# Common options +xm_vars.var("install-arch", + use='Debian mirror to install from (default: i386)', + check=lambda var, val: var_check_with_default('i386', var, val)) +xm_vars.var("install-extra", + use='Extra command line options (default: None)', + check=lambda var, val: var_check_with_default(None, var, val)) xm_vars.var("install-installer", - use='Debian installer to use (default: uses install-mirror)', + use='Debian installer to use (default: network uses install-mirror; cdrom uses /install.ARCH)', check=lambda var, val: var_check_with_default(None, var, val)) xm_vars.var("install-kernel", use='Debian installer kernel to use (default: uses install-installer)', @@ -144,14 +171,12 @@ xm_vars.var("install-kernel", xm_vars.var("install-ramdisk", use='Debian installer ramdisk to use (default: uses install-installer)', check=lambda var, val: var_check_with_default(None, var, val)) -xm_vars.var("install-extra", - use='Extra command line options (default: None)', - check=lambda var, val: var_check_with_default(None, var, val)) + xm_vars.check() if not xm_vars.env.get('install'): bootloader="pygrub" -else: +elif xm_vars.env['install-method'] == "network": import os.path print "Install Mirror: %s" % xm_vars.env['install-mirror'] print "Install Suite: %s" % xm_vars.env['install-suite'] @@ -181,7 +206,7 @@ else: def http_error_default(self, req, fp, code, msg, hdrs): raise IOError("%s %s" % (code, msg)) urlopener = MyUrlOpener() - + try: print "Fetching %s" % kernelurl kernel, _ = urlopener.retrieve(kernelurl) @@ -189,26 +214,63 @@ else: ramdisk, _ = urlopener.retrieve(ramdiskurl) except IOError, _: raise + +elif xm_vars.env['install-method'] == "cdrom": + arch_path = { 'i386': "/install.386", + 'amd64': "/install.amd" } - if xm_vars.env['install-extra']: - extras=[xm_vars.env['install-extra']] + if xm_vars.env['install-media']: + print "Install Media: %s" % xm_vars.env['install-media'] else: - extras=[] + raise OptionError("No installation media given.") - # Reboot will just restart the installer since this file is not - # reparsed, so halt and restart that way. - extras.append("debian-installer/exit/always_halt=true") - extras.append("--") - extras.append("quiet") + if xm_vars.env['install-installer']: + installer = xm_vars.env['install-installer'] + else: + installer = arch_path[xm_vars.env['install-arch']] - console="hvc0" - try: - if len(vfb) >= 1: - console="tty0" - except NameError, e: - pass + print "Installer: %s" % installer + + if xm_vars.env.get('install-kernel'): + kernelpath = xm_vars.env['install-kernel'] + else: + kernelpath = installer + "/xen/vmlinuz" + + if xm_vars.env.get('install-ramdisk'): + ramdiskpath = xm_vars.env['install-ramdisk'] + else: + ramdiskpath = installer + "/xen/initrd.gz" + + disk.insert(0, 'file:%s,%s:cdrom,r' % (xm_vars.env['install-media'], + xm_vars.env['install-cdrom-device'])) + + bootloader="pygrub" + bootargs="--kernel=%s --ramdisk=%s" % (kernelpath, ramdiskpath) + print "From CD" +else: + print "WARNING: Unknown install-method: %s." % xm_vars.env['install-method'] + +# Figure out command line + +if xm_vars.env['install-extra']: + extras=[xm_vars.env['install-extra']] +else: + extras=[] + +# Reboot will just restart the installer since this file is not +# reparsed, so halt and restart that way. +extras.append("debian-installer/exit/always_halt=true") +extras.append("--") +extras.append("quiet") + +console="hvc0" +try: + if len(vfb) >= 1: + console="tty0" +except NameError, e: + pass - extras.append("console="+ console) +extras.append("console="+ console) - extra = str.join(" ", extras) - print "command line is \"%s\"" % extra +extra = str.join(" ", extras) +print "command line is \"%s\"" % extra diff --git a/installer/build/config/amd64.cfg b/installer/build/config/amd64.cfg index 5987bd1..4233f41 100644 --- a/installer/build/config/amd64.cfg +++ b/installer/build/config/amd64.cfg @@ -1,4 +1,4 @@ -MEDIUM_SUPPORTED = cdrom netboot netboot-gtk netboot-xen hd-media +MEDIUM_SUPPORTED = cdrom cdrom-xen netboot netboot-gtk netboot-xen hd-media MEDIUM_SUPPORTED_EXTRA = monolithic # The version of the kernel to use. diff --git a/installer/build/config/amd64/cdrom-xen.cfg b/installer/build/config/amd64/cdrom-xen.cfg new file mode 100644 index 0000000..3f03e74 --- /dev/null +++ b/installer/build/config/amd64/cdrom-xen.cfg @@ -0,0 +1,13 @@ +TYPE=cdrom/gtk + +EXTRANAME=cdrom/xen/ + +MANIFEST-KERNEL = "kernel image for installing under Xen" +MANIFEST-INITRD = "initrd for installing under Xen" +MANIFEST-XENCFG = "example Xen configuration" + +TARGET = $(KERNEL) $(INITRD) xen_config +SYMLINK_KERNEL = ../vmlinuz +SYMLINK_INITRD = ../gtk/initrd.gz + +EXTRATARGETS = build_cdrom-gtk diff --git a/installer/build/config/i386.cfg b/installer/build/config/i386.cfg index 733224f..dedfee4 100644 --- a/installer/build/config/i386.cfg +++ b/installer/build/config/i386.cfg @@ -1,4 +1,4 @@ -MEDIUM_SUPPORTED = cdrom netboot netboot-gtk netboot-xen hd-media #floppy +MEDIUM_SUPPORTED = cdrom cdrom-xen netboot netboot-gtk netboot-xen hd-media #floppy MEDIUM_SUPPORTED_EXTRA = monolithic # The version of the kernel to use. diff --git a/installer/build/config/i386/cdrom-xen.cfg b/installer/build/config/i386/cdrom-xen.cfg new file mode 100644 index 0000000..5951b7d --- /dev/null +++ b/installer/build/config/i386/cdrom-xen.cfg @@ -0,0 +1,8 @@ +KERNELVERSION = $(BASEVERSION)-686-bigmem +TYPE=cdrom/gtk +include config/i386/cdrom/gtk.cfg +EXTRANAME=cdrom/xen/ +MANIFEST-KERNEL = "kernel image for installing under Xen" +MANIFEST-INITRD = "initrd for installing under Xen" +MANIFEST-XENCFG = "example Xen configuration" +TARGET = $(KERNEL) $(INITRD) xen_config -- Ian Campbell It's a good thing we don't get all the government we pay for.
Attachment:
signature.asc
Description: This is a digitally signed message part