initialize NODE_MODL_OPTIONS in case we go into debug mode before we've successfully...
[bootmanager.git] / source / steps / InitializeBootManager.py
index 076a637..cab0d97 100644 (file)
@@ -1,3 +1,13 @@
+#!/usr/bin/python
+
+# $Id$
+
+# Copyright (c) 2003 Intel Corporation
+# All rights reserved.
+#
+# Copyright (c) 2004-2006 The Trustees of Princeton University
+# All rights reserved.
+
 import os
 import xmlrpclib
 import socket
@@ -11,16 +21,8 @@ import utils
 BOOT_VERSION_2X_FILE='/usr/bootme/ID'
 BOOT_VERSION_3X_FILE='/pl_version'
 
-# locations of boot server name/certificate files
-V2X_BOOTCD_SERVER_FILE = "/usr/bootme/BOOTSERVER"
-V2X_BOOTCD_SERVER_CACERT_DIR = "/usr/bootme/cacert"
-V2X_CACERT_NAME = "cacert.pem"
-    
-V3X_BOOTCD_SERVER_FILE = "/usr/boot/boot_server"
-V3X_BOOTCD_SERVER_CACERT = "/usr/boot/cacert.pem"
-
 # minimium version of the boot os we need to run, as a (major,minor) tuple
-MINIMUM_BOOT_VERSION= (2,0)
+MINIMUM_BOOT_VERSION= (3,0)
 
 # minimum version of python required to run the boot manager
 MINIMUM_PYTHON_VERSION= (2,2,0)
@@ -32,15 +34,36 @@ def Run( vars, log ):
     hardware setup (to fix old cd problems)
 
     Sets the following variables:
-    BOOT_CD_VERSION           A two number tuple of the boot cd version
-    MA_BOOT_SERVER            The boot server we contacted, identified from
-                              files on the boot cd.
-    MA_BOOT_SERVER_CACERT     The SSL certificate for the above server
-
+    PARTITIONS        A dictionary of generic partition types and their
+                      associated devices.
+    BOOT_CD_VERSION   A two number tuple of the boot cd version
     """
 
     log.write( "\n\nStep: Initializing the BootManager.\n" )
 
+    # Default model option.  Required in case we go into debug mode
+    # before we successfully called GetAndUpdateNodeDetails().
+    vars["NODE_MODEL_OPTIONS"] = vars.get("NODE_MODEL_OPTIONS",0)
+
+    # define the basic partition paths
+    PARTITIONS= {}
+    PARTITIONS["root"]= "/dev/planetlab/root"
+    PARTITIONS["swap"]= "/dev/planetlab/swap"
+    PARTITIONS["vservers"]= "/dev/planetlab/vservers"
+    # Linux 2.6 mounts LVM with device mapper
+    PARTITIONS["mapper-root"]= "/dev/mapper/planetlab-root"
+    PARTITIONS["mapper-swap"]= "/dev/mapper/planetlab-swap"
+    PARTITIONS["mapper-vservers"]= "/dev/mapper/planetlab-vservers"
+    vars["PARTITIONS"]= PARTITIONS
+
+    log.write( "Opening connection to API server\n" )
+    try:
+        api_inst= xmlrpclib.Server( vars['BOOT_API_SERVER'], verbose=0 )
+    except KeyError, e:
+        raise BootManagerException, \
+              "configuration file does not specify API server URL"
+
+    vars['API_SERVER_INST']= api_inst
 
     if not __check_boot_version( vars, log ):
         raise BootManagerException, \
@@ -50,102 +73,12 @@ def Run( vars, log ):
                    str(vars['BOOT_CD_VERSION']) )
 
     BOOT_CD_VERSION= vars['BOOT_CD_VERSION']
-
-
-    log.write( "Identifying boot server and setting up /etc/planetlab entries" )
-
-    # need to pull the server name we contacted. 2.x cds will have the
-    # info in /usr/bootme; 3.x cds in /usr/boot
-    if BOOT_CD_VERSION[0] == 2:
-        try:
-            boot_server= file(V2X_BOOTCD_SERVER_FILE).read().strip()                
-        except IOError:
-            raise BootManagerException, \
-                  "It appears we are running on a v2.x boot cd, but could " \
-                  "not load contacted boot server from %s" % V2X_BOOTCD_SERVER_FILE
-        
-        if boot_server == "":
-            raise BootManagerException, \
-                  "It appears we are running on a v2.x boot cd, but %s " \
-                  "appears to be blank." % V2X_BOOTCD_SERVER_FILE
-
-        cacert_file= "%s/%s/%s" % (V2X_BOOTCD_SERVER_CACERT_DIR,
-                                   boot_server, V2X_CACERT_NAME)
-
-    elif BOOT_CD_VERSION[0] == 3:
-        try:
-            boot_server= file(V3X_BOOTCD_SERVER_FILE).read().strip()                
-        except IOError:
-            raise BootManagerException, \
-                  "It appears we are running on a v3.x boot cd, but could " \
-                  "not load contacted boot server from %s" % V3X_BOOTCD_SERVER_FILE
-        
-        if boot_server == "":
-            raise BootManagerException, \
-                  "It appears we are running on a v3.x boot cd, but %s " \
-                  "appears to be blank." % V3X_BOOTCD_SERVER_FILE
-
-        cacert_file= V3X_BOOTCD_SERVER_CACERT
-
-    else:
-        raise BootManagerException, "Unknown boot cd version."
-
-    if not os.access(cacert_file, os.R_OK):
-        raise BootManagerException, \
-              "Could not find the certificate for the " \
-              "specified boot server (at %s)" % cacert_file
-
-    # tell the log instance about the boot server so it knows
-    # where to upload the logs
-    try:
-        log.SetUploadServer( self.VARS['MA_BOOT_SERVER'] )
-    except KeyError, e:
-        log.LogEntry( "configuration does not contain boot server name." )
-        return
-
-
-    # now that we have the boot server name and the location of its certificate,
-    # write out /etc/planetlab/primary_ma with this info.
-    try:
-        primary_ma_file= file("/etc/planetlab/primary_ma","w")
-        primary_ma_file.write( "MA_NAME=\"Unknown\"\n" )
-        primary_ma_file.write( "MA_BOOT_SERVER=\"%s\"\n" % boot_server )
-        primary_ma_file.write( "MA_BOOT_SERVER_CACERT=\"%s\"\n" % cacert_file )
-        primary_ma_file.close()
-        primary_ma_file= None
-    except IOError:
-        raise BootManagerException, "Unable to write out /etc/planetlab/primary_ma"
     
-    vars['MA_BOOT_SERVER']= boot_server
-    vars['MA_BOOT_SERVER_CACRET']= cacert_file
-
-    self.Message( "Using boot server %s with certificate" %
-                  (boot_server,cacert_file) )
-
-    
-    log.write( "Opening connection to API server\n" )
-    api_server_url= "https://%s/PLCAPI/" % vars['MA_BOOT_SERVER']
-    api_inst= xmlrpclib.Server( api_server_url, verbose=0 )
-    vars['API_SERVER_INST']= api_inst
-
-    
-    # old cds need extra modules loaded for compaq smart array
-    if BOOT_CD_VERSION[0] == 2:
-
-        has_smartarray= utils.sysexec_noerr(
-            'lspci | egrep "0e11:b178|0e11:4070|0e11:4080|0e11:4082|0e11:4083"')
-        
-        if has_smartarray:
-            log.write( "Loading support for Compaq smart array\n" )
-            utils.sysexec_noerr( "modprobe cciss", log )
-            _create_cciss_dev_entries()
-            
-
-        has_fusion= utils.sysexec_noerr('lspci | egrep "1000:0030"')
-        
-        if has_fusion:
-            log.write( "Loading support for Fusion MPT SCSI controllers\n" )
-            utils.sysexec_noerr( "modprobe mptscsih", log )
+    # In case we are booted with a kernel that does not have the
+    # device mapper code compiled into the kernel.
+    if not os.path.exists("/dev/mapper"):
+        log.write( "Loading support for LVM\n" )
+        utils.sysexec_noerr( "modprobe dm_mod", log )
 
     # for anything that needs to know we are running under the boot cd and
     # not the runtime os
@@ -259,262 +192,17 @@ def __check_boot_version( vars, log ):
 
 
 def _create_cciss_dev_entries():
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0 b 104 0" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p1 b 104 1" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p2 b 104 2" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p3 b 104 3" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p4 b 104 4" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p5 b 104 5" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p6 b 104 6" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p7 b 104 7" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p8 b 104 8" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p9 b 104 9" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p10 b 104 10" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p11 b 104 11" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p12 b 104 12" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p13 b 104 13" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p14 b 104 14" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d0p15 b 104 15" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1 b 104 16" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p1 b 104 17" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p2 b 104 18" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p3 b 104 19" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p4 b 104 20" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p5 b 104 21" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p6 b 104 22" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p7 b 104 23" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p8 b 104 24" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p9 b 104 25" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p10 b 104 26" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p11 b 104 27" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p12 b 104 28" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p13 b 104 29" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p14 b 104 30" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d1p15 b 104 31" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2 b 104 32" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p1 b 104 33" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p2 b 104 34" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p3 b 104 35" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p4 b 104 36" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p5 b 104 37" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p6 b 104 38" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p7 b 104 39" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p8 b 104 40" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p9 b 104 41" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p10 b 104 42" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p11 b 104 43" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p12 b 104 44" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p13 b 104 45" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p14 b 104 46" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d2p15 b 104 47" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3 b 104 48" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p1 b 104 49" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p2 b 104 50" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p3 b 104 51" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p4 b 104 52" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p5 b 104 53" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p6 b 104 54" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p7 b 104 55" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p8 b 104 56" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p9 b 104 57" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p10 b 104 58" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p11 b 104 59" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p12 b 104 60" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p13 b 104 61" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p14 b 104 62" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d3p15 b 104 63" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4 b 104 64" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p1 b 104 65" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p2 b 104 66" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p3 b 104 67" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p4 b 104 68" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p5 b 104 69" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p6 b 104 70" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p7 b 104 71" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p8 b 104 72" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p9 b 104 73" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p10 b 104 74" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p11 b 104 75" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p12 b 104 76" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p13 b 104 77" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p14 b 104 78" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d4p15 b 104 79" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5 b 104 80" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p1 b 104 81" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p2 b 104 82" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p3 b 104 83" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p4 b 104 84" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p5 b 104 85" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p6 b 104 86" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p7 b 104 87" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p8 b 104 88" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p9 b 104 89" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p10 b 104 90" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p11 b 104 91" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p12 b 104 92" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p13 b 104 93" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p14 b 104 94" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d5p15 b 104 95" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6 b 104 96" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p1 b 104 97" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p2 b 104 98" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p3 b 104 99" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p4 b 104 100" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p5 b 104 101" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p6 b 104 102" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p7 b 104 103" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p8 b 104 104" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p9 b 104 105" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p10 b 104 106" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p11 b 104 107" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p12 b 104 108" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p13 b 104 109" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p14 b 104 110" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d6p15 b 104 111" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7 b 104 112" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p1 b 104 113" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p2 b 104 114" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p3 b 104 115" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p4 b 104 116" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p5 b 104 117" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p6 b 104 118" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p7 b 104 119" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p8 b 104 120" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p9 b 104 121" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p10 b 104 122" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p11 b 104 123" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p12 b 104 124" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p13 b 104 125" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p14 b 104 126" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d7p15 b 104 127" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8 b 104 128" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p1 b 104 129" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p2 b 104 130" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p3 b 104 131" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p4 b 104 132" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p5 b 104 133" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p6 b 104 134" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p7 b 104 135" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p8 b 104 136" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p9 b 104 137" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p10 b 104 138" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p11 b 104 139" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p12 b 104 140" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p13 b 104 141" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p14 b 104 142" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d8p15 b 104 143" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9 b 104 144" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p1 b 104 145" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p2 b 104 146" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p3 b 104 147" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p4 b 104 148" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p5 b 104 149" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p6 b 104 150" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p7 b 104 151" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p8 b 104 152" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p9 b 104 153" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p10 b 104 154" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p11 b 104 155" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p12 b 104 156" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p13 b 104 157" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p14 b 104 158" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d9p15 b 104 159" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10 b 104 160" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p1 b 104 161" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p2 b 104 162" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p3 b 104 163" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p4 b 104 164" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p5 b 104 165" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p6 b 104 166" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p7 b 104 167" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p8 b 104 168" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p9 b 104 169" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p10 b 104 170" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p11 b 104 171" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p12 b 104 172" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p13 b 104 173" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p14 b 104 174" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d10p15 b 104 175" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11 b 104 176" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p1 b 104 177" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p2 b 104 178" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p3 b 104 179" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p4 b 104 180" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p5 b 104 181" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p6 b 104 182" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p7 b 104 183" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p8 b 104 184" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p9 b 104 185" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p10 b 104 186" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p11 b 104 187" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p12 b 104 188" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p13 b 104 189" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p14 b 104 190" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d11p15 b 104 191" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12 b 104 192" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p1 b 104 193" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p2 b 104 194" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p3 b 104 195" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p4 b 104 196" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p5 b 104 197" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p6 b 104 198" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p7 b 104 199" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p8 b 104 200" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p9 b 104 201" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p10 b 104 202" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p11 b 104 203" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p12 b 104 204" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p13 b 104 205" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p14 b 104 206" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d12p15 b 104 207" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13 b 104 208" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p1 b 104 209" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p2 b 104 210" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p3 b 104 211" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p4 b 104 212" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p5 b 104 213" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p6 b 104 214" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p7 b 104 215" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p8 b 104 216" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p9 b 104 217" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p10 b 104 218" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p11 b 104 219" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p12 b 104 220" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p13 b 104 221" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p14 b 104 222" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d13p15 b 104 223" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14 b 104 224" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p1 b 104 225" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p2 b 104 226" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p3 b 104 227" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p4 b 104 228" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p5 b 104 229" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p6 b 104 230" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p7 b 104 231" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p8 b 104 232" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p9 b 104 233" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p10 b 104 234" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p11 b 104 235" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p12 b 104 236" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p13 b 104 237" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p14 b 104 238" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d14p15 b 104 239" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15 b 104 240" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p1 b 104 241" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p2 b 104 242" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p3 b 104 243" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p4 b 104 244" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p5 b 104 245" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p6 b 104 246" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p7 b 104 247" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p8 b 104 248" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p9 b 104 249" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p10 b 104 250" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p11 b 104 251" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p12 b 104 252" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p13 b 104 253" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p14 b 104 254" )
-    utils.sysexec_noerr( "mknod /dev/cciss/c0d15p15 b 104 255" )
-
-
-    
+    def mkccissnod(dev,node):
+        dev = dev + " b 104 %d" % (node)
+       cmd = "mknod /dev/cciss/%s" %dev
+        utils.sysexec_noerr(cmd)
+        node = node + 1
+        return node
+
+    node = 0
+    for i in range(0,16):
+        dev = "c0d%d" % i
+        node = mkccissnod(dev,node)
+        for j in range(1,16):
+            subdev = dev + "p%d" % j
+            node = mkccissnod(subdev,node)