[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Install from ISO for Xen guest



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


Reply to: