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