[PATCH 4/4] ybin userland interface for specifying bootonce

Dustin Kirkland dustin.kirkland at us.ibm.com
Fri Mar 2 01:38:36 EST 2007


ybin userland interface for specifying bootonce

Add an option to ybin called "--bootonce" that takes exactly one
argument, the label of the kernel to boot exactly once, on next reboot.

Do some sanity checking.  Grep through the yaboot config file to make
sure that label=WHATEVER exists somewhere, bail if not.  Try to prune
out comment lines.  Perhaps this might be implemented better.  It worked
will in my testing, though.

Set the boot-once OF environment variable to the --bootonce value.  Due
to the previously mentioned nvsetenv bug, this will fail silently if
you're trying to set boot-once on a system where boot-once doesn't
already exist in nvram.  Thus, immediately after doing the set, try and
read it back out of nvsetenv and make sure it landed there.  Bail if
not.

Testing:
        [root at gekko-lp3 ybin]# nvsetenv | grep boot-once
        boot-once=
        
        [root at gekko-lp3 ybin]# ybin  -v --bootonce
        ybin: option requires an argument --bootonce
        Try `ybin --help' for more information.
        
        [root at gekko-lp3 ybin]# ybin  -v --bootonce foo
        ybin: Could not find bootonce label [foo] in /etc/yaboot.conf
        
        [root at gekko-lp3 ybin]# ybin  -v --bootonce linux
        ybin: nvsetenv boot-once linux
        ybin: Installing primary bootstrap /usr/lib/yaboot/yaboot
        onto /dev/sda1...
        ybin: Installation successful
        
        [root at gekko-lp3 ybin]# nvsetenv | grep boot-once
        boot-once=linux



-- 
Signed-off-by: Dustin Kirkland <dustin.kirkland at us.ibm.com>



diff --git a/ybin/mkofboot b/ybin/mkofboot
diff --git a/ybin/ybin b/ybin/ybin
index 210711f..046b6bd 100755
--- a/ybin/ybin
+++ b/ybin/ybin
@@ -155,6 +155,8 @@ Update/install bootloader onto a bootstrap partition.
   -b, --boot                 set bootstrap partition device [ -b /dev/hda2 ]
   -o, --ofboot               set bootstrap partition OpenFirmware device
 			       default: automatically determined [ -o hd:2 ]
+       --bootonce            override default boot label for ONLY next boot
+                                eg: --bootonce linux-2.6.20-testing
   -i, --install              pathname to the actual bootloader binary
                                default: /usr/{local/}lib/yaboot/yaboot same as
                                install= in config file [ -i bootloader_file ]
@@ -1377,6 +1379,17 @@ if [ $# != 0 ] ; then
 		    exit 1
 		fi
 		;;
+	    --bootonce)
+		if [ -n "$2" ] ; then
+		    bootonce="$2"
+		    ARGS="$ARGS $1 $2"
+		    shift 2
+		else
+		    echo 1>&2 "$PRG: option requires an argument $1"
+		    echo 1>&2 "Try \`$PRG --help' for more information."
+		    exit 1
+		fi
+		;;
 	    -i|--install)
 		if [ -n "$2" ] ; then
 		    install="$2"
@@ -1643,6 +1656,28 @@ fi
 ## validate configuration for sanity.
 checkconf || exit 1
 
+if [ "x$bootonce" != "x" ]; then
+    foundlabel=`sed s/\#.*// $bootconf | grep "label=$bootonce$" | wc -l`
+    if [ "$nonvram" = 0 ]; then
+	echo 1>&2 "$PRG: --bootonce specified, but nvsetenv not available."
+	exit 1
+    fi
+    if [ "$foundlabel" = 1 ]; then
+	nvsetenv boot-once "$bootonce"
+	foundlabel=`nvsetenv boot-once`
+	if [ "$foundlabel" != "boot-once=$bootonce" ]; then
+	    echo 1>&2 "$PRG: Could not nvsetenv boot-once $bootonce"
+	    exit 1
+	fi
+	[ "$VERBOSE" = 1 ] && echo "$PRG: nvsetenv boot-once $bootonce"
+    else
+	echo 1>&2 "$PRG: Could not find bootonce label [$bootonce] in $bootconf"
+	exit 1
+    fi
+fi
+
+bootparts=0
+
 ## check that we can use ofpath, its only needed for magicboot script
 ## building and nvram updates.
 if [ -n "$magicboot" -o "$nonvram" = 0 ] ; then





More information about the Yaboot-devel mailing list