MI install and upgrade scripts.
This commit is contained in:
parent
61a0733f9d
commit
6f94427590
|
@ -0,0 +1,424 @@
|
|||
#!/bin/sh
|
||||
# $NetBSD: install.sh,v 1.1 1996/01/06 22:45:13 pk Exp $
|
||||
#
|
||||
# Copyright (c) 1995 Jason R. Thorpe.
|
||||
# All rights reserved.
|
||||
#
|
||||
# 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 for the NetBSD Project
|
||||
# by Jason R. Thorpe.
|
||||
# 4. The name of the author may not be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
||||
|
||||
FILESYSTEMS="/tmp/filesystems" # used thoughout
|
||||
FQDN="" # domain name
|
||||
|
||||
trap "umount /tmp > /dev/null 2>&1" 0
|
||||
|
||||
MODE="install"
|
||||
|
||||
# include machine-dependent functions
|
||||
# The following functions must be provided:
|
||||
# md_get_diskdevs() - return available disk devices
|
||||
# md_get_cddevs() - return available CD-ROM devices
|
||||
# md_get_ifdevs() - return available network interfaces
|
||||
# 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
|
||||
. install.md
|
||||
|
||||
# include common subroutines
|
||||
. install.sub
|
||||
|
||||
|
||||
# Good {morning,afternoon,evening,night}.
|
||||
md_welcome_banner
|
||||
echo -n "Proceed with installation? [n] "
|
||||
getresp "n"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
echo "Cool! Let's get to it..."
|
||||
;;
|
||||
*)
|
||||
md_not_going_to_install
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
|
||||
# XXX Work around vnode aliasing bug (thanks for the tip, Chris...)
|
||||
ls -l /dev > /dev/null 2>&1
|
||||
|
||||
# Deal with terminal issues
|
||||
md_set_term
|
||||
|
||||
# Get timezone info
|
||||
get_timezone
|
||||
|
||||
# We don't like it, but it sure makes a few things a lot easier.
|
||||
do_mfs_mount "/tmp" "2048"
|
||||
|
||||
# Install the shadowed disktab file; lets us write to it for temporary
|
||||
# purposes without mounting the miniroot read-write.
|
||||
cp /etc/disktab.shadow /tmp/disktab.shadow
|
||||
|
||||
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 "$resp" 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
|
||||
|
||||
# Give the user the opportinuty to edit the root disklabel.
|
||||
cat << \__disklabel_notice_1
|
||||
|
||||
You have already placed a disklabel onto the target root disk.
|
||||
However, due to the limitations of the standalone program used
|
||||
you may want to edit that label to change partition type information.
|
||||
You will be given the opporunity to do that now. Note that you may
|
||||
not change the size or location of any presently open partition.
|
||||
|
||||
__disklabel_notice_1
|
||||
echo -n "Do you wish to edit the root disklabel? [y] "
|
||||
getresp "y"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
md_prep_disklabel
|
||||
disklabel -W ${ROOTDISK}
|
||||
disklabel -e ${ROOTDISK}
|
||||
;;
|
||||
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
cat << \__disklabel_notice_2
|
||||
|
||||
You will now be given the opportunity to place disklabels on any additional
|
||||
disks on your system.
|
||||
__disklabel_notice_2
|
||||
|
||||
_DKDEVS=`rmel ${ROOTDISK} ${_DKDEVS}`
|
||||
resp="X" # force at least one iteration
|
||||
while [ "X$resp" != X"done" ]; do
|
||||
labelmoredisks
|
||||
done
|
||||
|
||||
# Assume partition 'a' of $ROOTDISK is for the root filesystem. Loop and
|
||||
# get the rest.
|
||||
# XXX ASSUMES THAT THE USER DOESN'T PROVIDE BOGUS INPUT.
|
||||
cat << \__get_filesystems_1
|
||||
|
||||
You will now have the opportunity to enter filesystem information.
|
||||
You will be prompted for device name and mount point (full path,
|
||||
including the prepending '/' character).
|
||||
|
||||
Note that these do not have to be in any particular order. You will
|
||||
be given the opportunity to edit the resulting 'fstab' file before
|
||||
any of the filesystems are mounted. At that time you will be able
|
||||
to resolve any filesystem order dependencies.
|
||||
|
||||
__get_filesystems_1
|
||||
|
||||
echo "The following will be used for the root filesystem:"
|
||||
echo " ${ROOTDISK}a /"
|
||||
|
||||
echo "${ROOTDISK}a /" > ${FILESYSTEMS}
|
||||
|
||||
resp="X" # force at least one iteration
|
||||
while [ "X$resp" != X"done" ]; do
|
||||
echo ""
|
||||
echo -n "Device name? [done] "
|
||||
getresp "done"
|
||||
case "$resp" in
|
||||
done)
|
||||
;;
|
||||
|
||||
*)
|
||||
_device_name=`basename $resp`
|
||||
|
||||
# force at least one iteration
|
||||
_first_char="X"
|
||||
while [ "X${_first_char}" != X"/" ]; do
|
||||
echo -n "Mount point? "
|
||||
getresp ""
|
||||
_mount_point=$resp
|
||||
if [ "X${_mount_point}" = X"/" ]; then
|
||||
# Invalid response; no multiple roots
|
||||
_first_char="X"
|
||||
else
|
||||
_first_char=`echo ${_mount_point} | \
|
||||
cut -c 1`
|
||||
fi
|
||||
done
|
||||
echo "${_device_name} ${_mount_point}" >> \
|
||||
${FILESYSTEMS}
|
||||
resp="X" # force loop to repeat
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "You have configured the following devices and mount points:"
|
||||
echo ""
|
||||
cat ${FILESYSTEMS}
|
||||
echo ""
|
||||
echo "Filesystems will now be created on these devices. If you made any"
|
||||
echo -n "mistakes, you may edit this now. Edit? [n] "
|
||||
getresp "n"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
vi ${FILESYSTEMS}
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
# Loop though the file, place filesystems on each device.
|
||||
echo "Creating filesystems..."
|
||||
(
|
||||
while read line; do
|
||||
_device_name=`echo $line | awk '{print $1}'`
|
||||
newfs /dev/r${_device_name}
|
||||
echo ""
|
||||
done
|
||||
) < ${FILESYSTEMS}
|
||||
|
||||
# Get network configuration information, and store it for placement in the
|
||||
# root filesystem later.
|
||||
cat << \__network_config_1
|
||||
You will now be given the opportunity to configure the network. This will
|
||||
be useful if you need to transfer the installation sets via FTP or NFS.
|
||||
Even if you choose not to transfer installation sets that way, this
|
||||
information will be preserved and copied into the new root filesystem.
|
||||
|
||||
Note, enter all symbolic host names WITHOUT the domain name appended.
|
||||
I.e. use 'hostname' NOT 'hostname.domain.name'.
|
||||
|
||||
__network_config_1
|
||||
echo -n "Configure the network? [y] "
|
||||
getresp "y"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
echo -n "Enter system hostname: "
|
||||
resp="" # force at least one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
getresp ""
|
||||
done
|
||||
hostname $resp
|
||||
echo $resp > /tmp/myname
|
||||
|
||||
echo -n "Enter DNS domain name: "
|
||||
resp="" # force at least one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
getresp ""
|
||||
done
|
||||
FQDN=$resp
|
||||
|
||||
configurenetwork
|
||||
|
||||
echo -n "Enter IP address of default route: [none] "
|
||||
getresp "none"
|
||||
if [ "X${resp}" != X"none" ]; then
|
||||
route delete default > /dev/null 2>&1
|
||||
if route add default $resp > /dev/null ; then
|
||||
echo $resp > /tmp/mygate
|
||||
fi
|
||||
fi
|
||||
|
||||
echo -n "Enter IP address of primary nameserver: [none] "
|
||||
getresp "none"
|
||||
if [ "X${resp}" != X"none" ]; then
|
||||
echo "domain $FQDN" > /tmp/resolv.conf
|
||||
echo "nameserver $resp" >> /tmp/resolv.conf
|
||||
echo "search $FQDN" >> /tmp/resolv.conf
|
||||
|
||||
echo -n "Would you like to use the nameserver now? [y] "
|
||||
getresp "y"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
cp /tmp/resolv.conf \
|
||||
/tmp/resolv.conf.shadow
|
||||
;;
|
||||
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "The host table is as follows:"
|
||||
echo ""
|
||||
cat /tmp/hosts
|
||||
echo ""
|
||||
echo "You may want to edit the host table in the event that"
|
||||
echo "you need to mount an NFS server."
|
||||
echo -n "Would you like to edit the host table? [n] "
|
||||
getresp "n"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
vi /tmp/hosts
|
||||
;;
|
||||
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
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.
|
||||
If you do change the default route, and wish for that change to carry over
|
||||
to the installed system, execute the following command at the shell
|
||||
prompt:
|
||||
|
||||
echo <ip_address_of_gateway> > /tmp/mygate
|
||||
|
||||
where <ip_address_of_gateway> is the IP address of the default router.
|
||||
|
||||
__network_config_2
|
||||
echo -n "Escape to shell? [n] "
|
||||
getresp "n"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
echo "Type 'exit' to return to install."
|
||||
sh
|
||||
;;
|
||||
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
# Now that the network has been configured, it is safe to configure the
|
||||
# fstab.
|
||||
awk '{
|
||||
if ($2 == "/")
|
||||
printf("/dev/%s %s ffs rw 1 1\n", $1, $2)
|
||||
else
|
||||
printf("/dev/%s %s ffs rw 1 2\n", $1, $2)
|
||||
}' < ${FILESYSTEMS} > /tmp/fstab
|
||||
|
||||
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. You may
|
||||
also wish to take this opportunity to place NFS mounts in the fstab.
|
||||
This would be especially useful if you plan to keep '/usr' on an NFS
|
||||
server.
|
||||
|
||||
__fstab_config_1
|
||||
echo -n "Edit the fstab? [n] "
|
||||
getresp "n"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
vi /tmp/fstab
|
||||
;;
|
||||
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
echo ""
|
||||
munge_fstab /tmp/fstab /tmp/fstab.shadow
|
||||
mount_fs /tmp/fstab.shadow
|
||||
|
||||
install_sets $ALLSETS
|
||||
|
||||
# Copy in configuration information and make devices in target root.
|
||||
(
|
||||
cd /tmp
|
||||
for file in fstab hostname.* hosts myname mygate resolv.conf; 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."
|
||||
|
||||
echo -n "Copying kernel..."
|
||||
cp -p /netbsd /mnt/netbsd
|
||||
echo "done."
|
||||
|
||||
md_installboot ${ROOTDISK}
|
||||
)
|
||||
|
||||
unmount_fs /tmp/fstab.shadow
|
||||
|
||||
# Pat on the back.
|
||||
md_congrats
|
||||
|
||||
# ALL DONE!
|
||||
exit 0
|
|
@ -0,0 +1,998 @@
|
|||
#!/bin/sh
|
||||
# $NetBSD: install.sub,v 1.1 1996/01/06 22:45:13 pk Exp $
|
||||
#
|
||||
# Copyright (c) 1995 Jason R. Thorpe.
|
||||
# All rights reserved.
|
||||
#
|
||||
# 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 for the NetBSD Project
|
||||
# by Jason R. Thorpe.
|
||||
# 4. The name of the author may not be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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/upgrade script - common subroutines.
|
||||
|
||||
VERSION=1.1A
|
||||
export VERSION # XXX needed in subshell
|
||||
ROOTDISK="" # filled in below
|
||||
|
||||
ALLSETS="base comp etc games man misc text" # default install sets
|
||||
UPGRSETS="base comp games man misc text" # default upgrade sets
|
||||
|
||||
getresp() {
|
||||
read resp
|
||||
if [ "X$resp" = "X" ]; then
|
||||
resp=$1
|
||||
fi
|
||||
}
|
||||
|
||||
isin() {
|
||||
# test the first argument against the remaining ones, return succes on a match
|
||||
_a=$1; shift
|
||||
while [ $# != 0 ]; do
|
||||
if [ "$_a" = "$1" ]; then return 0; fi
|
||||
shift
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
rmel() {
|
||||
# remove first argument from list formed by the remaining arguments
|
||||
_a=$1; shift
|
||||
while [ $# != 0 ]; do
|
||||
if [ "$_a" != "$1" ]; then
|
||||
echo "$1";
|
||||
fi
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
twiddle() {
|
||||
# spin the propeller so we don't get bored
|
||||
while : ; do
|
||||
sleep 1; echo -n "/";
|
||||
sleep 1; echo -n "-";
|
||||
sleep 1; echo -n "\\";
|
||||
sleep 1; echo -n "|";
|
||||
done > /dev/tty & echo $!
|
||||
}
|
||||
|
||||
. install.md
|
||||
|
||||
do_mfs_mount() {
|
||||
# $1 is the mount point
|
||||
# $2 is the size in DEV_BIZE blocks
|
||||
|
||||
umount $1 > /dev/null 2>&1
|
||||
if ! mount_mfs -s $2 swap $1 ; then
|
||||
cat << \__mfs_failed_1
|
||||
|
||||
FATAL ERROR: Can't mount the memory filesystem.
|
||||
|
||||
__mfs_failed_1
|
||||
exit
|
||||
fi
|
||||
|
||||
# Bleh. Give mount_mfs a chance to DTRT.
|
||||
sleep 2
|
||||
}
|
||||
|
||||
getrootdisk() {
|
||||
cat << \__getrootdisk_1
|
||||
|
||||
The installation program needs to know which disk to consider
|
||||
the root disk. Note the unit number may be different than
|
||||
the unit number you used in the standalone installation
|
||||
program.
|
||||
|
||||
Available disks are:
|
||||
|
||||
__getrootdisk_1
|
||||
_DKDEVS=`md_get_diskdevs`
|
||||
echo "$_DKDEVS"
|
||||
echo ""
|
||||
echo -n "Which disk is the root disk? "
|
||||
getresp ""
|
||||
if isin $resp $_DKDEVS ; then
|
||||
ROOTDISK="$resp"
|
||||
else
|
||||
echo ""
|
||||
echo "The disk $resp does not exist."
|
||||
ROOTDISK=""
|
||||
fi
|
||||
}
|
||||
|
||||
labelmoredisks() {
|
||||
cat << \__labelmoredisks_1
|
||||
|
||||
You may label the following disks:
|
||||
|
||||
__labelmoredisks_1
|
||||
echo "$_DKDEVS"
|
||||
echo ""
|
||||
echo -n "Label which disk? [done] "
|
||||
getresp "done"
|
||||
case "$resp" in
|
||||
done)
|
||||
;;
|
||||
|
||||
*)
|
||||
if echo "$_DKDEVS" | grep "^$resp" > /dev/null ; then
|
||||
md_labeldisk $resp
|
||||
else
|
||||
echo ""
|
||||
echo "The disk $resp does not exist."
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
addhostent() {
|
||||
# $1 - IP address
|
||||
# $2 - symbolic name
|
||||
|
||||
# Create an entry in the hosts table. If no host table
|
||||
# exists, create one. If the IP address already exists,
|
||||
# replace it's entry.
|
||||
if [ ! -f /tmp/hosts ]; then
|
||||
echo "127.0.0.1 localhost" > /tmp/hosts
|
||||
fi
|
||||
|
||||
if grep "^$1 " /tmp/hosts > /dev/null; then
|
||||
grep -v "^$1 " /tmp/hosts > /tmp/hosts.new
|
||||
mv /tmp/hosts.new /tmp/hosts
|
||||
fi
|
||||
|
||||
echo "$1 $2 $2.$FQDN" >> /tmp/hosts
|
||||
}
|
||||
|
||||
addifconfig() {
|
||||
# $1 - interface name
|
||||
# $2 - interface symbolic name
|
||||
# $3 - interface IP address
|
||||
# $4 - interface netmask
|
||||
|
||||
# Create a hostname.* file for the interface.
|
||||
echo "inet $2 $4" > /tmp/hostname.$1
|
||||
|
||||
addhostent $3 $2
|
||||
}
|
||||
|
||||
configurenetwork() {
|
||||
local _ifsdone
|
||||
local _ifs
|
||||
|
||||
_IFS=`md_get_ifdevs`
|
||||
_ifsdone=""
|
||||
resp="" # force at least one iteration
|
||||
while [ "X${resp}" != X"done" ]; do
|
||||
cat << \__configurenetwork_1
|
||||
|
||||
You may configure the following network interfaces (the interfaces
|
||||
marked with [X] have been succesfully configured):
|
||||
|
||||
__configurenetwork_1
|
||||
|
||||
for _ifs in $_IFS; do
|
||||
if isin $_ifs $_ifsdone ; then
|
||||
echo -n "[X] "
|
||||
else
|
||||
echo -n " "
|
||||
fi
|
||||
echo $_ifs
|
||||
done
|
||||
echo ""
|
||||
echo -n "Configure which interface? [done] "
|
||||
getresp "done"
|
||||
case "$resp" in
|
||||
"done")
|
||||
;;
|
||||
*)
|
||||
_ifs=$resp
|
||||
if isin $_ifs $_IFS ; then
|
||||
if configure_ifs $_ifs ; then
|
||||
_ifsdone="$_ifs $_ifsdone"
|
||||
fi
|
||||
else
|
||||
echo "Invalid response: \"$resp\" is not in list"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
configure_ifs() {
|
||||
|
||||
_interface_name=$1
|
||||
|
||||
# Get IP address
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "IP address? "
|
||||
getresp ""
|
||||
_interface_ip=$resp
|
||||
done
|
||||
|
||||
# Get symbolic name
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "Symbolic (host) name? "
|
||||
getresp ""
|
||||
_interface_symname=$resp
|
||||
done
|
||||
|
||||
# Get netmask
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "Netmask? "
|
||||
getresp ""
|
||||
_interface_mask=$resp
|
||||
done
|
||||
|
||||
# Configure the interface. If it
|
||||
# succeeds, add it to the permanent
|
||||
# network configuration info.
|
||||
ifconfig ${_interface_name} down
|
||||
if ifconfig ${_interface_name} inet \
|
||||
${_interface_ip} \
|
||||
netmask ${_interface_mask} up ; then
|
||||
addifconfig \
|
||||
${_interface_name} \
|
||||
${_interface_symname} \
|
||||
${_interface_ip} \
|
||||
${_interface_mask}
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Much of this is gratuitously stolen from /etc/netstart.
|
||||
enable_network() {
|
||||
|
||||
# Set up the hostname.
|
||||
if [ ! -f /mnt/etc/myname ]; then
|
||||
echo "ERROR: no /etc/myname!"
|
||||
return 1
|
||||
fi
|
||||
hostname=`cat /mnt/etc/myname`
|
||||
hostname $hostname
|
||||
|
||||
# configure all the interfaces which we know about.
|
||||
(
|
||||
tmp="$IFS"
|
||||
IFS="$IFS."
|
||||
set -- `echo /mnt/etc/hostname*`
|
||||
IFS=$tmp
|
||||
unset tmp
|
||||
|
||||
while [ $# -ge 2 ] ; do
|
||||
shift # get rid of "hostname"
|
||||
(
|
||||
read af name mask bcaddr extras
|
||||
read dt dtaddr
|
||||
|
||||
if [ ! -n "$name" ]; then
|
||||
echo "/etc/hostname.$1: invalid network configuration file"
|
||||
exit
|
||||
fi
|
||||
|
||||
cmd="ifconfig $1 $af $name "
|
||||
if [ "${dt}" = "dest" ]; then cmd="$cmd $dtaddr"; fi
|
||||
if [ -n "$mask" ]; then cmd="$cmd netmask $mask"; fi
|
||||
if [ -n "$bcaddr" -a "X$bcaddr" != "XNONE" ]; then
|
||||
cmd="$cmd broadcast $bcaddr";
|
||||
fi
|
||||
cmd="$cmd $extras"
|
||||
|
||||
$cmd
|
||||
) < /mnt/etc/hostname.$1
|
||||
shift
|
||||
done
|
||||
)
|
||||
|
||||
# set the address for the loopback interface
|
||||
ifconfig lo0 inet localhost
|
||||
|
||||
# use loopback, not the wire
|
||||
route add $hostname localhost
|
||||
|
||||
# /etc/mygate, if it exists, contains the name of my gateway host
|
||||
# that name must be in /etc/hosts.
|
||||
if [ -f /mnt/etc/mygate ]; then
|
||||
route delete default > /dev/null 2>&1
|
||||
route add default `cat /mnt/etc/mygate`
|
||||
fi
|
||||
|
||||
# enable the resolver, if appropriate.
|
||||
if [ -f /mnt/etc/resolv.conf ]; then
|
||||
_resolver_enabled="TRUE"
|
||||
cp /mnt/etc/resolv.conf /tmp/resolv.conf.shadow
|
||||
fi
|
||||
|
||||
# Display results...
|
||||
echo "Network interface configuration:"
|
||||
ifconfig -a
|
||||
|
||||
echo ""
|
||||
|
||||
if [ "X${_resolver_enabled}" = X"TRUE" ]; then
|
||||
netstat -r
|
||||
echo ""
|
||||
echo "Resolver enabled."
|
||||
else
|
||||
netstat -rn
|
||||
echo ""
|
||||
echo "Resolver not enabled."
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
install_ftp() {
|
||||
# Get several parameters from the user, and create
|
||||
# a shell script that directs the appropriate
|
||||
# commands into ftp.
|
||||
cat << \__install_ftp_1
|
||||
|
||||
This is an automated ftp-based installation process. You will be asked
|
||||
several questions. The correct set of commands will be placed in a script
|
||||
that will be fed to ftp(1).
|
||||
|
||||
__install_ftp_1
|
||||
# Get server IP address
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "Server IP? [${_ftp_server_ip}] "
|
||||
getresp "${_ftp_server_ip}"
|
||||
_ftp_server_ip=$resp
|
||||
done
|
||||
|
||||
# Get server directory
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "Server directory? [${_ftp_server_dir}] "
|
||||
getresp "${_ftp_server_dir}"
|
||||
_ftp_server_dir=$resp
|
||||
done
|
||||
|
||||
# Get login name
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "Login? [${_ftp_server_login}] "
|
||||
getresp "${_ftp_server_login}"
|
||||
_ftp_server_login=$resp
|
||||
done
|
||||
|
||||
# Get password
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "Password? [${_ftp_server_password}] "
|
||||
getresp "${_ftp_server_password}"
|
||||
_ftp_server_password=$resp
|
||||
done
|
||||
|
||||
# Get list of files for mget.
|
||||
cat << \__install_ftp_2
|
||||
|
||||
You will now be asked for files to extract. Enter one file at a time.
|
||||
When you are done entering files, enter 'done'.
|
||||
|
||||
__install_ftp_2
|
||||
echo "#!/bin/sh" > /tmp/ftp-script.sh
|
||||
echo "cd /mnt" >> /tmp/ftp-script.sh
|
||||
echo "ftp -i -n $_ftp_server_ip << \__end_commands" >> \
|
||||
/tmp/ftp-script.sh
|
||||
echo "user $_ftp_server_login $_ftp_server_password" >> \
|
||||
/tmp/ftp-script.sh
|
||||
echo "bin" >> /tmp/ftp-script.sh
|
||||
echo "cd $_ftp_server_dir" >> /tmp/ftp-script.sh
|
||||
|
||||
resp="" # force one interation
|
||||
while [ "X${resp}" != X"done" ]; do
|
||||
echo -n "File? [done] "
|
||||
getresp "done"
|
||||
if [ "X${resp}" = X"done" ]; then
|
||||
break
|
||||
fi
|
||||
|
||||
_ftp_file=`echo ${resp} | awk '{print $1}'`
|
||||
echo "get ${_ftp_file} |\"tar --unlink -zxvpf -\"" >> \
|
||||
/tmp/ftp-script.sh
|
||||
done
|
||||
|
||||
echo "quit" >> /tmp/ftp-script.sh
|
||||
echo "__end_commands" >> /tmp/ftp-script.sh
|
||||
|
||||
sh /tmp/ftp-script.sh
|
||||
rm -f /tmp/ftp-script.sh
|
||||
echo "Extraction complete."
|
||||
}
|
||||
|
||||
install_common_nfs_cdrom() {
|
||||
# $1 - directory containing file
|
||||
local _filename
|
||||
local _setsdone
|
||||
local _prev
|
||||
local _f
|
||||
|
||||
_sets=`(cd /mnt2/$1; ls *.tar.gz)`
|
||||
if [ -z "$_sets" ]; then
|
||||
echo "There are no NetBSD install sets available in \"$1\""
|
||||
return
|
||||
fi
|
||||
|
||||
_setsdone=""
|
||||
while : ; do
|
||||
echo "The following sets are available for extraction:"
|
||||
echo "(marked sets have already been extracted)"
|
||||
echo ""
|
||||
|
||||
_prev=""
|
||||
for _f in $_sets ; do
|
||||
if isin $_f $_setsdone; then
|
||||
echo -n "[X] "
|
||||
else
|
||||
echo -n " "
|
||||
if [ -z "$_prev" ]; then _prev=$_f; fi
|
||||
fi
|
||||
echo $_f
|
||||
done
|
||||
echo ""
|
||||
|
||||
# Get the name of the file.
|
||||
if [ "X$_prev" = "X" ]; then resp=n; else resp=y; fi
|
||||
echo -n "Continue extraction [$resp]?"
|
||||
getresp "$resp"
|
||||
if [ "$resp" = "n" ]; then
|
||||
break
|
||||
fi
|
||||
|
||||
echo -n "File name [$_prev]? "
|
||||
getresp "$_prev"
|
||||
_f=$resp
|
||||
_filename="/mnt2/$1/$_f"
|
||||
|
||||
# Ensure file exists
|
||||
if [ ! -f $_filename ]; then
|
||||
echo "File $_filename does not exist. Check to make"
|
||||
echo "sure you entered the information properly."
|
||||
continue
|
||||
fi
|
||||
|
||||
# Extract file
|
||||
cat $_filename | (cd /mnt; tar -zxvpf -)
|
||||
echo "Extraction complete."
|
||||
_setsdone="$_f $_setsdone"
|
||||
|
||||
done
|
||||
}
|
||||
|
||||
install_cdrom() {
|
||||
# Get the cdrom device info
|
||||
cat << \__install_cdrom_1
|
||||
|
||||
The following CD-ROM devices are installed on your system; please select
|
||||
the CD-ROM device containing the installation media:
|
||||
|
||||
__install_cdrom_1
|
||||
_CDDEVS=`md_get_cddevs`
|
||||
echo "$_CDDEVS"
|
||||
echo ""
|
||||
echo -n "Which is the CD-ROM with the installation media? [abort] "
|
||||
getresp "abort"
|
||||
case "$resp" in
|
||||
abort)
|
||||
echo "Aborting."
|
||||
return
|
||||
;;
|
||||
|
||||
*)
|
||||
if isin $resp $_CDDEVS ; then
|
||||
_cdrom_drive=$resp
|
||||
else
|
||||
echo ""
|
||||
echo "The CD-ROM $resp does not exist."
|
||||
echo "Aborting."
|
||||
return
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# Get partition
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "Partition? [c] "
|
||||
getresp "c"
|
||||
case "$resp" in
|
||||
[a-h])
|
||||
_cdrom_partition=$resp
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Invalid response: $resp"
|
||||
resp="" # force loop to repeat
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Ask for filesystem type
|
||||
cat << \__install_cdrom_2
|
||||
|
||||
There are two CD-ROM filesystem types currently supported by this program:
|
||||
1) ISO-9660 (cd9660)
|
||||
2) Berkeley Fast Filesystem (ffs)
|
||||
|
||||
__install_cdrom_2
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "Which filesystem type? [cd9660] "
|
||||
getresp "cd9660"
|
||||
case "$resp" in
|
||||
cd9660|ffs)
|
||||
_cdrom_filesystem=$resp
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Invalid response: $resp"
|
||||
resp="" # force loop to repeat
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Mount the CD-ROM
|
||||
if ! mount -t ${_cdrom_filesystem} -o ro \
|
||||
/dev/${_cdrom_drive}${_cdrom_partition} /mnt2 ; then
|
||||
echo "Cannot mount CD-ROM drive. Aborting."
|
||||
return
|
||||
fi
|
||||
|
||||
# Get the directory where the file lives
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo "Enter the directory relative to the mount point that"
|
||||
echo -n "contains the file. [${_cdrom_directory}] "
|
||||
getresp "${_cdrom_directory}"
|
||||
done
|
||||
_cdrom_directory=$resp
|
||||
|
||||
install_common_nfs_cdrom ${_cdrom_directory}
|
||||
umount -f /mnt2 > /dev/null 2>&1
|
||||
}
|
||||
|
||||
install_nfs() {
|
||||
# Get the IP address of the server
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "Server IP address? [${_nfs_server_ip}] "
|
||||
getresp "${_nfs_server_ip}"
|
||||
done
|
||||
_nfs_server_ip=$resp
|
||||
|
||||
# Get server path to mount
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "Filesystem on server to mount? [${_nfs_server_path}] "
|
||||
getresp "${_nfs_server_path}"
|
||||
done
|
||||
_nfs_server_path=$resp
|
||||
|
||||
# Determine use of TCP
|
||||
echo -n "Use TCP transport (only works with capable NFS server)? [n] "
|
||||
getresp "n"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
_nfs_tcp="-T"
|
||||
;;
|
||||
|
||||
*)
|
||||
_nfs_tcp=""
|
||||
;;
|
||||
esac
|
||||
|
||||
# Mount the server
|
||||
mkdir /mnt2 > /dev/null 2>&1
|
||||
if ! mount_nfs $_nfs_tcp ${_nfs_server_ip}:${_nfs_server_path} \
|
||||
/mnt2 ; then
|
||||
echo "Cannot mount NFS server. Aborting."
|
||||
return
|
||||
fi
|
||||
|
||||
# Get the directory where the file lives
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo "Enter the directory relative to the mount point that"
|
||||
echo -n "contains the file. [${_nfs_directory}] "
|
||||
getresp "${_nfs_directory}"
|
||||
done
|
||||
_nfs_directory=$resp
|
||||
|
||||
install_common_nfs_cdrom ${_nfs_directory}
|
||||
umount -f /mnt2 > /dev/null 2>&1
|
||||
}
|
||||
|
||||
install_tape() {
|
||||
# Get the name of the tape from the user.
|
||||
cat << \__install_tape_1
|
||||
|
||||
The installation program needs to know which tape device to use. Make
|
||||
sure you use a "no rewind on close" device.
|
||||
|
||||
__install_tape_1
|
||||
_tape=`basename $TAPE`
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "Name of tape device? [${_tape}]"
|
||||
getresp "${_tape}"
|
||||
done
|
||||
_tape=`basename $resp`
|
||||
TAPE="/dev/${_tape}"
|
||||
if [ ! -c $TAPE ]; then
|
||||
echo "$TAPE does not exist or is not a character special file."
|
||||
echo "Aborting."
|
||||
return
|
||||
fi
|
||||
export TAPE
|
||||
|
||||
# Rewind the tape device
|
||||
echo -n "Rewinding tape..."
|
||||
if ! mt rewind ; then
|
||||
echo "$TAPE may not be attached to the system or may not be"
|
||||
echo "a tape device. Aborting."
|
||||
return
|
||||
fi
|
||||
echo "done."
|
||||
|
||||
# Get the file number
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "File number? "
|
||||
getresp ""
|
||||
case "$resp" in
|
||||
[1-9]*)
|
||||
_nskip=`expr $resp - 1`
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Invalid file number ${resp}."
|
||||
resp="" # fore loop to repeat
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Skip to correct file.
|
||||
echo -n "Skipping to source file..."
|
||||
if [ "X${_nskip}" != X"0" ]; then
|
||||
if ! mt fsf $_nskip ; then
|
||||
echo "Could not skip $_nskip files. Aborting."
|
||||
return
|
||||
fi
|
||||
fi
|
||||
echo "done."
|
||||
|
||||
cat << \__install_tape_2
|
||||
|
||||
There are 2 different ways the file can be stored on tape:
|
||||
|
||||
1) an image of a gzipped tar file
|
||||
2) a standard tar image
|
||||
|
||||
__install_tape_2
|
||||
resp="" # force one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
echo -n "Which way is it? [1] "
|
||||
getresp "1"
|
||||
case "$resp" in
|
||||
1)
|
||||
(
|
||||
cd /mnt
|
||||
dd if=$TAPE | tar --unlink -zxvpf -
|
||||
)
|
||||
;;
|
||||
|
||||
2)
|
||||
(
|
||||
cd /mnt
|
||||
dd if=$TAPE | tar --unlink -xvpf -
|
||||
)
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Invalid response: $resp."
|
||||
resp="" # force loop to repeat
|
||||
;;
|
||||
esac
|
||||
done
|
||||
echo "Extraction complete."
|
||||
}
|
||||
|
||||
get_timezone() {
|
||||
local _a
|
||||
cat << \__get_timezone_1
|
||||
|
||||
Select a time zone for your location. Timezones are represented on the
|
||||
system by a directory structure rooted in "/usr/share/timezone". Most
|
||||
timezones can be selected by entering a token like "MET" or "GMT-6".
|
||||
Other zones are grouped by continent, with detailed zone information
|
||||
separated by a slash ("/"), e.g. "US/Pacific".
|
||||
|
||||
To get a listing of what's available in /usr/share/zoneinfo, enter "?"
|
||||
at the prompts below.
|
||||
|
||||
__get_timezone_1
|
||||
if [ X$TZ = X ]; then
|
||||
TZ=`ls -l /etc/timezone 2>/dev/null | awk '{print $NF}' |
|
||||
sed -e 's?/usr/share/zoneinfo/??'`
|
||||
fi
|
||||
while :; do
|
||||
echo -n "What timezone are you in [\`?' for list] [$TZ]? "
|
||||
getresp "$TZ"
|
||||
case "$resp" in
|
||||
"")
|
||||
echo "Timezone defaults to GMT"
|
||||
TZ="GMT"
|
||||
break;
|
||||
;;
|
||||
"?")
|
||||
ls /usr/share/zoneinfo
|
||||
;;
|
||||
*)
|
||||
_a=$resp
|
||||
while [ -d /usr/share/zoneinfo/$_a ]; do
|
||||
echo -n "There are several timezones available"
|
||||
echo " within zone '$_a'"
|
||||
echo -n "Select a sub-timezone [\`?' for list]: "
|
||||
getresp ""
|
||||
case "$resp" in
|
||||
"?") ls /usr/share/zoneinfo/$_a ;;
|
||||
*) _a=${_a}/${resp}
|
||||
if [ -f /usr/share/zoneinfo/$_a ]; then
|
||||
break;
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
if [ -f /usr/share/zoneinfo/$_a ]; then
|
||||
TZ="$_a"
|
||||
echo "You have selected timezone \"$_a\"".
|
||||
break 2
|
||||
fi
|
||||
echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system."
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
install_sets()
|
||||
{
|
||||
# arguments: the base names of the distribution sets to consider
|
||||
# Ask the user which media to load the distribution from.
|
||||
cat << \__install_sets_1
|
||||
|
||||
It is now time to extract the installation sets onto the hard disk.
|
||||
Make sure The sets are either on a local device (i.e. tape, CD-ROM) or on a
|
||||
network server.
|
||||
|
||||
__install_sets_1
|
||||
if [ -f $RELDIR/$1.tar.gz ]; then
|
||||
echo -n "Install from sets in the current root filesystem? [y] "
|
||||
getresp "y"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
for _f do
|
||||
if [ ! -f $RELDIR/${_f}.tar.gz ]; then
|
||||
continue
|
||||
fi
|
||||
echo -n "Install \"$_f\" ? [y]"
|
||||
getresp "y"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
cat $RELDIR/${_f}.tar.gz |
|
||||
(cd /mnt; tar --unlink -zxvpf -)
|
||||
_yup="TRUE"
|
||||
echo "Extraction complete."
|
||||
;;
|
||||
*)
|
||||
echo "Skipping \"$_f\"."
|
||||
;;
|
||||
esac
|
||||
done
|
||||
;;
|
||||
*)
|
||||
_yup="FALSE"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
_yup="FALSE"
|
||||
fi
|
||||
|
||||
# Go on prodding for alternate locations
|
||||
resp="" # force at least one iteration
|
||||
while [ "X${resp}" = X"" ]; do
|
||||
# If _yup is not FALSE, it means that we extracted sets above.
|
||||
# If that's the case, bypass the menu the first time.
|
||||
if [ X"$_yup" = X"FALSE" ]; then
|
||||
echo -n "Install from (f)tp, (t)ape, (C)D-ROM, or (N)FS? [f] "
|
||||
getresp "f"
|
||||
case "$resp" in
|
||||
f*|F*)
|
||||
install_ftp
|
||||
;;
|
||||
|
||||
t*|T*)
|
||||
install_tape
|
||||
;;
|
||||
|
||||
c*|C*)
|
||||
install_cdrom
|
||||
;;
|
||||
|
||||
n*|N*)
|
||||
install_nfs
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Invalid response: $resp"
|
||||
resp=""
|
||||
;;
|
||||
esac
|
||||
else
|
||||
_yup="FALSE" # So we'll ask next time
|
||||
fi
|
||||
|
||||
# Give the user the opportunity to extract more sets. They don't
|
||||
# necessarily have to come from the same media.
|
||||
echo ""
|
||||
echo -n "Extract more sets? [n] "
|
||||
getresp "n"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
# Force loop to repeat
|
||||
resp=""
|
||||
;;
|
||||
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
munge_fstab()
|
||||
{
|
||||
local _fstab
|
||||
local _fstab_shadow
|
||||
# Now that the 'real' fstab is configured, we munge it into a 'shadow'
|
||||
# fstab which we'll use for mounting and unmounting all of the target
|
||||
# filesystems relative to /mnt. Mount all filesystems.
|
||||
_fstab=$1
|
||||
_fstab_shadow=$2
|
||||
awk '{
|
||||
if ($2 == "/")
|
||||
printf("%s /mnt %s %s %s %s\n", $1, $3, $4, $5, $6)
|
||||
else
|
||||
printf("%s /mnt%s %s %s %s %s\n", $1, $2, $3, $4, $5, $6)
|
||||
}' < $_fstab > $_fstab_shadow
|
||||
}
|
||||
|
||||
mount_fs()
|
||||
{
|
||||
# Must mount filesystems manually, one at a time, so we can make
|
||||
# sure the mount points exist.
|
||||
# $1 is a file in fstab format
|
||||
local _fstab
|
||||
|
||||
_fstab=$1
|
||||
|
||||
( while read line; do
|
||||
_dev=`echo $line | awk '{print $1}'`
|
||||
_mp=`echo $line | awk '{print $2}'`
|
||||
_fstype=`echo $line | awk '{print $3}'`
|
||||
_opt=`echo $line | awk '{print $4}'`
|
||||
|
||||
# If not the root filesystem, make sure the mount
|
||||
# point is present.
|
||||
if [ "X{$_mp}" != X"/mnt" ]; then
|
||||
mkdir -p $_mp
|
||||
fi
|
||||
|
||||
# Mount the filesystem. If the mount fails, exit
|
||||
# with an error condition to tell the outer
|
||||
# later to bail.
|
||||
if ! mount -v -t $_fstype -o $_opt $_dev $_mp ; then
|
||||
# error message displated by mount
|
||||
exit 1
|
||||
fi
|
||||
done ) < $_fstab
|
||||
|
||||
if [ "X${?}" != X"0" ]; then
|
||||
cat << \__mount_filesystems_1
|
||||
|
||||
FATAL ERROR: Cannot mount filesystems. Double-check your configuration
|
||||
and restart the installation process.
|
||||
__mount_filesystems_1
|
||||
exit
|
||||
fi
|
||||
}
|
||||
|
||||
unmount_fs()
|
||||
{
|
||||
# Unmount all filesystems and check their integrity.
|
||||
# $1 is a file in fstab format
|
||||
local _fstab
|
||||
|
||||
_fstab=$1
|
||||
|
||||
echo -n "Syncing disks..."
|
||||
pid=`twiddle`
|
||||
sync; sleep 4; sync; sleep 2; sync; sleep 2
|
||||
kill $pid
|
||||
echo "done."
|
||||
|
||||
(
|
||||
_devs=""
|
||||
_mps=""
|
||||
# maintain reverse order
|
||||
while read line; do
|
||||
_devs="`echo $line | awk '{print $1}'` ${_devs}"
|
||||
_mps="`echo $line | awk '{print $2}'` ${_mps}"
|
||||
done
|
||||
echo -n "Umounting filesystems... "
|
||||
for _mp in ${_mps}; do
|
||||
echo -n "${_mp} "
|
||||
umount ${_mp}
|
||||
done
|
||||
echo "Done."
|
||||
|
||||
echo "Checking filesystem integrity..."
|
||||
for _dev in ${_devs}; do
|
||||
echo "${_dev}"
|
||||
fsck -f ${_dev}
|
||||
done
|
||||
echo "Done."
|
||||
) < $_fstab
|
||||
}
|
||||
|
||||
check_fs()
|
||||
{
|
||||
# Check filesystem integrity.
|
||||
# $1 is a file in fstab format
|
||||
local _fstab
|
||||
|
||||
_fstab=$1
|
||||
|
||||
(
|
||||
_devs=""
|
||||
_mps=""
|
||||
while read line; do
|
||||
_devs="`echo $line | awk '{print $1}'` ${_devs}"
|
||||
_mps="`echo $line | awk '{print $2}'` ${_mps}"
|
||||
done
|
||||
|
||||
echo "Checking filesystem integrity..."
|
||||
for _dev in ${_devs}; do
|
||||
echo "${_dev}"
|
||||
fsck -f ${_dev}
|
||||
done
|
||||
echo "Done."
|
||||
) < $_fstab
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: list,v 1.2 1995/12/19 00:54:07 pk Exp $
|
||||
# $NetBSD: list,v 1.3 1996/01/06 22:45:14 pk Exp $
|
||||
|
||||
# copy the crunched binary, link to it, and kill it
|
||||
COPY ${OBJDIR}/instbin instbin
|
||||
|
@ -91,3 +91,9 @@ COPYDIR ${DESTDIR}/usr/share/zoneinfo usr/share/zoneinfo
|
|||
|
||||
# and the termcap file
|
||||
COPY ${CURDIR}/../../share/termcap/termcap.src usr/share/misc/termcap
|
||||
|
||||
# and the installation scripts
|
||||
COPY ${CURDIR}/install.sub install.sub
|
||||
COPY ${CURDIR}/install.sh install
|
||||
COPY ${CURDIR}/upgrade.sh upgrade
|
||||
SPECIAL chmod 755 install upgrade
|
||||
|
|
|
@ -0,0 +1,314 @@
|
|||
#!/bin/sh
|
||||
# $NetBSD: upgrade.sh,v 1.1 1996/01/06 22:45:15 pk Exp $
|
||||
#
|
||||
# Copyright (c) 1995 Jason R. Thorpe.
|
||||
# All rights reserved.
|
||||
#
|
||||
# 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 for the NetBSD Project
|
||||
# by Jason R. Thorpe.
|
||||
# 4. The name of the author may not be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
||||
|
||||
VERSION=1.1
|
||||
export VERSION # XXX needed in subshell
|
||||
ROOTDISK="" # filled in below
|
||||
|
||||
trap "umount /tmp > /dev/null 2>&1" 0
|
||||
|
||||
MODE="upgrade"
|
||||
|
||||
# include machine-dependent functions
|
||||
# The following functions must be provided:
|
||||
# md_get_diskdevs() - return available disk devices
|
||||
# md_get_cddevs() - return available CD-ROM devices
|
||||
# md_get_ifdevs() - return available network interfaces
|
||||
# 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
|
||||
. install.md
|
||||
|
||||
# include common subroutines
|
||||
. install.sub
|
||||
|
||||
# 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.
|
||||
(
|
||||
rm -f /tmp/fstab.new
|
||||
while read line; do
|
||||
_fstype=`echo $line | awk '{print $3}'`
|
||||
if [ "X${_fstype}" = X"ufs" -o \
|
||||
"X${_fstype}" = X"ffs" -o \
|
||||
"X${_fstype}" = X"nfs" ]; then
|
||||
echo $line >> /tmp/fstab.new
|
||||
fi
|
||||
done
|
||||
) < /tmp/fstab
|
||||
|
||||
if [ ! -f /tmp/fstab.new ]; then
|
||||
echo "ERROR: strange fstab!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Convert ufs to ffs.
|
||||
sed -e 's/ufs/ffs/' < /tmp/fstab.new > /tmp/fstab
|
||||
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*)
|
||||
vi /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
|
||||
|
||||
# Install sets.
|
||||
install_sets $UPGRSETS
|
||||
|
||||
# Get timezone info
|
||||
get_timezone
|
||||
|
||||
# Fix up the fstab.
|
||||
echo -n "Converting ufs to ffs in /etc/fstab..."
|
||||
sed -e 's/ufs/ffs/' < /mnt/etc/fstab > /tmp/fstab
|
||||
echo "done."
|
||||
echo -n "Would you like to edit the resulting fstab? [y] "
|
||||
getresp "y"
|
||||
case "$resp" in
|
||||
y*|Y*)
|
||||
vi /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."
|
||||
|
||||
echo -n "Copying kernel..."
|
||||
cp -p /netbsd /mnt/netbsd
|
||||
echo "done."
|
||||
|
||||
md_installboot ${ROOTDISK}
|
||||
)
|
||||
|
||||
unmount_fs /tmp/fstab.shadow
|
||||
|
||||
# Pat on the back.
|
||||
md_congrats
|
||||
|
||||
# ALL DONE!
|
||||
exit 0
|
Loading…
Reference in New Issue