Blob Blame History Raw
From 92c61a05e30bd5e68efac2f92ea520f47ce5416b Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Mon, 18 Nov 2013 14:44:13 -0500
Subject: [PATCH] Honor "linux16" and "initrd16"

Resolves: rhbz#1031192
Resolves: rhbz#1034743

Signed-off-by: Peter Jones <pjones@redhat.com>
---
 grubby.c                 | 63 ++++++++++++++++++++++---------
 test.sh                  | 16 ++++++++
 test/grub2.10            | 84 +++++++++++++++++++++++++++++++++++++++++
 test/grub2.11            | 97 +++++++++++++++++++++++++++++++++++++++++++++++
 test/results/add/g2-1.10 | 96 +++++++++++++++++++++++++++++++++++++++++++++++
 test/results/add/g2-1.11 | 98 ++++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 437 insertions(+), 17 deletions(-)
 create mode 100644 test/grub2.10
 create mode 100644 test/grub2.11
 create mode 100644 test/results/add/g2-1.10
 create mode 100644 test/results/add/g2-1.11

diff --git a/grubby.c b/grubby.c
index 3de53b3..5dc5487 100644
--- a/grubby.c
+++ b/grubby.c
@@ -90,7 +90,9 @@ enum lineType_e {
     LT_SET_VARIABLE = 1 << 19,
     LT_KERNEL_EFI   = 1 << 20,
     LT_INITRD_EFI   = 1 << 21,
-    LT_UNKNOWN      = 1 << 22,
+    LT_KERNEL_16    = 1 << 22,
+    LT_INITRD_16    = 1 << 23,
+    LT_UNKNOWN      = 1 << 24,
 };
 
 struct singleLine {
@@ -220,8 +222,10 @@ struct keywordTypes grub2Keywords[] = {
     { "fallback",   LT_FALLBACK,    ' ' },
     { "linux",      LT_KERNEL,      ' ' },
     { "linuxefi",   LT_KERNEL_EFI,  ' ' },
+    { "linux16",    LT_KERNEL_16,   ' ' },
     { "initrd",     LT_INITRD,      ' ', ' ' },
     { "initrdefi",  LT_INITRD_EFI,  ' ', ' ' },
+    { "initrd16",   LT_INITRD_16,   ' ', ' ' },
     { "module",     LT_MBMODULE,    ' ' },
     { "kernel",     LT_HYPER,       ' ' },
     { NULL, 0, 0 },
@@ -397,11 +401,11 @@ static int isquote(char q)
 }
 
 static int iskernel(enum lineType_e type) {
-    return (type == LT_KERNEL || type == LT_KERNEL_EFI);
+    return (type == LT_KERNEL || type == LT_KERNEL_EFI || type == LT_KERNEL_16);
 }
 
 static int isinitrd(enum lineType_e type) {
-    return (type == LT_INITRD || type == LT_INITRD_EFI);
+    return (type == LT_INITRD || type == LT_INITRD_EFI || type == LT_INITRD_16);
 }
 
 char *grub2ExtractTitle(struct singleLine * line) {
@@ -719,6 +723,17 @@ static enum lineType_e preferredLineType(enum lineType_e type,
 	default:
 	    return type;
 	}
+#if defined(__i386__) || defined(__x86_64__)
+    } else if (cfi == &grub2ConfigType) {
+	switch (type) {
+	case LT_KERNEL:
+	    return LT_KERNEL_16;
+	case LT_INITRD:
+	    return LT_INITRD_16;
+	default:
+	    return type;
+	}
+#endif
     }
     return type;
 }
@@ -1806,7 +1821,7 @@ int suitableImage(struct singleEntry * entry, const char * bootPrefix,
 	return 0;
     }
 
-    line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines);
+    line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
     if (!line) {
 	notSuitablePrintf(entry, 0, "no line found\n");
 	return 0;
@@ -1940,7 +1955,7 @@ struct singleEntry * findEntryByPath(struct grubConfig * config,
 	entry = findEntryByIndex(config, indexVars[i]);
 	if (!entry) return NULL;
 
-	line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines);
+	line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
 	if (!line) return NULL;
 
 	if (index) *index = indexVars[i];
@@ -1991,9 +2006,9 @@ struct singleEntry * findEntryByPath(struct grubConfig * config,
 	    for (line = entry->lines; line; line = line->next) {
 		enum lineType_e ct = checkType;
 		if (entry->multiboot && checkType == LT_KERNEL)
-		    ct = LT_KERNEL|LT_KERNEL_EFI|LT_MBMODULE|LT_HYPER;
+		    ct = LT_KERNEL|LT_KERNEL_EFI|LT_MBMODULE|LT_HYPER|LT_KERNEL_16;
 		else if (checkType & LT_KERNEL)
-		    ct = checkType | LT_KERNEL_EFI;
+		    ct = checkType | LT_KERNEL_EFI | LT_KERNEL_16;
 		line = getLineByType(ct, line);
 		if (!line)
 		    break;  /* not found in this entry */
@@ -2015,7 +2030,7 @@ struct singleEntry * findEntryByPath(struct grubConfig * config,
 	     * non-Linux boot entries (could find netbsd etc, though, which is
 	     * unfortunate)
 	     */
-	    if (line && getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines))
+	    if (line && getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines))
 		break; /* found 'im! */
 	}
 
@@ -2249,7 +2264,7 @@ void displayEntry(struct singleEntry * entry, const char * prefix, int index) {
 
     printf("index=%d\n", index);
 
-    line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines);
+    line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
     if (!line) {
         printf("non linux entry\n");
         return;
@@ -2314,7 +2329,7 @@ void displayEntry(struct singleEntry * entry, const char * prefix, int index) {
 	printf("root=%s\n", s);
     }
 
-    line = getLineByType(LT_INITRD|LT_INITRD_EFI, entry->lines);
+    line = getLineByType(LT_INITRD|LT_INITRD_EFI|LT_INITRD_16, entry->lines);
 
     if (line && line->numElements >= 2) {
 	if (!strncmp(prefix, line->elements[1].item, strlen(prefix)))
@@ -2731,7 +2746,7 @@ struct singleLine * addLineTmpl(struct singleEntry * entry,
 	insertElement(newLine, val, 1, cfi);
 
 	/* but try to keep the rootspec from the template... sigh */
-	if (tmplLine->type & (LT_HYPER|LT_KERNEL|LT_MBMODULE|LT_INITRD|LT_KERNEL_EFI|LT_INITRD_EFI)) {
+	if (tmplLine->type & (LT_HYPER|LT_KERNEL|LT_MBMODULE|LT_INITRD|LT_KERNEL_EFI|LT_INITRD_EFI|LT_KERNEL_16|LT_INITRD_16)) {
 	    char * rootspec = getRootSpecifier(tmplLine->elements[1].item);
 	    if (rootspec != NULL) {
 		free(newLine->elements[1].item);
@@ -3101,7 +3116,7 @@ int updateActualImage(struct grubConfig * cfg, const char * image,
 	    firstElement = 2;
 
 	} else {
-	    line = getLineByType(LT_KERNEL|LT_MBMODULE|LT_KERNEL_EFI, entry->lines);
+	    line = getLineByType(LT_KERNEL|LT_MBMODULE|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
 	    if (!line) {
 		/* no LT_KERNEL or LT_MBMODULE in this entry? */
 		continue;
@@ -3302,10 +3317,10 @@ int updateInitrd(struct grubConfig * cfg, const char * image,
     if (!image) return 0;
 
     for (; (entry = findEntryByPath(cfg, image, prefix, &index)); index++) {
-        kernelLine = getLineByType(LT_KERNEL|LT_KERNEL_EFI, entry->lines);
+        kernelLine = getLineByType(LT_KERNEL|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
         if (!kernelLine) continue;
 
-        line = getLineByType(LT_INITRD|LT_INITRD_EFI, entry->lines);
+        line = getLineByType(LT_INITRD|LT_INITRD_EFI|LT_INITRD_16, entry->lines);
         if (line)
             removeLine(entry, line);
         if (prefix) {
@@ -3316,8 +3331,21 @@ int updateInitrd(struct grubConfig * cfg, const char * image,
 	endLine = getLineByType(LT_ENTRY_END, entry->lines);
 	if (endLine)
 	    removeLine(entry, endLine);
-        line = addLine(entry, cfg->cfi, preferredLineType(LT_INITRD, cfg->cfi),
-			kernelLine->indent, initrd);
+	enum lineType_e lt;
+	switch(kernelLine->type) {
+	    case LT_KERNEL:
+	        lt = LT_INITRD;
+		break;
+	    case LT_KERNEL_EFI:
+	        lt = LT_INITRD_EFI;
+		break;
+	    case LT_KERNEL_16:
+	        lt = LT_INITRD_16;
+		break;
+	    default:
+	        lt = preferredLineType(LT_INITRD, cfg->cfi);
+	}
+        line = addLine(entry, cfg->cfi, lt, kernelLine->indent, initrd);
         if (!line)
 	    return 1;
 	if (endLine) {
@@ -3915,6 +3943,7 @@ int addNewKernel(struct grubConfig * config, struct singleEntry * template,
 	switch (config->cfi->entryStart) {
 	    case LT_KERNEL:
 	    case LT_KERNEL_EFI:
+	    case LT_KERNEL_16:
 		if (new->multiboot && config->cfi->mbHyperFirst) {
 		    /* fall through to LT_HYPER */
 		} else {
@@ -4473,7 +4502,7 @@ int main(int argc, const char ** argv) {
 	if (!entry) return 0;
 	if (!suitableImage(entry, bootPrefix, 0, flags)) return 0;
 
-	line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI, entry->lines);
+	line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines);
 	if (!line) return 0;
 
         rootspec = getRootSpecifier(line->elements[1].item);
diff --git a/test.sh b/test.sh
index 17b40fe..5be4006 100755
--- a/test.sh
+++ b/test.sh
@@ -536,6 +536,22 @@ if [ "$testgrub2" == "y" ]; then
 
     testing="GRUB2 --default-index with default=saved_entry and empty grubenv"
     grub2DisplayTest grub2.8 defaultindex/0 --env grubenv.0 --default-index
+
+    testlinux16=n
+    case $ARCH in
+        ia32|x86_64) testlinux16=y ;;
+    esac
+
+    if [ "$testlinux16" == "y" ]; then
+        testing="GRUB2 add kernel with linux16"
+        grub2Test grub2.10 add/g2-1.10 --add-kernel=/boot/new-kernel.img \
+            --title='title' --initrd=/boot/new-initrd --boot-filesystem=/boot/ \
+            --copy-default
+
+        testing="GRUB2 add initrd with linux16"
+        grub2Test grub2.11 add/g2-1.11 --update-kernel=/boot/new-kernel.img \
+            --initrd=/boot/new-initrd --boot-filesystem=/boot/
+    fi
 fi
 
 testing="YABOOT add kernel"
diff --git a/test/grub2.10 b/test/grub2.10
new file mode 100644
index 0000000..d010783
--- /dev/null
+++ b/test/grub2.10
@@ -0,0 +1,84 @@
+#
+# DO NOT EDIT THIS FILE
+#
+# It is automatically generated by grub2-mkconfig using templates
+# from /etc/grub.d and settings from /etc/default/grub
+#
+
+### BEGIN /etc/grub.d/00_header ###
+if [ -s $prefix/grubenv ]; then
+  load_env
+fi
+set default="0"
+if [ "${prev_saved_entry}" ]; then
+  set saved_entry="${prev_saved_entry}"
+  save_env saved_entry
+  set prev_saved_entry=
+  save_env prev_saved_entry
+  set boot_once=true
+fi
+
+function savedefault {
+  if [ -z "${boot_once}" ]; then
+    saved_entry="${chosen}"
+    save_env saved_entry
+  fi
+}
+
+function load_video {
+  insmod vbe
+  insmod vga
+  insmod video_bochs
+  insmod video_cirrus
+}
+
+set timeout=5
+### END /etc/grub.d/00_header ###
+
+### BEGIN /etc/grub.d/10_linux ###
+menuentry 'Linux, with Fedora 2.6.38.8-32.fc15.x86_64' --class gnu-linux --class gnu --class os {
+	load_video
+	set gfxpayload=keep
+	insmod part_msdos
+	insmod ext2
+	set root='(hd0,msdos1)'
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+	echo	'Loading Fedora 2.6.38.8-32.fc15.x86_64 ...'
+	linux16	/vmlinuz-2.6.38.8-32.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+	echo	'Loading initial ramdisk ...'
+	initrd16	/initramfs-2.6.38.8-32.fc15.x86_64.img
+}
+menuentry 'Linux, with Linux 2.6.38.2-9.fc15.x86_64' --class gnu-linux --class gnu --class os {
+	load_video
+	set gfxpayload=keep
+	insmod part_msdos
+	insmod ext2
+	set root='(hd0,msdos1)'
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+	echo	'Loading Linux 2.6.38.2-9.fc15.x86_64 ...'
+	linux16	/vmlinuz-2.6.38.2-9.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+	echo	'Loading initial ramdisk ...'
+	initrd16	/initramfs-2.6.38.2-9.fc15.x86_64.img
+}
+### END /etc/grub.d/10_linux ###
+
+### BEGIN /etc/grub.d/20_linux_xen ###
+### END /etc/grub.d/20_linux_xen ###
+
+### BEGIN /etc/grub.d/30_os-prober ###
+### END /etc/grub.d/30_os-prober ###
+
+### BEGIN /etc/grub.d/40_custom ###
+# This file provides an easy way to add custom menu entries.  Simply type the
+# menu entries you want to add after this comment.  Be careful not to change
+# the 'exec tail' line above.
+### END /etc/grub.d/40_custom ###
+
+### BEGIN /etc/grub.d/41_custom ###
+if [ -f  $prefix/custom.cfg ]; then
+  source $prefix/custom.cfg;
+fi
+### END /etc/grub.d/41_custom ###
+
+### BEGIN /etc/grub.d/90_persistent ###
+### END /etc/grub.d/90_persistent ###
diff --git a/test/grub2.11 b/test/grub2.11
new file mode 100644
index 0000000..820880a
--- /dev/null
+++ b/test/grub2.11
@@ -0,0 +1,97 @@
+#
+# DO NOT EDIT THIS FILE
+#
+# It is automatically generated by grub2-mkconfig using templates
+# from /etc/grub.d and settings from /etc/default/grub
+#
+
+### BEGIN /etc/grub.d/00_header ###
+if [ -s $prefix/grubenv ]; then
+  load_env
+fi
+set default="0"
+if [ "${prev_saved_entry}" ]; then
+  set saved_entry="${prev_saved_entry}"
+  save_env saved_entry
+  set prev_saved_entry=
+  save_env prev_saved_entry
+  set boot_once=true
+fi
+
+function savedefault {
+  if [ -z "${boot_once}" ]; then
+    saved_entry="${chosen}"
+    save_env saved_entry
+  fi
+}
+
+function load_video {
+  insmod vbe
+  insmod vga
+  insmod video_bochs
+  insmod video_cirrus
+}
+
+set timeout=5
+### END /etc/grub.d/00_header ###
+
+set superusers="foo bar  baz"
+
+### BEGIN /etc/grub.d/10_linux ###
+menuentry 'title' --class gnu-linux --class gnu --class os {
+	load_video
+	set gfxpayload=keep
+	insmod part_msdos
+	insmod ext2
+	set root='(hd0,msdos1)'
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+	echo 'Loading title'
+	linux16	/new-kernel.img root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+	echo 'Loading initial ramdisk ...'
+}
+menuentry 'Linux, with Linux 2.6.38.8-32.fc15.x86_64' --class gnu-linux --class gnu --class os {
+	load_video
+	set gfxpayload=keep
+	insmod part_msdos
+	insmod ext2
+	set root='(hd0,msdos1)'
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+	echo	'Loading Linux 2.6.38.8-32.fc15.x86_64 ...'
+	linux16	/vmlinuz-2.6.38.8-32.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+	echo	'Loading initial ramdisk ...'
+	initrd16	/initramfs-2.6.38.8-32.fc15.x86_64.img
+}
+menuentry 'Linux, with Linux 2.6.38.2-9.fc15.x86_64' --class gnu-linux --class gnu --class os {
+	load_video
+	set gfxpayload=keep
+	insmod part_msdos
+	insmod ext2
+	set root='(hd0,msdos1)'
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+	echo	'Loading Linux 2.6.38.2-9.fc15.x86_64 ...'
+	linux16	/vmlinuz-2.6.38.2-9.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+	echo	'Loading initial ramdisk ...'
+	initrd16	/initramfs-2.6.38.2-9.fc15.x86_64.img
+}
+### END /etc/grub.d/10_linux ###
+
+### BEGIN /etc/grub.d/20_linux_xen ###
+### END /etc/grub.d/20_linux_xen ###
+
+### BEGIN /etc/grub.d/30_os-prober ###
+### END /etc/grub.d/30_os-prober ###
+
+### BEGIN /etc/grub.d/40_custom ###
+# This file provides an easy way to add custom menu entries.  Simply type the
+# menu entries you want to add after this comment.  Be careful not to change
+# the 'exec tail' line above.
+### END /etc/grub.d/40_custom ###
+
+### BEGIN /etc/grub.d/41_custom ###
+if [ -f  $prefix/custom.cfg ]; then
+  source $prefix/custom.cfg;
+fi
+### END /etc/grub.d/41_custom ###
+
+### BEGIN /etc/grub.d/90_persistent ###
+### END /etc/grub.d/90_persistent ###
diff --git a/test/results/add/g2-1.10 b/test/results/add/g2-1.10
new file mode 100644
index 0000000..bb2c71c
--- /dev/null
+++ b/test/results/add/g2-1.10
@@ -0,0 +1,96 @@
+#
+# DO NOT EDIT THIS FILE
+#
+# It is automatically generated by grub2-mkconfig using templates
+# from /etc/grub.d and settings from /etc/default/grub
+#
+
+### BEGIN /etc/grub.d/00_header ###
+if [ -s $prefix/grubenv ]; then
+  load_env
+fi
+set default="1"
+if [ "${prev_saved_entry}" ]; then
+  set saved_entry="${prev_saved_entry}"
+  save_env saved_entry
+  set prev_saved_entry=
+  save_env prev_saved_entry
+  set boot_once=true
+fi
+
+function savedefault {
+  if [ -z "${boot_once}" ]; then
+    saved_entry="${chosen}"
+    save_env saved_entry
+  fi
+}
+
+function load_video {
+  insmod vbe
+  insmod vga
+  insmod video_bochs
+  insmod video_cirrus
+}
+
+set timeout=5
+### END /etc/grub.d/00_header ###
+
+### BEGIN /etc/grub.d/10_linux ###
+menuentry 'title' --class gnu-linux --class gnu --class os {
+	load_video
+	set gfxpayload=keep
+	insmod part_msdos
+	insmod ext2
+	set root='(hd0,msdos1)'
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+	echo 'Loading title'
+	linux16	/new-kernel.img root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+	echo 'Loading initial ramdisk ...'
+	initrd16	/new-initrd
+}
+menuentry 'Linux, with Fedora 2.6.38.8-32.fc15.x86_64' --class gnu-linux --class gnu --class os {
+	load_video
+	set gfxpayload=keep
+	insmod part_msdos
+	insmod ext2
+	set root='(hd0,msdos1)'
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+	echo	'Loading Fedora 2.6.38.8-32.fc15.x86_64 ...'
+	linux16	/vmlinuz-2.6.38.8-32.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+	echo	'Loading initial ramdisk ...'
+	initrd16	/initramfs-2.6.38.8-32.fc15.x86_64.img
+}
+menuentry 'Linux, with Linux 2.6.38.2-9.fc15.x86_64' --class gnu-linux --class gnu --class os {
+	load_video
+	set gfxpayload=keep
+	insmod part_msdos
+	insmod ext2
+	set root='(hd0,msdos1)'
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+	echo	'Loading Linux 2.6.38.2-9.fc15.x86_64 ...'
+	linux16	/vmlinuz-2.6.38.2-9.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+	echo	'Loading initial ramdisk ...'
+	initrd16	/initramfs-2.6.38.2-9.fc15.x86_64.img
+}
+### END /etc/grub.d/10_linux ###
+
+### BEGIN /etc/grub.d/20_linux_xen ###
+### END /etc/grub.d/20_linux_xen ###
+
+### BEGIN /etc/grub.d/30_os-prober ###
+### END /etc/grub.d/30_os-prober ###
+
+### BEGIN /etc/grub.d/40_custom ###
+# This file provides an easy way to add custom menu entries.  Simply type the
+# menu entries you want to add after this comment.  Be careful not to change
+# the 'exec tail' line above.
+### END /etc/grub.d/40_custom ###
+
+### BEGIN /etc/grub.d/41_custom ###
+if [ -f  $prefix/custom.cfg ]; then
+  source $prefix/custom.cfg;
+fi
+### END /etc/grub.d/41_custom ###
+
+### BEGIN /etc/grub.d/90_persistent ###
+### END /etc/grub.d/90_persistent ###
diff --git a/test/results/add/g2-1.11 b/test/results/add/g2-1.11
new file mode 100644
index 0000000..a11cb41
--- /dev/null
+++ b/test/results/add/g2-1.11
@@ -0,0 +1,98 @@
+#
+# DO NOT EDIT THIS FILE
+#
+# It is automatically generated by grub2-mkconfig using templates
+# from /etc/grub.d and settings from /etc/default/grub
+#
+
+### BEGIN /etc/grub.d/00_header ###
+if [ -s $prefix/grubenv ]; then
+  load_env
+fi
+set default="0"
+if [ "${prev_saved_entry}" ]; then
+  set saved_entry="${prev_saved_entry}"
+  save_env saved_entry
+  set prev_saved_entry=
+  save_env prev_saved_entry
+  set boot_once=true
+fi
+
+function savedefault {
+  if [ -z "${boot_once}" ]; then
+    saved_entry="${chosen}"
+    save_env saved_entry
+  fi
+}
+
+function load_video {
+  insmod vbe
+  insmod vga
+  insmod video_bochs
+  insmod video_cirrus
+}
+
+set timeout=5
+### END /etc/grub.d/00_header ###
+
+set superusers="foo bar  baz"
+
+### BEGIN /etc/grub.d/10_linux ###
+menuentry 'title' --class gnu-linux --class gnu --class os {
+	load_video
+	set gfxpayload=keep
+	insmod part_msdos
+	insmod ext2
+	set root='(hd0,msdos1)'
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+	echo 'Loading title'
+	linux16	/new-kernel.img root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+	echo 'Loading initial ramdisk ...'
+	initrd16 /new-initrd
+}
+menuentry 'Linux, with Linux 2.6.38.8-32.fc15.x86_64' --class gnu-linux --class gnu --class os {
+	load_video
+	set gfxpayload=keep
+	insmod part_msdos
+	insmod ext2
+	set root='(hd0,msdos1)'
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+	echo	'Loading Linux 2.6.38.8-32.fc15.x86_64 ...'
+	linux16	/vmlinuz-2.6.38.8-32.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+	echo	'Loading initial ramdisk ...'
+	initrd16	/initramfs-2.6.38.8-32.fc15.x86_64.img
+}
+menuentry 'Linux, with Linux 2.6.38.2-9.fc15.x86_64' --class gnu-linux --class gnu --class os {
+	load_video
+	set gfxpayload=keep
+	insmod part_msdos
+	insmod ext2
+	set root='(hd0,msdos1)'
+	search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+	echo	'Loading Linux 2.6.38.2-9.fc15.x86_64 ...'
+	linux16	/vmlinuz-2.6.38.2-9.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+	echo	'Loading initial ramdisk ...'
+	initrd16	/initramfs-2.6.38.2-9.fc15.x86_64.img
+}
+### END /etc/grub.d/10_linux ###
+
+### BEGIN /etc/grub.d/20_linux_xen ###
+### END /etc/grub.d/20_linux_xen ###
+
+### BEGIN /etc/grub.d/30_os-prober ###
+### END /etc/grub.d/30_os-prober ###
+
+### BEGIN /etc/grub.d/40_custom ###
+# This file provides an easy way to add custom menu entries.  Simply type the
+# menu entries you want to add after this comment.  Be careful not to change
+# the 'exec tail' line above.
+### END /etc/grub.d/40_custom ###
+
+### BEGIN /etc/grub.d/41_custom ###
+if [ -f  $prefix/custom.cfg ]; then
+  source $prefix/custom.cfg;
+fi
+### END /etc/grub.d/41_custom ###
+
+### BEGIN /etc/grub.d/90_persistent ###
+### END /etc/grub.d/90_persistent ###
-- 
1.8.4.2