X-Git-Url: http://git.ozlabs.org/?p=yaboot.git;a=blobdiff_plain;f=ybin%2Fybin;h=379b94b912593e4f9eff6e61c90df59c9dbc98c9;hp=a7e790d3dc346f6c494a667558b4d28712b85454;hb=58096e43b6efd2fb51e81866fff9660b70d5df64;hpb=103d77e0ce929f3f57b2b75bc38e92b9c2d973c3 diff --git a/ybin/ybin b/ybin/ybin index a7e790d..379b94b 100755 --- a/ybin/ybin +++ b/ybin/ybin @@ -3,7 +3,7 @@ ############################################################################### ## ## 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 @@ -27,13 +27,21 @@ if [ -n "$PATH_PREFIX" ] ; then 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.2 +VERSION=1.3.14 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 @@ -55,7 +63,7 @@ fi ## 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 @@ -65,7 +73,11 @@ fi ## 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 @@ -112,7 +124,7 @@ fi ## 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() @@ -128,7 +140,7 @@ echo \ "$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." } @@ -143,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 ] @@ -166,19 +180,6 @@ Update/install bootloader onto a bootstrap partition. 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 @@ -301,7 +302,7 @@ checkconf() fi local CONFERR=1 fi - + if [ `echo ${#hfscreator}` != 4 ] ; then if [ "$ARGCT" = 1 ] ; then echo 1>&2 "$PRG: --creator must be 4 characters" @@ -373,7 +374,21 @@ checkconf() fi if [ -n "$magicboot" ] ; then - case "$defaultos" in + ## check for bsd loader + if [ -n "$bsd" ] ; then + if [ -f /usr/lib/yaboot/ofwboot -a -r /usr/lib/yaboot/ofwboot ] ; then + BSDLOADER="/usr/lib/yaboot/ofwboot" + elif [ -f /usr/local/lib/yaboot/ofwboot -a -r /usr/local/lib/yaboot/ofwboot ] ; then + BSDLOADER="/usr/local/lib/yaboot/ofwboot" + else + echo 1>&2 "$PRG: /usr/local/lib/yaboot/ofwboot: No such file or directory" + echo 1>&2 "$PRG: With the bsd= option set you must have the bsd boot loader ofwboot" + CONFERR=1 + fi + fi + + ## convert defaultos variable + case "$defaultos" in linux|Linux|GNU|Gnu|gnu) defaultos=bootyaboot ;; @@ -450,6 +465,10 @@ checkconf() 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" @@ -539,7 +558,7 @@ if (command -v readlink > /dev/null 2>&1) ; then 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 @@ -595,7 +614,7 @@ convertpath() ## 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= where is the OpenFirmware path to $boot to $CONF" @@ -610,7 +629,7 @@ convertpath() /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" @@ -629,7 +648,7 @@ convertpath() /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" @@ -648,7 +667,7 @@ convertpath() /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" @@ -667,7 +686,7 @@ convertpath() /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" @@ -711,7 +730,7 @@ checkhfsutils() ## 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%/*}" @@ -757,7 +776,7 @@ util_install() ## if there is a magicboot script to install we will give it the ## hfstype (should be "tbxi") and give yaboot type "boot". - if [ "$magicboot" ] ; then + if [ -n "$magicboot" ] ; then local BTTYPE=boot else local BTTYPE="$hfstype" @@ -773,7 +792,7 @@ util_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 @@ -787,7 +806,7 @@ util_install() if [ "$protect" = yes ] ; then local LOCK="+l" fi - + if [ "$hide" = yes ] ; then local INVISIBLE="+i" fi @@ -827,17 +846,26 @@ util_install() return 1 fi - [ "$VERBOSE" = 1 ] && echo "$PRG: Installing $bootconf to $boot..." + [ "$VERBOSE" = 1 ] && echo "$PRG: Installing $bootconf onto $boot..." hcopy -r "$bootconf" :"$CFFILE" if [ $? != 0 ] ; then echo 1>&2 "$PRG: An error occured while writing to $boot" return 1 fi + if [ -n "$BSDLOADER" ] ; then + [ "$VERBOSE" = 1 ] && echo "$PRG: Installing $BSDLOADER onto $boot..." + hcopy -r "$BSDLOADER" :ofwboot + if [ $? != 0 ] ; then + echo 1>&2 "$PRG: An error occured while writing to $boot" + return 1 + fi + fi + ## set all file's attributes, if a magicboot script exists it ## gets the configured hfstype instead of yaboot (should be ## "tbxi") so it gets booted by OF. - if [ "$magicboot" ] ; then + if [ -n "$magicboot" ] ; then [ "$VERBOSE" = 1 ] && echo "$PRG: Setting attributes on $WRAP..." hattrib -t "$hfstype" -c "$hfscreator" $INVISIBLE $LOCK :ofboot.b if [ $? != 0 ] ; then @@ -860,6 +888,15 @@ util_install() echo 1>&2 "$PRG: This is probably unimportant so we'll ignore it" fi + if [ -n "$BSDLOADER" ] ; then + [ "$VERBOSE" = 1 ] && echo "$PRG: Setting attributes on ofwboot..." + hattrib -t "bsdb" -c "$hfscreator" $INVISIBLE $LOCK :ofwboot + if [ $? != 0 ] ; then + echo 1>&2 "$PRG: Warning: error setting attributes on ofwboot" + echo 1>&2 "$PRG: This is probably unimportant so we'll ignore it" + fi + fi + ## bless the root directory so OF will find the boot file if [ "$bless" = yes ] ; then [ "$VERBOSE" = 1 ] && echo "$PRG: Blessing $boot with Holy Penguin Pee..." @@ -973,7 +1010,7 @@ umnt() mnt_install() { local BTFILE=yaboot - + ## msdosfs is broken, yaboot may not support this filename. if [ "$fstype" = msdos ] ; then local CFFILE=yaboot.cnf @@ -981,7 +1018,7 @@ mnt_install() local CFFILE=yaboot.conf fi - if [ "$magicboot" ] ; then + if [ -n "$magicboot" ] ; then local WRAP="${magicboot##*/}" fi @@ -991,7 +1028,7 @@ mnt_install() ## repoint magicboot as the real first stage loader if using the ## modern automatic generating ofboot.b. - if [ "$FIRST" ] ; then + if [ -n "$FIRST" ] ; then magicboot="$FIRST" [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: set magicboot to $FIRST" fi @@ -1020,7 +1057,7 @@ mnt_install() fi fi - [ "$VERBOSE" = 1 ] && echo "$INSTALLFIRST" + [ "$VERBOSE" = 1 ] && echo "$INSTALLPRIMARY" cp -f "$install" "$TARGET/$BTFILE" if [ $? != 0 ] ; then echo 1>&2 "$PRG: An error occured while writing to $boot" @@ -1028,7 +1065,7 @@ mnt_install() return 1 fi - [ "$VERBOSE" = 1 ] && echo "$PRG: Installing $bootconf on $boot..." + [ "$VERBOSE" = 1 ] && echo "$PRG: Installing $bootconf onto $boot..." cp -f "$bootconf" "$TARGET/$CFFILE" if [ $? != 0 ] ; then echo 1>&2 "$PRG: An error occured while writing to $boot" @@ -1036,13 +1073,26 @@ mnt_install() return 1 fi + if [ -n "$BSDLOADER" ] ; then + [ "$VERBOSE" = 1 ] && echo "$PRG: Installing $BSDLOADER onto $boot..." + cp -f "$BSDLOADER" "$TARGET/ofwboot" + if [ $? != 0 ] ; then + echo 1>&2 "$PRG: An error occured while writing to $boot" + umnt failure "$TARGET" + return 1 + fi + fi + if [ "$protect" = yes ] ; then [ "$VERBOSE" = 1 ] && echo "$PRG: Setting read-only attributes..." chmod a-w "$TARGET/$BTFILE" chmod a-w "$TARGET/$CFFILE" - if [ "$magicboot" ] ; then + if [ -n "$magicboot" ] ; then chmod a-w "$TARGET/ofboot.b" fi + if [ -n "$BSDLOADER" ] ; then + chmod a-w "$TARGET/ofwboot" + fi fi sync ; sync @@ -1074,7 +1124,7 @@ mnt_install() } ## 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 @@ -1145,7 +1195,7 @@ mkfirststage() ## assign variables for configured menu options. [ "$usemount" = no -a "$bless" = yes ] && local YB="yaboot GNU l $ofboot ,${BS}${BS}yaboot" [ "$usemount" = yes -o "$bless" = no ] && local YB="yaboot GNU l $ofboot ,${OFDIR}yaboot" - [ -n "$bsd" ] && OS="$(($OS + 1))" && local BSD="bsd BSD b $bsd ,${BS}ofwboot.elf" + [ -n "$bsd" ] && OS="$(($OS + 1))" && local BSD="ybsd BSD b $ofboot ,${BS}${BS}ofwboot/$bsd" [ -n "$macos" ] && OS="$(($OS + 1))" && local MAC="macos MacOS m $macos ,${BS}${BS}:tbxi" [ -n "$macosx" ] && OS="$(($OS + 1))" && local MX="macosx MacOSX x $macosx ,${OSXBOOT}" [ -n "$darwin" ] && OS="$(($OS + 1))" && local DW="darwin Darwin d $darwin ,${BS}${BS}:tbxi" @@ -1196,7 +1246,7 @@ mkoffs() [ "$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!" @@ -1278,7 +1328,7 @@ cleanup() ## 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 @@ -1289,19 +1339,26 @@ if [ $# != 0 ] ; then ;; --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 @@ -1314,6 +1371,18 @@ if [ $# != 0 ] ; then 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" @@ -1325,6 +1394,7 @@ if [ $# != 0 ] ; then if [ -n "$2" ] ; then install="$2" ARGBF=1 + ARGS="$ARGS $1 $2" shift 2 else echo 1>&2 "$PRG: option requires an argument $1" @@ -1337,6 +1407,7 @@ if [ $# != 0 ] ; then CONF="$2" bootconf="$2" ERR=" Error in $CONF:" + ARGS="$ARGS $1 $2" shift 2 else echo 1>&2 "$PRG: option requires an argument $1" @@ -1348,6 +1419,7 @@ if [ $# != 0 ] ; then if [ -n "$2" ] ; then magicboot="$2" ARGWP=1 + ARGS="$ARGS $1 $2" shift 2 else echo 1>&2 "$PRG: option requires an argument $1" @@ -1359,6 +1431,7 @@ if [ $# != 0 ] ; then if [ -n "$2" ] ; then fstype="$2" ARGFS=1 + ARGS="$ARGS $1 $2" shift 2 else echo 1>&2 "$PRG: option requires an argument $1" @@ -1369,32 +1442,39 @@ if [ $# != 0 ] ; then --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" @@ -1406,6 +1486,8 @@ if [ $# != 0 ] ; then 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" @@ -1417,6 +1499,8 @@ if [ $# != 0 ] ; then 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" @@ -1428,6 +1512,8 @@ if [ $# != 0 ] ; then 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" @@ -1439,6 +1525,8 @@ if [ $# != 0 ] ; then 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" @@ -1450,6 +1538,8 @@ if [ $# != 0 ] ; then 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" @@ -1529,6 +1619,20 @@ fi [ $(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)" @@ -1552,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