###############################################################################
##
## 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
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.7
+VERSION=1.0.8
CHROOT=/
## $CONFIG is relative to $CHROOT
CONFIG=etc/yaboot.conf
## 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) 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."
}
if [ $# != 0 ] ; then
while true ; do
- case "$1" in
+ case "$1" in
-V|--version)
version
exit 0
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"
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
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.
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
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
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)"
;;
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
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
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
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.