#!/bin/sh # $NetBSD: binstall.sh,v 1.18 2018/09/22 03:29:51 kre Exp $ # vecho () { # echo if VERBOSE on [ -n "$VERBOSE" ] && echo "$*" 1>&2 return 0 } Options () { echo "Options:" echo " -h - display this message" echo " -u - install sparc64 (UltraSPARC) boot block" echo " -U - install sparc boot block" echo " -b - second-stage boot program to install" echo " -f - path to device/file image for filesystem" echo " -m - Look for boot programs in (default: /usr/mdec)" echo " -i - Use the installboot program at " echo " (default: /usr/sbin/installboot)" echo " -v - verbose mode" echo " -t - test mode (implies -v)" } Usage () { echo "Usage: $0"' [options] <"net"|"ffs"> ' Options exit 1 } Help () { echo "This script copies the boot programs to one of several" echo "commonly used places." echo 'When installing an "ffs" boot program, this script also runs' echo "installboot(8) which installs the default proto bootblocks into" echo "the appropriate filesystem partition or filesystem image." Options exit 0 } Secure () { echo "This script has to be run when the kernel is in 'insecure' mode," echo "or when applying bootblocks to a file image (ala vnd)." echo "The best way is to run this script in single-user mode." exit 1 } PATH=/bin:/usr/bin:/sbin:/usr/sbin VERBOSE= : ${MDEC:=/usr/mdec} : ${INSTALLBOOT:=/usr/sbin/installboot} : ${BOOTPROG:=boot} : ${OFWBOOTBLK:=ofwboot} [ "$( sysctl -n machdep.cpu_arch )" = 9 ] && ULTRASPARC=true || ULTRASPARC=false while getopts b:hf:i:m:tUuv a do case "$a" in h) Help;; u) ULTRASPARC=true;; U) ULTRASPARC=false;; b) BOOTPROG=$OPTARG; OFWBOOTBLK=$OPTARG;; f) DEV=$OPTARG;; m) MDEC=$OPTARG;; i) INSTALLBOOT=$OPTARG;; t) TEST=1; VERBOSE=-v;; v) VERBOSE=-v;; \?) Usage;; esac done shift $(( $OPTIND - 1 )) if [ "$( sysctl -n kern.securelevel )" -gt 0 ] && ! [ -f "$DEV" ]; then Secure fi DOIT=${TEST:+echo "=>"} if [ $# != 2 ]; then Usage fi WHAT=$1 DEST=$2 if ! [ -d "$DEST" ]; then echo "$DEST: not a directory" Usage fi if $ULTRASPARC then machine=sparc64 targ=ofwboot stage2="" netboot=ofwboot BOOTPROG=$OFWBOOTBLK BOOTXX=${MDEC}/bootblk else machine=sparc targ=boot stage2=${targ} netboot=boot.net BOOTXX=${MDEC}/bootxx fi case $WHAT in "ffs") if [ -z "$DEV" ]; then # Lookup device mounted on DEST DEV=$( mount | while read line; do set -- $line vecho "Inspecting \"$line\"" if [ "$2" = "on" ] && [ "$3" = "$DEST" ]; then [ -b "$1" ] || continue case "$1" in (*/*) RAW="${1%/*}/r${1##*/}";; (*) RAW="r$1";; esac [ -c "$RAW" ] || continue echo -n "$RAW" break; fi done ) if [ -z "$DEV" ]; then echo "Cannot find \"$DEST\" in mount table" exit 1 fi fi vecho "Boot device: $DEV" vecho "Primary boot program: $BOOTXX" vecho "Secondary boot program: $DEST/$targ" $DOIT cp -p -f "${MDEC}/${BOOTPROG}" "$DEST/$targ" sync; sync; sync vecho "${INSTALLBOOT} ${VERBOSE} -m $machine $DEV $BOOTXX $stage2" $DOIT "${INSTALLBOOT}" ${VERBOSE} -m "$machine" \ "$DEV" "$BOOTXX" "$stage2" ;; "net") vecho "Network boot program: $DEST/$boot.${machine}.netbsd" $DOIT cp -p -f "${MDEC}/$netboot" "$DEST/$boot.${machine}.netbsd" ;; *) echo "$WHAT: not recognised" exit 1 ;; esac exit $?