瀏覽代碼

ktest: Add support for grub2

As only grub or 'script' is supported for rebooting to a new kernel,
and Fedora 17 has dropped support for grub, I decided to add grub2
support as well (I also plan on adding syslinux/extlinux support too).

The options GRUB_FILE and GRUB_REBOOT were added to allow the user
to specify where to find the grub.cfg and what tool to use to reboot
into the next kernel respectively.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Steven Rostedt 13 年之前
父節點
當前提交
a15ba91361
共有 2 個文件被更改,包括 91 次插入4 次删除
  1. 67 2
      tools/testing/ktest/ktest.pl
  2. 24 2
      tools/testing/ktest/sample.conf

+ 67 - 2
tools/testing/ktest/ktest.pl

@@ -53,6 +53,7 @@ my %default = (
     "STOP_AFTER_FAILURE"	=> 60,
     "STOP_AFTER_FAILURE"	=> 60,
     "STOP_TEST_AFTER"		=> 600,
     "STOP_TEST_AFTER"		=> 600,
     "MAX_MONITOR_WAIT"		=> 1800,
     "MAX_MONITOR_WAIT"		=> 1800,
+    "GRUB_REBOOT"		=> "grub2-reboot",
 
 
 # required, and we will ask users if they don't have them but we keep the default
 # required, and we will ask users if they don't have them but we keep the default
 # value something that is common.
 # value something that is common.
@@ -105,7 +106,9 @@ my $scp_to_target;
 my $scp_to_target_install;
 my $scp_to_target_install;
 my $power_off;
 my $power_off;
 my $grub_menu;
 my $grub_menu;
+my $grub_file;
 my $grub_number;
 my $grub_number;
+my $grub_reboot;
 my $target;
 my $target;
 my $make;
 my $make;
 my $pre_install;
 my $pre_install;
@@ -232,6 +235,8 @@ my %option_map = (
     "ADD_CONFIG"		=> \$addconfig,
     "ADD_CONFIG"		=> \$addconfig,
     "REBOOT_TYPE"		=> \$reboot_type,
     "REBOOT_TYPE"		=> \$reboot_type,
     "GRUB_MENU"			=> \$grub_menu,
     "GRUB_MENU"			=> \$grub_menu,
+    "GRUB_FILE"			=> \$grub_file,
+    "GRUB_REBOOT"		=> \$grub_reboot,
     "PRE_INSTALL"		=> \$pre_install,
     "PRE_INSTALL"		=> \$pre_install,
     "POST_INSTALL"		=> \$post_install,
     "POST_INSTALL"		=> \$post_install,
     "NO_INSTALL"		=> \$no_install,
     "NO_INSTALL"		=> \$no_install,
@@ -368,7 +373,7 @@ EOF
     ;
     ;
 $config_help{"REBOOT_TYPE"} = << "EOF"
 $config_help{"REBOOT_TYPE"} = << "EOF"
  Way to reboot the box to the test kernel.
  Way to reboot the box to the test kernel.
- Only valid options so far are "grub" and "script".
+ Only valid options so far are "grub", "grub2", and "script".
 
 
  If you specify grub, it will assume grub version 1
  If you specify grub, it will assume grub version 1
  and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
  and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
@@ -378,11 +383,14 @@ $config_help{"REBOOT_TYPE"} = << "EOF"
 
 
  The entry in /boot/grub/menu.lst must be entered in manually.
  The entry in /boot/grub/menu.lst must be entered in manually.
  The test will not modify that file.
  The test will not modify that file.
+
+ If you specify grub2, then you also need to specify both \$GRUB_MENU
+ and \$GRUB_FILE.
 EOF
 EOF
     ;
     ;
 $config_help{"GRUB_MENU"} = << "EOF"
 $config_help{"GRUB_MENU"} = << "EOF"
  The grub title name for the test kernel to boot
  The grub title name for the test kernel to boot
- (Only mandatory if REBOOT_TYPE = grub)
+ (Only mandatory if REBOOT_TYPE = grub or grub2)
 
 
  Note, ktest.pl will not update the grub menu.lst, you need to
  Note, ktest.pl will not update the grub menu.lst, you need to
  manually add an option for the test. ktest.pl will search
  manually add an option for the test. ktest.pl will search
@@ -393,6 +401,17 @@ $config_help{"GRUB_MENU"} = << "EOF"
  title Test Kernel
  title Test Kernel
  kernel vmlinuz-test
  kernel vmlinuz-test
  GRUB_MENU = Test Kernel
  GRUB_MENU = Test Kernel
+
+ For grub2, a search of \$GRUB_FILE is performed for the lines
+ that begin with "menuentry". It will not detect submenus. The
+ menu must be a non-nested menu. Add the quotes used in the menu
+ to guarantee your selection, as the first menuentry with the content
+ of \$GRUB_MENU that is found will be used.
+EOF
+    ;
+$config_help{"GRUB_FILE"} = << "EOF"
+ If grub2 is used, the full path for the grub.cfg file is placed
+ here. Use something like /boot/grub2/grub.cfg to search.
 EOF
 EOF
     ;
     ;
 $config_help{"REBOOT_SCRIPT"} = << "EOF"
 $config_help{"REBOOT_SCRIPT"} = << "EOF"
@@ -521,6 +540,11 @@ sub get_ktest_configs {
     if ($rtype eq "grub") {
     if ($rtype eq "grub") {
 	get_ktest_config("GRUB_MENU");
 	get_ktest_config("GRUB_MENU");
     }
     }
+
+    if ($rtype eq "grub2") {
+	get_ktest_config("GRUB_MENU");
+	get_ktest_config("GRUB_FILE");
+    }
 }
 }
 
 
 sub process_variables {
 sub process_variables {
@@ -1452,8 +1476,44 @@ sub run_scp_mod {
     return run_scp($src, $dst, $cp_scp);
     return run_scp($src, $dst, $cp_scp);
 }
 }
 
 
+sub get_grub2_index {
+
+    return if (defined($grub_number));
+
+    doprint "Find grub2 menu ... ";
+    $grub_number = -1;
+
+    my $ssh_grub = $ssh_exec;
+    $ssh_grub =~ s,\$SSH_COMMAND,cat $grub_file,g;
+
+    open(IN, "$ssh_grub |")
+	or die "unable to get $grub_file";
+
+    my $found = 0;
+
+    while (<IN>) {
+	if (/^menuentry.*$grub_menu/) {
+	    $grub_number++;
+	    $found = 1;
+	    last;
+	} elsif (/^menuentry\s/) {
+	    $grub_number++;
+	}
+    }
+    close(IN);
+
+    die "Could not find '$grub_menu' in $grub_file on $machine"
+	if (!$found);
+    doprint "$grub_number\n";
+}
+
 sub get_grub_index {
 sub get_grub_index {
 
 
+    if ($reboot_type eq "grub2") {
+	get_grub2_index;
+	return;
+    }
+
     if ($reboot_type ne "grub") {
     if ($reboot_type ne "grub") {
 	return;
 	return;
     }
     }
@@ -1524,6 +1584,8 @@ sub reboot_to {
 
 
     if ($reboot_type eq "grub") {
     if ($reboot_type eq "grub") {
 	run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
 	run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
+    } elsif ($reboot_type eq "grub2") {
+	run_ssh "$grub_reboot $grub_number";
     } elsif (defined $reboot_script) {
     } elsif (defined $reboot_script) {
 	run_command "$reboot_script";
 	run_command "$reboot_script";
     }
     }
@@ -3700,6 +3762,9 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
 	$target = "$ssh_user\@$machine";
 	$target = "$ssh_user\@$machine";
 	if ($reboot_type eq "grub") {
 	if ($reboot_type eq "grub") {
 	    dodie "GRUB_MENU not defined" if (!defined($grub_menu));
 	    dodie "GRUB_MENU not defined" if (!defined($grub_menu));
+	} elsif ($reboot_type eq "grub2") {
+	    dodie "GRUB_MENU not defined" if (!defined($grub_menu));
+	    dodie "GRUB_FILE not defined" if (!defined($grub_file));
 	}
 	}
     }
     }
 
 

+ 24 - 2
tools/testing/ktest/sample.conf

@@ -332,8 +332,18 @@
 # from other linux builds on the system.
 # from other linux builds on the system.
 #LOCALVERSION = -test
 #LOCALVERSION = -test
 
 
+# For REBOOT_TYPE = grub2, you must specify where the grub.cfg
+# file is. This is the file that is searched to find the menu
+# option to boot to with GRUB_REBOOT
+#GRUB_FILE = /boot/grub2/grub.cfg
+
+# The tool for REBOOT_TYPE = grub2 to set the next reboot kernel
+# to boot into (one shot mode).
+# (default grub2_reboot)
+#GRUB_REBOOT = grub2_reboot
+
 # The grub title name for the test kernel to boot
 # The grub title name for the test kernel to boot
-# (Only mandatory if REBOOT_TYPE = grub)
+# (Only mandatory if REBOOT_TYPE = grub or grub2)
 #
 #
 # Note, ktest.pl will not update the grub menu.lst, you need to
 # Note, ktest.pl will not update the grub menu.lst, you need to
 # manually add an option for the test. ktest.pl will search
 # manually add an option for the test. ktest.pl will search
@@ -343,6 +353,15 @@
 # For example, if in the /boot/grub/menu.lst the test kernel title has:
 # For example, if in the /boot/grub/menu.lst the test kernel title has:
 # title Test Kernel
 # title Test Kernel
 # kernel vmlinuz-test
 # kernel vmlinuz-test
+#
+# For grub2, a search of top level "menuentry"s are done. No
+# submenu is searched. The menu is found by searching for the
+# contents of GRUB_MENU in the line that starts with "menuentry".
+# You may want to include the quotes around the option. For example:
+# for: menuentry 'Test Kernel'
+# do a: GRUB_MENU = 'Test Kernel'
+# For customizing, add your entry in /etc/grub.d/40_custom.
+#
 #GRUB_MENU = Test Kernel
 #GRUB_MENU = Test Kernel
 
 
 # A script to reboot the target into the test kernel
 # A script to reboot the target into the test kernel
@@ -497,7 +516,7 @@
 #POST_BUILD_DIE = 1
 #POST_BUILD_DIE = 1
 
 
 # Way to reboot the box to the test kernel.
 # Way to reboot the box to the test kernel.
-# Only valid options so far are "grub" and "script"
+# Only valid options so far are "grub", "grub2" and "script"
 # (default grub)
 # (default grub)
 # If you specify grub, it will assume grub version 1
 # If you specify grub, it will assume grub version 1
 # and will search in /boot/grub/menu.lst for the title $GRUB_MENU
 # and will search in /boot/grub/menu.lst for the title $GRUB_MENU
@@ -505,6 +524,9 @@
 # your setup, then specify "script" and have a command or script
 # your setup, then specify "script" and have a command or script
 # specified in REBOOT_SCRIPT to boot to the target.
 # specified in REBOOT_SCRIPT to boot to the target.
 #
 #
+# For REBOOT_TYPE = grub2, you must define both GRUB_MENU and
+# GRUB_FILE.
+#
 # The entry in /boot/grub/menu.lst must be entered in manually.
 # The entry in /boot/grub/menu.lst must be entered in manually.
 # The test will not modify that file.
 # The test will not modify that file.
 #REBOOT_TYPE = grub
 #REBOOT_TYPE = grub