###############################################################################
##
## ybin (YaBoot INstaller) installs/updates the yaboot bootloader.
-## Copyright (C) 2000, 2001 Ethan Benson
+## Copyright (C) 2000, 2001, 2002, 2003 Ethan Benson
##
## This program is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License
PATH="${PATH}:${PATH_PREFIX}/sbin:${PATH_PREFIX}/bin:${PATH_PREFIX}/usr/sbin:${PATH_PREFIX}/usr/bin:${PATH_PREFIX}/usr/local/sbin:${PATH_PREFIX}/usr/local/bin"
fi
PRG="${0##*/}"
+ABSPRG="$0"
SIGINT="$PRG: Interrupt caught ... exiting"
-VERSION=1.3.5pre1
+VERSION=1.3.15
DEBUG=0
VERBOSE=0
TMP="${TMPDIR:-/tmp}"
export LC_COLLATE=C
+## avoid older versions of ofpath shipped in debian boot-floppies etc.
+if [ -x "${PATH_PREFIX}/usr/sbin/ofpath" ] ; then
+ OFPATH="${PATH_PREFIX}/usr/sbin/ofpath"
+else
+ OFPATH=ofpath
+fi
+
## catch signals, clean up junk in /tmp.
trap "cleanup" 0
trap "exit 129" 1
## define default configuration
boot=unconfigured
-## allow default to work on packaged and non-packaged yaboot.
+## allow default to work on packaged and non-packaged yaboot.
## no default for magicboot since it is not required everywhere.
if [ -f /usr/local/lib/yaboot/yaboot ] ; then
install=/usr/local/lib/yaboot/yaboot
## defaults
usemount=no
-fstype=hfs
+if (cat /proc/cpuinfo 2> /dev/null | grep ^machine | grep -q 'CHRP IBM') ; then
+ fstype=raw
+else
+ fstype=hfs
+fi
hfstype=tbxi
hfscreator=UNIX
bless=yes
## make fake `id' if its missing, outputs 0 since if its missing we
## are probably running on boot floppies and thus are root.
-if (command -v id > /dev/null 2>&1) ; then
+if (command -v id > /dev/null 2>&1) ; then
true
else
id()
"$PRG $VERSION
Written by Ethan Benson
-Copyright (C) 2000, 2001 Ethan Benson
+Copyright (C) 2000, 2001, 2002, 2003 Ethan Benson
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
}
-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 ]
this is useful of you don't want them to be
visible from MacOS.
--nonvram do not update the boot-device variable in nvram.
- --device yaboot auto configuration: sets the OF boot device
- default: hd:
- --partition yaboot auto configuration: sets the partition
- number of the root partition. default: 3
- --timeout yaboot auto configuration: sets the time yaboot
- will wait for user input before booting default
- image default: 40 (4 seconds)
- --image yaboot auto configuration: sets the path to the
- kernel image. default: /vmlinux
- --label yaboot auto configuration: sets the image label
- default: Linux
- --root yaboot auto configuration: sets the root device
- default: /dev/hda3
--force don't ever ask for confirmation
-v, --verbose make $PRG more verbose
--debug print boring junk only useful for debugging
fi
local CONFERR=1
fi
-
+
if [ `echo ${#hfscreator}` != 4 ] ; then
if [ "$ARGCT" = 1 ] ; then
echo 1>&2 "$PRG: --creator must be 4 characters"
fi
## convert defaultos variable
- case "$defaultos" in
+ case "$defaultos" in
linux|Linux|GNU|Gnu|gnu)
defaultos=bootyaboot
;;
echo 1>&2 "$PRG: /dev/nvram: Permission denied"
echo 1>&2 "$PRG: Warning: nvram will not be updated"
nonvram=1
+ elif ! (dd if=/dev/nvram of=/dev/null bs=1 count=10 > /dev/null 2>&1) ; then
+ echo 1>&2 "$PRG: /dev/nvram: No such device"
+ echo 1>&2 "$PRG: Warning: nvram will not be updated"
+ nonvram=1
else
nonvram=1
echo 1>&2 "$PRG: Warning: Incompatible version of \`nvsetenv', nvram will not be updated"
else
readlink()
{
- SYMTARGET="$(v=`ls -l "$2" 2>/dev/null` ; echo ${v##*> })"
+ local SYMTARGET="$(v=`ls -l "$2" 2>/dev/null` ; echo ${v##*> })"
if [ -n "$SYMTARGET" ] ; then
echo "$SYMTARGET"
return 0
## figure out bootstrap device OF pathname if user did not supply it.
if [ -z "$ofboot" ] ; then
[ "$VERBOSE" = 1 ] && echo "$PRG: Finding OpenFirmware device path to \`$boot'..."
- ofboot="$(ofpath $boot)"
+ ofboot="$($OFPATH $boot)"
if [ $? != 0 ] ; then
echo 1>&2 "$PRG: Unable to find OpenFirmware path for boot=$boot"
echo 1>&2 "$PRG: Please add ofboot=<path> where <path> is the OpenFirmware path to $boot to $CONF"
/dev/*)
[ "$VERBOSE" = 1 ] && echo "$PRG: Finding OpenFirmware device path to \`$bsd'..."
local sbsd="$bsd"
- bsd="$(ofpath $bsd)"
+ bsd="$($OFPATH $bsd)"
if [ $? != 0 ] ; then
echo 1>&2 "$PRG: Unable to determine OpenFirmware path for bsd=$sbsd"
echo 1>&2 "$PRG: Try specifying the real OpenFirmware path for bsd=$sbsd in $CONF"
/dev/*)
[ "$VERBOSE" = 1 ] && echo "$PRG: Finding OpenFirmware device path to \`$macos'..."
local smacos="$macos"
- macos="$(ofpath $macos)"
+ macos="$($OFPATH $macos)"
if [ $? != 0 ] ; then
echo 1>&2 "$PRG: Unable to determine OpenFirmware path for macos=$smacos"
echo 1>&2 "$PRG: Try specifying the real OpenFirmware path for macos=$smacos in $CONF"
/dev/*)
[ "$VERBOSE" = 1 ] && echo "$PRG: Finding OpenFirmware device path to \`$macosx'..."
local smacosx="$macosx"
- macosx="$(ofpath $macosx)"
+ macosx="$($OFPATH $macosx)"
if [ $? != 0 ] ; then
echo 1>&2 "$PRG: Unable to determine OpenFirmware path for macosx=$smacosx"
echo 1>&2 "$PRG: Try specifying the real OpenFirmware path for macosx=$smacosx in $CONF"
/dev/*)
[ "$VERBOSE" = 1 ] && echo "$PRG: Finding OpenFirmware device path to \`$darwin'..."
local sdarwin="$darwin"
- darwin="$(ofpath $darwin)"
+ darwin="$($OFPATH $darwin)"
if [ $? != 0 ] ; then
echo 1>&2 "$PRG: Unable to determine OpenFirmware path for darwin=$sdarwin"
echo 1>&2 "$PRG: Try specifying the real OpenFirmware path for darwin=$sdarwin in $CONF"
## This is gross, IBM CHRP OF needs a .note added to the yaboot
## binary, nobody knows whether this note will affect PowerMac OF or
-## not (or could in the future).
+## not (or could in the future).
hack_yaboot()
{
local YBDIR="${install%/*}"
## repoint magicboot as the real first stage loader if using the
## modern automatic generating ofboot.b.
- if [ -n "$FIRST" ] ; then
+ if [ -n "$FIRST" ] ; then
magicboot="$FIRST"
[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: set magicboot to $FIRST"
fi
if [ "$protect" = yes ] ; then
local LOCK="+l"
fi
-
+
if [ "$hide" = yes ] ; then
local INVISIBLE="+i"
fi
mnt_install()
{
local BTFILE=yaboot
-
+
## msdosfs is broken, yaboot may not support this filename.
if [ "$fstype" = msdos ] ; then
local CFFILE=yaboot.cnf
}
## raw installation, for IBM RS/6000 hardware, yaboot is dded to the
-## bootstrap partition.
+## bootstrap partition.
raw_install()
{
## make sure the device is not mounted as a filesystem before
fi
sync ; sync
[ "$VERBOSE" = 1 ] && echo "$PRG: Installation successful"
+ return 0
}
## make sure the first stage ofboot generator is compatible.
[ "$VERBOSE" = 1 ] && echo "$PRG: Creating DOS filesystem on $boot..."
if (command -v dd > /dev/null 2>&1) ; then
dd if=/dev/zero of="$boot" bs=512 count=1600 > /dev/null 2>&1
- fi
+ fi
mkdosfs -n bootstrap "$boot" > /dev/null
if [ $? != 0 ] ; then
echo 1>&2 "$PRG: DOS filesystem creation failed!"
## absurdly bloated case statement to parse command line options.
if [ $# != 0 ] ; then
while true ; do
- case "$1" in
+ case "$1" in
-V|--version)
version
exit 0
;;
--debug)
DEBUG=1
+ ARGS="$ARGS $1"
shift
;;
-v|--verbose)
VERBOSE=1
+ ARGS="$ARGS $1"
shift
;;
-f|--force)
FORCE=yes
+ ARGS="$ARGS $1"
shift
;;
-b|--boot)
if [ -n "$2" ] ; then
- boot="$2"
+ if [ "$boot" = "unconfigured" ]; then
+ boot="$2"
+ else
+ boot="$boot $2"
+ fi
ARGBT=1
shift 2
else
if [ -n "$2" ] ; then
ofboot="$2"
ARGOB=1
+ 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
+ ;;
+ --bootonce)
+ if [ -n "$2" ] ; then
+ bootonce="$2"
+ ARGS="$ARGS $1 $2"
shift 2
else
echo 1>&2 "$PRG: option requires an argument $1"
if [ -n "$2" ] ; then
install="$2"
ARGBF=1
+ ARGS="$ARGS $1 $2"
shift 2
else
echo 1>&2 "$PRG: option requires an argument $1"
CONF="$2"
bootconf="$2"
ERR=" Error in $CONF:"
+ ARGS="$ARGS $1 $2"
shift 2
else
echo 1>&2 "$PRG: option requires an argument $1"
if [ -n "$2" ] ; then
magicboot="$2"
ARGWP=1
+ ARGS="$ARGS $1 $2"
shift 2
else
echo 1>&2 "$PRG: option requires an argument $1"
if [ -n "$2" ] ; then
fstype="$2"
ARGFS=1
+ ARGS="$ARGS $1 $2"
shift 2
else
echo 1>&2 "$PRG: option requires an argument $1"
--nobless)
bless=no
ARGBS=1
+ ARGS="$ARGS $1"
shift
;;
-M|--mount)
usemount=yes
ARGMT=1
+ ARGS="$ARGS $1"
shift
;;
--protect)
protect=yes
ARGPT=1
+ ARGS="$ARGS $1"
shift
;;
--hide)
hide=yes
ARGHD=1
+ ARGS="$ARGS $1"
shift
;;
--nonvram)
nonvram=1
ARGNV=1
+ ARGS="$ARGS $1"
shift
;;
--device)
if [ -n "$2" ] ; then
device="$2"
bootconf=auto
+ echo 1>&2 "$PRG: WARNING: Deprecated option --device"
+ ARGS="$ARGS $1 $2"
shift 2
else
echo 1>&2 "$PRG: option requires an argument $1"
if [ -n "$2" ] ; then
timeout="$2"
bootconf=auto
+ echo 1>&2 "$PRG: WARNING: Deprecated option --device"
+ ARGS="$ARGS $1 $2"
shift 2
else
echo 1>&2 "$PRG: option requires an argument $1"
if [ -n "$2" ] ; then
image="$2"
bootconf=auto
+ echo 1>&2 "$PRG: WARNING: Deprecated option --device"
+ ARGS="$ARGS $1 $2"
shift 2
else
echo 1>&2 "$PRG: option requires an argument $1"
if [ -n "$2" ] ; then
label="$2"
bootconf=auto
+ echo 1>&2 "$PRG: WARNING: Deprecated option --device"
+ ARGS="$ARGS $1 $2"
shift 2
else
echo 1>&2 "$PRG: option requires an argument $1"
if [ -n "$2" ] ; then
partition="$2"
bootconf=auto
+ echo 1>&2 "$PRG: WARNING: Deprecated option --device"
+ ARGS="$ARGS $1 $2"
shift 2
else
echo 1>&2 "$PRG: option requires an argument $1"
if [ -n "$2" ] ; then
root="$2"
bootconf=auto
+ echo 1>&2 "$PRG: WARNING: Deprecated option --device"
+ ARGS="$ARGS $1 $2"
shift 2
else
echo 1>&2 "$PRG: option requires an argument $1"
[ $(parseconf flag enableofboot) = 0 ] && of=yes
[ $(parseconf flag brokenosx) = 0 ] && brokenosx=yes
+bootparts=0
+for i in $boot; do
+ bootparts=$(($bootparts + 1))
+done
+if [ "$bootparts" -gt 1 ]; then
+ [ "$VERBOSE" = 1 ] && echo "$PRG: Iterating through list of boot partitions..."
+ rc=0
+ for i in $boot; do
+ [ "$VERBOSE" = 1 ] && echo "$ABSPRG $ARGS -b $i"
+ $ABSPRG $ARGS -b $i || rc=$?
+ done
+ exit $rc
+fi
+
## ffs!! rtfm! foad!
if [ "$boot" = unconfigured ] ; then
echo 1>&2 "$PRG: You must specify the device for the bootstrap partition. (ie: boot=/dev/hdaX)"
## validate configuration for sanity.
checkconf || exit 1
+if [ "x$bootonce" != "x" ]; then
+ foundlabel=`sed s/\#.*// $bootconf | grep "label=$bootonce$" | wc -l`
+ if [ "$nonvram" = 1 ]; 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" -a \
+ "$foundlabel" != "$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