[arch-general] [SOLVED] Re: How to choose which grub entry boots next from the cli via ssh in Arch?

David C. Rankin drankinatty at suddenlinkmail.com
Wed Aug 26 05:04:54 UTC 2009


On Tuesday 25 August 2009 11:54:21 pm David C. Rankin wrote:
> On Tuesday 25 August 2009 09:51:50 pm Sven-Hendrik Haase wrote:
> > There are multiple ways:
> > You can put "default   2" at the very top of your menu.lst which will
> > always select the 2nd entry (0-based) by default.
> > Another and maybe more modern way to do it is to add "default   saved"
> > at the top and then add "savedefault" below each individual entry. This
> > way, Grub will always select the last selected entry.
> 
> Sven,
> 
> 	Thanks, sorry, I know all that. I'm looking for a quick command that does
>  NOT alter the menu.lst file, but sets some type of flag that tells grub do
>  NOT boot the default entry, instead, boot entry 5.
> 
> 	I know there is something in kde4 that will do it because when you
>  hold-down the Restart option, you can set the next OS you want to boot if
>  you have more than 1 entry in menu.lst. Ever hear of anything like that
>  for Arch?
> 
> 	With grubonce, you just enter grubonce (without arguments) and it returns
>  a list of what is in your menu.lst file:
> 
> [23:52 dcrgx/home/david/scripts/file] # grubonce
> 0: openSUSE 11.0 - 2.6.25.20-0.5
> 1: Failsafe -- openSUSE 11.0 - 2.6.25.20-0.5
> 2: openSUSE 11.1 - 2.6.27.19-3.2 (/dev/sdb1)
> 3: Windows
> 
> 	Then all you have to do is issue the command:
> 
> # grubonce 2
> 
> and you will boot suse 11.1 next time. That's what I'm looking for. I'll
>  keep digging.
> 

A, hah!

	Should have checked in the first place. suse just uses a script. Here it is:

#!/usr/bin/perl                                                 

# Keep this sort of configurable for the future.
$GRUBDIR="/boot/grub";                          

# Parse the menu file, and see if we can get a match for a maybe given arg.
open(MENU, "<$GRUBDIR/menu.lst") || die "no menu.lst in $GRUBDIR";         
$gotit = 0;                                                                
$titleno = -1;                                                             
$global_default = undef;                                                   
while(<MENU>) {                                                            
  m,\s*default\s+(.+), && $titleno == -1 && ($global_default = $1);
  next unless m,\s*title\s+(.*),i;
  $title_name = $1;
  $titleno++;

  if (@ARGV > 0) {
    # Argument may be entirely numerical, in which case it is an index,
    # or a perl RE that leads to the first title matching.
    if (( $ARGV[0] =~ m,^[0-9]+$, && $titleno    eq   $ARGV[0] ) ||
        ( $ARGV[0] !~ m,^[0-9]+$, && $title_name =~ m,$ARGV[0],i) ) {
      $gotit = 1;
      last;
    }
  } else {
    print "$titleno: $title_name\n";
  }
}
close(MENU);

print "Warning: you haven't set a global default!\n" if 
!defined($global_default);

# Without a command line argument, we have now listet the titles and are done.
exit 0 if @ARGV < 1;

# Else the user wants to write the default file. We have better found a match!
if ($gotit > 0) {
  print "Warning: your global default is 'saved'; changing default 
permanently!"
    if $global_default eq "saved";

  print "Using entry #$titleno: $title_name\n";

  # set the magic one-time flag
  $titleno |= 0x4000;

  open(DEFFILE, ">$GRUBDIR/default") ||
    die "Cannot open default file for writing";
  $buf = $titleno . "\0" .  "\n" x 9;
  syswrite(DEFFILE, $buf, 10);
  close(DEFFILE);

  exit 0;
} else {
  print $ARGV[0] . " not found in $GRUBDIR/menu.lst\n";
  exit 1;
}


-- 
David C. Rankin, J.D.,P.E.
Rankin Law Firm, PLLC
510 Ochiltree Street
Nacogdoches, Texas 75961
Telephone: (936) 715-9333
Facsimile: (936) 715-9339
www.rankinlawfirm.com


More information about the arch-general mailing list