[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: [Fedora-livecd-list] [PATCH 6/6] Several Kernels
- From: Jeroen van Meeuwen <kanarip kanarip com>
- To: fedora-livecd-list redhat com
- Subject: Re: [Fedora-livecd-list] [PATCH 6/6] Several Kernels
- Date: Sun, 05 Aug 2007 21:19:06 +0200
Jeroen van Meeuwen wrote:
> Jeroen van Meeuwen wrote:
>> A patch which allows multiple kernels to be installed on the live media,
>> giving boot options in the syslinux menu for all of them.
>>
>> In addition, this patch adds an optional timeout parameter for the boot
>> menu. It also adds a cli parameter for appending boot options.
>>
>
> My bad, I had left some old code in there before I created the patch.
> Hopefully this looks better.
>
Grmbl, it needs to import re too... Seems I need more coffee
--- pilgrim.py.prepatch-kernelversion 2007-08-05 19:51:53.000000000 +0200
+++ pilgrim.py 2007-08-05 21:08:44.000000000 +0200
@@ -23,6 +23,7 @@
import glob
import sys
import errno
+import re
import string
import tempfile
import time
@@ -301,7 +302,7 @@
return self.runTransaction(cb)
class InstallationTarget:
- def __init__(self, repos, packages, epackages, groups, fs_label, skip_compression, skip_prelink, tmpdir):
+ def __init__(self, repos, packages, epackages, groups, fs_label, skip_compression, skip_prelink, tmpdir, bootloader_timeout, bootloader_options, preferred_kernel):
self.ayum = None
self.repos = repos
self.packages = packages
@@ -312,6 +313,9 @@
self.skip_prelink = skip_prelink
self.build_dir = None
self.tmpdir = tmpdir
+ self.bootloader_timeout = bootloader_timeout
+ self.bootloader_options = bootloader_options
+ self.preferred_kernel = preferred_kernel
self.build_dir = None
self.instloop = None
@@ -794,16 +798,65 @@
# FIXME: this doesn't handle multiple kernels - we should list
# them all in the isolinux menu
#
+ self.kernel_types = [
+ {
+ "regexp": ".*PAE-debug$",
+ "initrd": "initpaed.img",
+ "vmlinuz": "vmlpaed",
+ "type": "PAE-debug"
+ },
+
+ {
+ "regexp": ".*PAE$",
+ "initrd": "initpae.img",
+ "vmlinuz": "vmlpae",
+ "type": "PAE"
+ },
+
+ {
+ "regexp": ".*xen$",
+ "initrd": "initxen.img",
+ "vmlinuz": "vmlxen",
+ "type": "xen"
+ },
+
+ {
+ "regexp": ".*debug$",
+ "initrd": "initdbg.img",
+ "vmlinuz": "vmldebug",
+ "type": "debug"
+ },
+
+ {
+ "regexp": "^.*$",
+ "initrd": "initrd.img",
+ "vmlinuz": "vmlinuz",
+ "type": "normal"
+ }
+ ]
+
+ kernel_dirs = []
kernels = []
modules_dir = "%s/install_root/lib/modules" % self.build_dir
if os.path.isdir(modules_dir):
- kernels = os.listdir(modules_dir)
+ kernel_dirs = os.listdir(modules_dir)
+
+ kernel_dirs.sort()
- if not kernels:
+ if not kernel_dirs:
raise InstallationError(_("No kernels installed: /lib/modules is empty"))
- return kernels[0]
+ for kernel_dir in kernel_dirs:
+ found = False
+ for kernel_type in self.kernel_types:
+ if not found:
+ if re.match(kernel_type["regexp"], kernel_dir):
+ kernels.append({"name": kernel_dir, "initrd": kernel_type["initrd"], "vmlinuz": kernel_type["vmlinuz"], "type": kernel_type["type"] })
+ found = True
+
+ self.log.debug("Kernels: %s" % str(kernels))
+ return kernels
def createInitramfs(self):
# Create initramfs
@@ -822,9 +875,11 @@
mayflowerconf.write('MODULES+="sym53c8xx aic7xxx "\n')
mayflowerconf.close()
- subprocess.call(["/sbin/mayflower", "-f", "/boot/livecd-initramfs.img",
- self.get_kernel_version()],
- preexec_fn=self.run_in_root)
+ for kernel in self.get_kernel_version():
+ subprocess.call(["/sbin/mayflower", "-f", "/boot/livecd-initramfs-%s.img" % kernel["name"],
+ kernel["name"]],
+ preexec_fn=self.run_in_root)
+
for f in ("/sbin/mayflower", "/etc/mayflower.conf"):
os.unlink("%s/install_root/%s" %(self.build_dir, f))
@@ -857,15 +912,22 @@
# - fix for non-i386
# - error handling
#
- shutil.copyfile("%s/install_root/boot/vmlinuz-%s"
- %(self.build_dir, self.get_kernel_version()),
- "%s/out/isolinux/vmlinuz" %(self.build_dir,))
-
- shutil.copyfile("%s/install_root/boot/livecd-initramfs.img"
- %(self.build_dir,),
- "%s/out/isolinux/initrd.img" %(self.build_dir,))
- os.unlink("%s/install_root/boot/livecd-initramfs.img"
- %(self.build_dir,))
+
+ # Handle multiple kernels
+ for kernel in self.get_kernel_version():
+ # Copy appr. vmlinuz in place
+ shutil.copyfile("%s/install_root/boot/vmlinuz-%s"
+ %(self.build_dir, kernel["name"]),
+ "%s/out/isolinux/%s" %(self.build_dir, kernel["vmlinuz"]))
+
+ # Copy appr. initrd in place
+ shutil.copyfile("%s/install_root/boot/livecd-initramfs-%s.img"
+ %(self.build_dir,kernel["name"]),
+ "%s/out/isolinux/%s" %(self.build_dir,kernel["initrd"]))
+
+ # Lose whatever was there
+ os.unlink("%s/install_root/boot/livecd-initramfs-%s.img"
+ %(self.build_dir,kernel["name"]))
syslinuxfiles = ["isolinux.bin"]
menus = ["vesamenu.c32", "menu.c32"]
@@ -880,13 +942,6 @@
if syslinuxMenu is None:
raise InstallationError(_("syslinux not installed : no suitable *menu.c32 found"))
- isXen = False
- xen = glob.glob("%s/install_root/boot/xen.gz-*" %(self.build_dir,))
- if len(xen) > 0:
- shutil.copyfile(xen[0], "%s/out/isolinux/xen.gz" %(self.build_dir,))
- syslinuxfiles.append("mboot.c32")
- isXen = True
-
for p in syslinuxfiles:
path = "%s/install_root/usr/lib/syslinux/%s" % (self.build_dir, p)
if not os.path.isfile(path):
@@ -901,12 +956,13 @@
else:
have_background = ""
- cfg = """
+ cfg_template = """
default %(menu)s
-timeout 600
+timeout %(bootloader_timeout)s
+%(bootloader_isolinux_extras)s
%(background)s
-menu title Welcome to %(label)s!
+menu title """ + _("Welcome to %(label)s!") + """
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
@@ -914,39 +970,54 @@
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ff000000 #ffffffff
menu color hotkey 7 #ffffffff #ff000000
-""" %{"menu" : syslinuxMenu, "label": self.fs_label, "background" : have_background}
+"""
+
+ cfg = cfg_template % {"menu" : syslinuxMenu, "background" : have_background, "label" : self.fs_label,
+ "bootloader_timeout" : self.bootloader_timeout,
+ "bootloader_isolinux_extras" : self.bootloader_isolinux_extras }
+
+# FIXME
+# Change initrd.img to the "default" kernel, which at this moment we don't have
+
+ for kernel in self.get_kernel_version():
+ # Match against self.preferred_kernel_type
+ if kernel["type"] == self.preferred_kernel_type:
+ preferred_kernel = kernel
+
+ # short, long, extra, kernel_initrd, kernel_vmlinuz
+ stanzas = [("linux", _("Run from image"), self.bootloader_options, "%s" % preferred_kernel["initrd"], "%s" % preferred_kernel["vmlinuz"]),
+ ("runfromram", _("Run from RAM - requires 1 GB+"), self.bootloader_options+" live_ram", "%s" % preferred_kernel["initrd"], "%s" % preferred_kernel["vmlinuz"])]
+
+ # List all kernels
+ for kernel in self.get_kernel_version():
+ if not kernel["type"] == self.cfg.lm_preferred_kernel_type:
+ stanzas.append( ("linux-%s" % kernel["name"], _("Run kernel %s") % kernel["name"], self.bootloader_options, "%s" % kernel["initrd"], "%s" % kernel["vmlinuz"]) )
- stanzas = [("linux", "Run from image", ""),
- ("runfromram", "Run from RAM - requires 1 GB+", "live_ram")]
if os.path.exists("%s/install_root/usr/lib/anaconda-runtime/checkisomd5" %(self.build_dir,)):
- stanzas.append( ("check", "Verify and run from image", "check") )
+ stanzas.append( ("check", _("Verify and run from image"), "check", "", "") )
- for (short, long, extra) in stanzas:
- if not isXen:
- cfg += """label %(short)s
- menu label %(long)s
- kernel vmlinuz
- append initrd=initrd.img ro quiet root=CDLABEL=%(label)s rootfstype=iso9660 liveimg %(extra)s
-""" %{"label": self.fs_label, "background" : have_background,
- "short": short, "long": long, "extra": extra}
- else:
- cfg += """label %(short)s
+ bootcfg = ""
+
+ for (short, long, extra, kernel_initrd, kernel_vmlinuz) in stanzas:
+ bootcfg += """label %(short)s
menu label %(long)s
- kernel mboot.c32
- append xen.gz --- vmlinuz --- initrd.img ro quiet root=CDLABEL=%(label)s rootfstype=iso9660 liveimg %(extra)s
-""" %{"label": self.fs_label, "background" : have_background,
- "short": short, "long": long, "extra": extra}
+ kernel %(kernel_vmlinuz)s
+ append initrd=%(kernel_initrd)s ro quiet root=CDLABEL=%(label)s rootfstype=iso9660 liveimg %(extra)s
+"""
+ bootcfg = bootcfg % {"label": self.fs_label, "background" : have_background, "short": short, "long": long, "extra": extra, "kernel_vmlinuz": kernel_vmlinuz, "kernel_initrd": kernel_initrd }
memtest = glob.glob("%s/install_root/boot/memtest86*" %(self.build_dir,))
if len(memtest) > 0:
shutil.copy(memtest[0], "%s/out/isolinux/memtest" %(self.build_dir,))
- cfg += """label memtest
- menu label Memory Test
+ bootcfg += """label memtest
+ menu label """ + _("Memory Test") + """
kernel memtest"""
+ finalcfg = cfg + bootcfg
+
cfgf = open("%s/out/isolinux/isolinux.cfg" %(self.build_dir,), "w")
- cfgf.write(cfg)
+ cfgf.write(finalcfg)
cfgf.close()
# TODO: enable external entitity to partipate in adding boot entries
@@ -1067,6 +1138,9 @@
[--builddir]
[--installroot]
[--yumcache]
+ [--bootloader_timeout]
+ [--bootloader_options]
+ [--preferred_kernel]
[--tmpdir=<tmpdir>]
--help : """ + _("Print usage and exit") + """
@@ -1083,6 +1157,9 @@
--builddir : """ + _("Use this build directory") + """
--installroot : """ + _("Use this directory as installroot") + """
--yumcache : """ + _("Use this yum cache directory") + """
+ --bootloader_timeout: """ + _("Set the bootloader timeout (default: 3)") + """
+ --bootloader_options: """ + _("Set additional bootloader options") + """
+ --preferred_kernel : """ + _("Set the preffered kernel (default: normal)") + """
--shell : """ + _("Start a shell in the chroot for post-configuration") + """
--tmpdir : """ + _("Temporary directory to use (default: /var/tmp)") + """
@@ -1118,6 +1195,10 @@
self.build_dir = None
self.install_root = None
self.yum_cache = None
+ self.bootloader_timeout = "3"
+ self.bootloader_options = ""
+ self.preferred_kernel = "normal"
+ self.bootloader_isolinux_extras = ""
self.tmpdir = "/var/tmp"
def parse_options(args):
@@ -1128,6 +1209,8 @@
"skip-compression", "uncompressed-size=",
"ignore-deleted", "shell", "no-prelink",
"build_dir=", "install_root=", "yum_cache",
+ "bootloader_timeout", "bootloader_options",
+ "preferred_kernel",
"prelink", "tmpdir="])
except getopt.GetoptError, msg:
@@ -1199,6 +1282,15 @@
if o in ("-y", "--yumcache"):
options.yum_cache = a
continue
+ if o in ("--bootloader_timeout"):
+ options.bootloader_timeout = str(int(a))
+ continue
+ if o in ("--bootloader_options"):
+ options.bootloader_options = a
+ continue
+ if o in ("--preferred_kernel"):
+ options.preferred_kernel = a
+ continue
raise Usage(_("Unknown option %s") % o)
if not options.kscfg and not (options.packages or options.groups):
@@ -1235,7 +1327,11 @@
options.fs_label,
options.skip_compression,
options.skip_prelink,
- options.tmpdir)
+ options.tmpdir,
+ options.bootloader_timeout,
+ options.bootloader_options,
+ options.preferred_kernel,
+ options.bootloader_isolinux_extras)
try:
target.parse(options.kscfg)
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]