76285e652b
VERSION file. * Set the EDITOR variable in install.sub, so it will be set in both upgrade & install. * Make the checks on the presence of installation sets on the local disks on upgrade more precise. * Remove more&less from the list of standard binaries (I need more space!) * When building an fstab from the users' fstab, drop lines starting with a '#' and lines with an fstype that is not supported on the miniroot.
387 lines
9.2 KiB
Bash
387 lines
9.2 KiB
Bash
#!/bin/sh
|
|
# $NetBSD: upgrade.sh,v 1.5 1996/05/30 06:57:17 leo Exp $
|
|
#
|
|
# Copyright (c) 1996 The NetBSD Foundation, Inc.
|
|
# All rights reserved.
|
|
#
|
|
# This code is derived from software contributed to The NetBSD Foundation
|
|
# by Jason R. Thorpe.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
# 3. All advertising materials mentioning features or use of this software
|
|
# must display the following acknowledgement:
|
|
# This product includes software developed by the NetBSD
|
|
# Foundation, Inc. and its contributors.
|
|
# 4. Neither the name of The NetBSD Foundation nor the names of its
|
|
# contributors may be used to endorse or promote products derived
|
|
# from this software without specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
|
|
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
|
|
# NetBSD installation script.
|
|
# In a perfect world, this would be a nice C program, with a reasonable
|
|
# user interface.
|
|
|
|
ROOTDISK="" # filled in below
|
|
RELDIR="" # Path searched for sets by install_sets
|
|
export RELDIR # on the local filesystems
|
|
|
|
trap "umount -a > /dev/null 2>&1" 0
|
|
|
|
MODE="upgrade"
|
|
|
|
# include machine-dependent functions
|
|
# The following functions must be provided:
|
|
# md_copy_kernel() - copy a kernel to the installed disk
|
|
# md_get_diskdevs() - return available disk devices
|
|
# md_get_cddevs() - return available CD-ROM devices
|
|
# md_get_ifdevs() - return available network interfaces
|
|
# md_get_partition_range() - return range of valid partition letters
|
|
# md_installboot() - install boot-blocks on disk
|
|
# md_checkfordisklabel() - check for valid disklabel
|
|
# md_labeldisk() - put label on a disk
|
|
# md_welcome_banner() - display friendly message
|
|
# md_not_going_to_install() - display friendly message
|
|
# md_congrats() - display friendly message
|
|
|
|
# include machine dependent subroutines
|
|
. install.md
|
|
|
|
# include common subroutines
|
|
. install.sub
|
|
|
|
get_reldir() {
|
|
while : ; do
|
|
echo -n "Enter the pathname where the sets are stored [$RELDIR] "
|
|
getresp "$RELDIR"
|
|
RELDIR=$resp
|
|
|
|
# Allow break-out with empty response
|
|
if [ -z "$RELDIR" ]; then
|
|
echo -n "Are you sure you don't want to set the pathname? [n] "
|
|
getresp "n"
|
|
case "$resp" in
|
|
y*|Y*)
|
|
break
|
|
;;
|
|
*)
|
|
continue
|
|
;;
|
|
esac
|
|
fi
|
|
if dir_has_sets "/mnt/$RELDIR" $UPGRSETS
|
|
then
|
|
break
|
|
else
|
|
cat << \__get_reldir_1
|
|
The directory $RELDIR does not exist, or does not hold any of the
|
|
upgrade sets."
|
|
__get_reldir_1
|
|
echo -n "Re-enter pathname? [y] "
|
|
getresp "y"
|
|
case "$resp" in
|
|
y*|Y*)
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Good {morning,afternoon,evening,night}.
|
|
md_welcome_banner
|
|
echo -n "Proceed with upgrade? [n] "
|
|
getresp "n"
|
|
case "$resp" in
|
|
y*|Y*)
|
|
echo "Cool! Let's get to it..."
|
|
;;
|
|
*)
|
|
md_not_going_to_install
|
|
exit
|
|
;;
|
|
esac
|
|
|
|
# Deal with terminal issues
|
|
md_set_term
|
|
|
|
# XXX Work around vnode aliasing bug (thanks for the tip, Chris...)
|
|
ls -l /dev > /dev/null 2>&1
|
|
|
|
# We don't like it, but it sure makes a few things a lot easier.
|
|
do_mfs_mount "/tmp" "2048"
|
|
|
|
while [ "X${ROOTDISK}" = "X" ]; do
|
|
getrootdisk
|
|
done
|
|
|
|
# Make sure there's a disklabel there. If there isn't, puke after
|
|
# disklabel prints the error message.
|
|
md_checkfordisklabel ${ROOTDISK}
|
|
case $rval in
|
|
1)
|
|
cat << \__disklabel_not_present_1
|
|
|
|
FATAL ERROR: There is no disklabel present on the root disk! You must
|
|
label the disk with SYS_INST before continuing.
|
|
|
|
__disklabel_not_present_1
|
|
exit
|
|
;;
|
|
|
|
2)
|
|
cat << \__disklabel_corrupted_1
|
|
|
|
FATAL ERROR: The disklabel on the root disk is corrupted! You must
|
|
re-label the disk with SYS_INST before continuing.
|
|
|
|
__disklabel_corrupted_1
|
|
exit
|
|
;;
|
|
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
# Assume partition 'a' of $ROOTDISK is for the root filesystem. Confirm
|
|
# this with the user. Check and mount the root filesystem.
|
|
resp="" # force one iteration
|
|
while [ "X${resp}" = "X" ]; do
|
|
echo -n "Root filesystem? [${ROOTDISK}a] "
|
|
getresp "${ROOTDISK}a"
|
|
_root_filesystem="/dev/`basename $resp`"
|
|
if [ ! -b ${_root_filesystem} ]; then
|
|
echo "Sorry, ${resp} is not a block device."
|
|
resp="" # force loop to repeat
|
|
fi
|
|
done
|
|
|
|
echo "Checking root filesystem..."
|
|
if ! fsck -pf ${_root_filesystem}; then
|
|
echo "ERROR: can't check root filesystem!"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Mounting root filesystem..."
|
|
if ! mount -o ro ${_root_filesystem} /mnt; then
|
|
echo "ERROR: can't mount root filesystem!"
|
|
exit 1
|
|
fi
|
|
|
|
# Grab the fstab so we can munge it for our own use.
|
|
if [ ! -f /mnt/etc/fstab ]; then
|
|
echo "ERROR: no /etc/fstab!"
|
|
exit 1
|
|
fi
|
|
cp /mnt/etc/fstab /tmp/fstab
|
|
|
|
# Grab the hosts table so we can use it.
|
|
if [ ! -f /mnt/etc/hosts ]; then
|
|
echo "ERROR: no /etc/hosts!"
|
|
exit 1
|
|
fi
|
|
cp /mnt/etc/hosts /tmp/hosts
|
|
|
|
# Start up the network in same/similar configuration as the installed system
|
|
# uses.
|
|
cat << \__network_config_1
|
|
|
|
The upgrade program would now like to enable the network. It will use the
|
|
configuration already stored on the root filesystem. This is required
|
|
if you wish to use the network installation capabilities of this program.
|
|
|
|
__network_config_1
|
|
echo -n "Enable network? [y] "
|
|
getresp "y"
|
|
case "$resp" in
|
|
y*|Y*)
|
|
if ! enable_network; then
|
|
echo "ERROR: can't enable network!"
|
|
exit 1
|
|
fi
|
|
|
|
cat << \__network_config_2
|
|
|
|
You will now be given the opportunity to escape to the command shell to
|
|
do any additional network configuration you may need. This may include
|
|
adding additional routes, if needed. In addition, you might take this
|
|
opportunity to redo the default route in the event that it failed above.
|
|
|
|
__network_config_2
|
|
echo -n "Escape to shell? [n] "
|
|
getresp "n"
|
|
case "$resp" in
|
|
y*|Y*)
|
|
echo "Type 'exit' to return to upgrade."
|
|
sh
|
|
;;
|
|
|
|
*)
|
|
;;
|
|
esac
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
# Now that the network has been configured, it is safe to configure the
|
|
# fstab. We remove all but ufs/ffs/nfs.
|
|
(
|
|
> /tmp/fstab.new
|
|
while read _dev _mp _fstype _rest ; do
|
|
if [ "X${_fstype}" = X"ufs" -o \
|
|
"X${_fstype}" = X"ffs" -o \
|
|
"X${_fstype}" = X"nfs" ]; then
|
|
if [ "X${_fstype}" = X"ufs" ]; then
|
|
# Convert ufs to ffs.
|
|
_fstype=ffs
|
|
fi
|
|
echo "$_dev $_mp $_fstype $_rest" >> /tmp/fstab.new
|
|
fi
|
|
done
|
|
) < /tmp/fstab
|
|
|
|
if [ ! -f /tmp/fstab.new ]; then
|
|
echo "ERROR: strange fstab!"
|
|
exit 1
|
|
fi
|
|
|
|
rm -f /tmp/fstab.new
|
|
|
|
echo "The fstab is configured as follows:"
|
|
echo ""
|
|
cat /tmp/fstab
|
|
cat << \__fstab_config_1
|
|
|
|
You may wish to edit the fstab. For example, you may need to resolve
|
|
dependencies in the order which the filesystems are mounted. Note that
|
|
this fstab is only for installation purposes, and will not be copied into
|
|
the root filesystem.
|
|
|
|
__fstab_config_1
|
|
echo -n "Edit the fstab? [n] "
|
|
getresp "n"
|
|
case "$resp" in
|
|
y*|Y*)
|
|
${EDITOR} /tmp/fstab
|
|
;;
|
|
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
echo ""
|
|
munge_fstab /tmp/fstab /tmp/fstab.shadow
|
|
|
|
if ! umount /mnt; then
|
|
echo "ERROR: can't unmount previously mounted root!"
|
|
exit 1
|
|
fi
|
|
|
|
# Check all of the filesystems.
|
|
check_fs /tmp/fstab.shadow
|
|
|
|
# Mount filesystems.
|
|
mount_fs /tmp/fstab.shadow
|
|
|
|
|
|
echo -n "Are the upgrade sets on one of your normally mounted filesystems? [y] "
|
|
getresp "y"
|
|
case "$resp" in
|
|
y*|Y*)
|
|
get_reldir
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
# Install sets.
|
|
install_sets $UPGRSETS
|
|
|
|
# Get timezone info
|
|
get_timezone
|
|
|
|
# Fix up the fstab.
|
|
echo -n "Converting ufs to ffs in /etc/fstab..."
|
|
(
|
|
> /tmp/fstab
|
|
while read _dev _mp _fstype _rest ; do
|
|
if [ "X${_fstype}" = X"ufs" -o \
|
|
"X${_fstype}" = X"ffs" -o \
|
|
"X${_fstype}" = X"nfs" ]; then
|
|
if [ "X${_fstype}" = X"ufs" ]; then
|
|
# Convert ufs to ffs.
|
|
_fstype=ffs
|
|
fi
|
|
echo "$_dev $_mp $_fstype $_rest" >> /tmp/fstab
|
|
fi
|
|
done
|
|
) < /mnt/etc/fstab
|
|
echo "done."
|
|
echo -n "Would you like to edit the resulting fstab? [y] "
|
|
getresp "y"
|
|
case "$resp" in
|
|
y*|Y*)
|
|
${EDITOR} /tmp/fstab
|
|
;;
|
|
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
# Copy in configuration information and make devices in target root.
|
|
(
|
|
cd /tmp
|
|
for file in fstab; do
|
|
if [ -f $file ]; then
|
|
echo -n "Copying $file..."
|
|
cp $file /mnt/etc/$file
|
|
echo "done."
|
|
fi
|
|
done
|
|
|
|
echo -n "Installing timezone link..."
|
|
rm -f /mnt/etc/localtime
|
|
ln -s /usr/share/zoneinfo/$TZ /mnt/etc/localtime
|
|
echo "done."
|
|
|
|
echo -n "Making devices..."
|
|
pid=`twiddle`
|
|
cd /mnt/dev
|
|
sh MAKEDEV all
|
|
kill $pid
|
|
echo "done."
|
|
|
|
md_copy_kernel
|
|
|
|
md_installboot ${ROOTDISK}
|
|
)
|
|
|
|
unmount_fs /tmp/fstab.shadow
|
|
|
|
# Pat on the back.
|
|
md_congrats
|
|
|
|
# ALL DONE!
|
|
exit 0
|