X-Git-Url: http://git.ozlabs.org/?p=yaboot.git;a=blobdiff_plain;f=ybin%2Fyabootconfig;h=04a513c1876394bd4cb625e70dfec2e287a6e22d;hp=fae93b3e2a8619f2f60caef6528915bb6c7ceb15;hb=3307377768008d05c9fdb6506bcee18d030da66b;hpb=83e9d6ed91d623822919c0c8d8a1496b4c5b6f4c diff --git a/ybin/yabootconfig b/ybin/yabootconfig index fae93b3..04a513c 100755 --- a/ybin/yabootconfig +++ b/ybin/yabootconfig @@ -3,7 +3,7 @@ ############################################################################### ## ## yabootconfig generates a simple /etc/yaboot.conf -## Copyright (C) 2001, 2002 Ethan Benson +## Copyright (C) 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,7 +27,7 @@ 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##*/}" -VERSION=1.0.6 +VERSION=1.0.8 CHROOT=/ ## $CONFIG is relative to $CHROOT CONFIG=etc/yaboot.conf @@ -37,6 +37,13 @@ DEBUG=0 SIGINT="$PRG: Interrupt caught ... exiting" 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 temporary file trap "cleanup" 0 trap "exit 129" 1 @@ -62,7 +69,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() @@ -78,7 +85,7 @@ echo \ "$PRG $VERSION Written by Ethan Benson -Copyright (C) 2001, 2002 Ethan Benson +Copyright (C) 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." } @@ -263,7 +270,7 @@ cleanup() if [ $# != 0 ] ; then while true ; do - case "$1" in + case "$1" in -V|--version) version exit 0 @@ -383,6 +390,21 @@ if [ -z "$ROOT" ] ; then fi fi +## dereference label or uuid if necessary +case "$ROOT" in + LABEL=*|UUID=*) + if ! (command -v findfs > /dev/null 2>&1) ; then + echo 1>&2 "$PRG: Unable to locate findfs, aborting..." + exit 1 + fi + ROOT="$(findfs "$ROOT")" + if [ -z "$ROOT" -o $? != 0 ] ; then + echo 1>&2 "$PRG: Could not determine root partition, aborting..." + exit 1 + fi + ;; +esac + ## make sure root device exists if [ ! -e "$ROOT" ] ; then echo 1>&2 "$PRG: $ROOT: No such file or directory" @@ -430,24 +452,52 @@ if [ "$QUIET" = 0 ] ; then confirm || exit 2 fi +READLINKKV=`readlink /usr/src/linux` ## find the kernel in the usual places and (if not --quiet) ask the ## user if we cannot find one. -if [ -f "${CHROOT}vmlinux" ] ; then - KERNEL="${CHROOT}vmlinux" -elif [ -f "${CHROOT}boot/vmlinux" ] ; then - KERNEL="${CHROOT}boot/vmlinux" -elif [ -f "${CHROOT}boot/vmlinux-`uname -r`" ] ; then - KERNEL="${CHROOT}boot/vmlinux-`uname -r`" -elif [ -f "${CHROOT}vmlinux-`uname -r`" ] ; then - KERNEL="${CHROOT}vmlinux-`uname -r`" -elif [ "$QUIET" = 0 ] ; then - echo 1>&2 "$PRG: Cannot find a kernel, please locate one" +for k in "vmlinux" "vmlinux-`uname -r`" "vmlinux-`uname -r`" "$READLINKKV" ; do + if [ -f "${CHROOT}${k}" ] ; then + KERNEL="${CHROOT}${k}" + break; + elif [ -f "${CHROOT}boot/${k}" ] ; then + KERNEL="${CHROOT}boot/${k}" + break; + fi +done + +for i in "initrd" "initrd-`uname -r`" "`echo $READLINKKV | cut -f1 -d- --complement`" ; do + for b in "" "boot/" ; do + if [ -f "${CHROOT}${b}${i}" ] ; then + INITRD="${CHROOT}${b}${i}" + elif [ -f "${CHROOT}${b}${i}.img" ] ; then + INITRD="${CHROOT}${b}${i}.img" + elif [ -f "${CHROOT}${b}${i}.gz" ] ; then + INITRD="${CHROOT}${b}${i}.gz" + fi + done +done + +if [ ! -f "$KERNEL" ] && [ ${QUIET} == 0 ] ; then + echo 1>&2 "$PRG: Cannot find a kernel, please provide one" while true ; do - $PRINTF 1>&2 "Enter path to a kernel image: " + if [ "$CHROOT" == "/" ] ; then + $PRINTF 1>&2 "Enter path to a kernel image: " + else + $PRINTF 1>&2 "Enter path to a kernel image (not including chroot): " + fi read KERN + + ### Remove leading / + case "${KERN}" in + /*) KERN=${CHROOT}${KERN:1} ;; + *) KERN=${CHROOT}${KERN} ;; + esac + if [ -f "$KERN" ] ; then KERNEL="$KERN" break + elif [ ${KERN} == ${CHROOT} ] ; then + echo 1>&2 "$PRG: You must provide a valid kernel" elif [ ! -e "$KERN" ] ; then echo 1>&2 "$PRG: $KERN: No such file or directory" elif [ -d "$KERN" ] ; then @@ -456,12 +506,42 @@ elif [ "$QUIET" = 0 ] ; then echo 1>&2 "$PRG: $KERN: Is not a regular file" fi done -else + while true ; do + if [ "$CHROOT" == "/" ] ; then + $PRINTF 1>&2 "Enter path to an initrd image (hit Enter for none): " + else + $PRINTF 1>&2 "Enter path to an initrd image (hit Enter for none, don't include the chroot): " + fi + read IRD + + if [ "$IRD" == "" ]; then + break + fi + + ### Remove leading / + case "${IRD}" in + /*) IRD=${CHROOT}${IRD:1} ;; + *) IRD=${CHROOT}${IRD} ;; + esac + + if [ -f "$IRD" ] ; then + INITRD="$IRD" + break + elif [ ! -e "$IRD" ] ; then + echo 1>&2 "$PRG: $IRD: No such file or directory" + elif [ -d "$IRD" ] ; then + echo 1>&2 "$PRG: $IRD: Is a directory" + else + echo 1>&2 "$PRG: $IRD: Is not a regular file" + fi + done +elif [ ! -f "$KERNEL" ] ; then echo 1>&2 "$PRG: Cannot find a kernel, aborting..." exit 1 fi debug "KERNEL=$KERNEL\n" +debug "INITRD=$INITRD\n" ## get partition number the kernel lives on, and the OF device= name ## of the whole disk. @@ -476,8 +556,27 @@ else KERNELDISK="${KERNDEV%%[0-9]*}" fi +if [ -n "$INITRD" ] ; then + ## get partition number the initrd lives on, and the OF device= name + ## of the whole disk. + IRDDEV="$(v=`df "$INITRD" 2> /dev/null | grep ^/dev/` ; echo ${v%%[ ]*})" + IRDDIR="$(v=`df "$INITRD" 2> /dev/null | grep ^/dev/` ; echo ${v##*[ ]})" + IRDLINKDEV="$(v=`df "${INITRD%/*}/" 2>/dev/null | grep ^/dev/` ; echo ${v%%[ ]*})" + IRDPARTITION="${KERNDEV##*[a-z]}" + + if ckdevfs "$IRDDEV" ; then + INITRDDISK="${IRDDEV%/*}/disc" + else + INITRDDISK="${IRDDEV%%[0-9]*}" + fi +fi + debug "KERNEL=$KERNEL\nKERNDEV=$KERNDEV\nKERNDIR=$KERNDIR\nLINKDEV=$LINKDEV\nPARTITION=$PARTITION\nKERNELDISK=$KERNELDISK\n" +if [ -n "$INITRD" ] ; then + debug "INITRD=$INITRD\nIRDDEV=$IRDDEV\nIRDDIR=$IRDDIR\nIRDLINKDEV=$IRDLINKDEV\nIRDPARTITION=$IRDPARTITION\nINITRDDISK=$INITRDDISK\n" +fi + ## sanity check for i in "$KERNDEV" "$KERNDIR" "$LINKDEV" "$PARTITION" "$KERNELDISK" ; do if [ -z "$i" ] ; then @@ -487,6 +586,17 @@ for i in "$KERNDEV" "$KERNDIR" "$LINKDEV" "$PARTITION" "$KERNELDISK" ; do fi done +if [ -n "$INITRD" ] ; then + ## sanity check + for i in "$IRDDEV" "$IRDDIR" "$IRDLINKDEV" "$IRDPARTITION" "$INITRDDISK" ; do + if [ -z "$i" ] ; then + echo 1>&2 "$PRG: Could not determine necessary information, aborting..." + echo 1>&2 "$PRG: Are you using chroot $PRG instead of $PRG --chroot ?" + exit 1 + fi + done +fi + ## check for cross device symlink if [ -L "$KERNEL" ] ; then if [ "$KERNDEV" != "$LINKDEV" ] ; then @@ -499,9 +609,29 @@ if [ -L "$KERNEL" ] ; then fi fi +if [ -n "$INITRD" ] ; then + ## initrd must be on same device as kernel. + if [ "$IRDDEV" != "$KERNDEV" -o "$IRDPARTITION" != "$IRDPARTITION" -o "$INITRDDISK" != "$KERNELDISK" ] ; then + echo 1>&2 "$PRG: Initrd image must be on same device as kernel image." + exit 1 + fi + + ## check for cross device symlink + if [ -L "$INITRD" ] ; then + if [ "$IRDDEV" != "$IRDLINKDEV" ] ; then + echo 1>&2 "$PRG: Warning: Cross device symlink $INITRD, using it's target instead" + INITRD="$(readlink -f "$INITRD" 2>/dev/null)" + if [ ! -f "$INITRD" ] ; then + echo 1>&2 "$PRG: Unable to canonicalize symlink's target. Do not create cross device symlinks." + exit 1 + fi + fi + fi +fi + ## only powermacs appear to need device= if (cat /proc/cpuinfo 2>/dev/null | grep -q pmac-generation 2> /dev/null) ; then - DEVICE="\ndevice=$(ofpath $KERNELDISK)" + DEVICE="\ndevice=$($OFPATH $KERNELDISK)" if [ $? != 0 ] ; then echo 1>&2 "$PRG: Unable to determine OpenFirmware device name to $KERNELDISK, aborting..." exit 1 @@ -531,6 +661,31 @@ case "$IMAGE" in ;; esac +if [ -n "$INITRD" ] ; then + ## if there is a separate /boot partition we must strip off the /boot + ## mountpoint or else yaboot will not find the kernel. + if [ "$IRDDIR" != "$CHROOT" ] ; then + INITRDIMG="${INITRD##*$IRDDIR}" + else + INITRDIMG="$INITRD" + fi + + ## fix chrooted path + if [ "$CHROOT" != / ] ; then + INITRDIMG="${INITRDIMG##*$CHROOT}" + fi + + ## fix relative path (caused by chroot path fix) + case "$INITRDIMG" in + /*) + true + ;; + *) + INITRDIMG="/${INITRDIMG}" + ;; + esac +fi + ## figure out if yaboot is installed in /usr/local or not if [ -f /usr/local/lib/yaboot/yaboot ] ; then INSTALL=/usr/local/lib/yaboot/yaboot @@ -551,7 +706,7 @@ if [ "$(v=`cat /proc/cpuinfo 2>/dev/null | grep pmac-generation` ; echo ${v##*:} echo 1>&2 "$PRG: yaboot is not installed correctly" exit 1 fi -fi +fi ## check for properly (read debian) packaged yaboot. if [ -d ${CHROOT}usr/share/doc/yaboot/examples ] ; then @@ -563,12 +718,26 @@ if [ -n "$KERNARGS" ] ; then APPEND="\tappend=\"${KERNARGS}\"\n" fi +## avoid user confusion when they boot an installer with video=ofonly +## (usually via a install-safe label) and then reboot and have the box +## not boot properly again. +if [ -z "$APPEND" ] ; then + if (grep -q '\' /proc/cmdline 2> /dev/null) ; then + APPEND="\tappend=\"video=ofonly\"\n" + fi +fi + +## generate initrd= lines +if [ -n "$INITRDIMG" ] ; then + INITRDIMGS="\tinitrd=$INITRDIMG\n\tinitrd-size=8192\n" +fi + ## generate global section of yaboot.conf GLOBAL="## yaboot.conf generated by $PRG $VERSION ## ## run: \"man yaboot.conf\" for details. Do not make changes until you have!! ${HEADER}## -## For a dual-boot menu, add one or more of: +## For a dual-boot menu, add one or more of: ## bsd=/dev/hdaX, macos=/dev/hdaY, macosx=/dev/hdaZ\n boot=${BOOT}${DEVICE:-} partition=$PARTITION @@ -580,7 +749,7 @@ install=${INSTALL}${OFBOOT:-}\n" IMAGES=" image=$IMAGE \tlabel=Linux -\tread-only\n${APPEND:-}" +\tread-only\n${APPEND:-}${INITRDIMGS:-}" ## safely create a tmp file then move it into place after we are sure ## it was written.