Home | History | Annotate | Line # | Download | only in miniroot
upgrade.sh revision 1.1
      1  1.1  pk #!/bin/sh
      2  1.1  pk #	$NetBSD: upgrade.sh,v 1.1 1996/01/06 22:45:15 pk Exp $
      3  1.1  pk #
      4  1.1  pk # Copyright (c) 1995 Jason R. Thorpe.
      5  1.1  pk # All rights reserved.
      6  1.1  pk #
      7  1.1  pk # Redistribution and use in source and binary forms, with or without
      8  1.1  pk # modification, are permitted provided that the following conditions
      9  1.1  pk # are met:
     10  1.1  pk # 1. Redistributions of source code must retain the above copyright
     11  1.1  pk #    notice, this list of conditions and the following disclaimer.
     12  1.1  pk # 2. Redistributions in binary form must reproduce the above copyright
     13  1.1  pk #    notice, this list of conditions and the following disclaimer in the
     14  1.1  pk #    documentation and/or other materials provided with the distribution.
     15  1.1  pk # 3. All advertising materials mentioning features or use of this software
     16  1.1  pk #    must display the following acknowledgement:
     17  1.1  pk #	This product includes software developed for the NetBSD Project
     18  1.1  pk #	by Jason R. Thorpe.
     19  1.1  pk # 4. The name of the author may not be used to endorse or promote products
     20  1.1  pk #    derived from this software without specific prior written permission
     21  1.1  pk #
     22  1.1  pk # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     23  1.1  pk # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     24  1.1  pk # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     25  1.1  pk # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     26  1.1  pk # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     27  1.1  pk # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28  1.1  pk # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29  1.1  pk # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30  1.1  pk # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     31  1.1  pk # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  1.1  pk #
     33  1.1  pk 
     34  1.1  pk #	NetBSD installation script.
     35  1.1  pk #	In a perfect world, this would be a nice C program, with a reasonable
     36  1.1  pk #	user interface.
     37  1.1  pk 
     38  1.1  pk VERSION=1.1
     39  1.1  pk export VERSION				# XXX needed in subshell
     40  1.1  pk ROOTDISK=""				# filled in below
     41  1.1  pk 
     42  1.1  pk trap "umount /tmp > /dev/null 2>&1" 0
     43  1.1  pk 
     44  1.1  pk MODE="upgrade"
     45  1.1  pk 
     46  1.1  pk # include machine-dependent functions
     47  1.1  pk # The following functions must be provided:
     48  1.1  pk #	md_get_diskdevs()	- return available disk devices
     49  1.1  pk #	md_get_cddevs()		- return available CD-ROM devices
     50  1.1  pk #	md_get_ifdevs()		- return available network interfaces
     51  1.1  pk #	md_installboot()	- install boot-blocks on disk
     52  1.1  pk #	md_checkfordisklabel()	- check for valid disklabel
     53  1.1  pk #	md_labeldisk()		- put label on a disk
     54  1.1  pk #	md_welcome_banner()	- display friendly message
     55  1.1  pk #	md_not_going_to_install() - display friendly message
     56  1.1  pk #	md_congrats()		- display friendly message
     57  1.1  pk . install.md
     58  1.1  pk 
     59  1.1  pk # include common subroutines
     60  1.1  pk . install.sub
     61  1.1  pk 
     62  1.1  pk # Good {morning,afternoon,evening,night}.
     63  1.1  pk md_welcome_banner
     64  1.1  pk echo -n "Proceed with upgrade? [n] "
     65  1.1  pk getresp "n"
     66  1.1  pk case "$resp" in
     67  1.1  pk 	y*|Y*)
     68  1.1  pk 		echo	"Cool!  Let's get to it..."
     69  1.1  pk 		;;
     70  1.1  pk 	*)
     71  1.1  pk 		md_not_going_to_install
     72  1.1  pk 		exit
     73  1.1  pk 		;;
     74  1.1  pk esac
     75  1.1  pk 
     76  1.1  pk # Deal with terminal issues
     77  1.1  pk md_set_term
     78  1.1  pk 
     79  1.1  pk # XXX Work around vnode aliasing bug (thanks for the tip, Chris...)
     80  1.1  pk ls -l /dev > /dev/null 2>&1
     81  1.1  pk 
     82  1.1  pk # We don't like it, but it sure makes a few things a lot easier.
     83  1.1  pk do_mfs_mount "/tmp" "2048"
     84  1.1  pk 
     85  1.1  pk while [ "X${ROOTDISK}" = "X" ]; do
     86  1.1  pk 	getrootdisk
     87  1.1  pk done
     88  1.1  pk 
     89  1.1  pk # Make sure there's a disklabel there.  If there isn't, puke after
     90  1.1  pk # disklabel prints the error message.
     91  1.1  pk md_checkfordisklabel ${ROOTDISK}
     92  1.1  pk case $rval in
     93  1.1  pk 	1)
     94  1.1  pk 		cat << \__disklabel_not_present_1
     95  1.1  pk 
     96  1.1  pk FATAL ERROR: There is no disklabel present on the root disk!  You must
     97  1.1  pk label the disk with SYS_INST before continuing.
     98  1.1  pk 
     99  1.1  pk __disklabel_not_present_1
    100  1.1  pk 		exit
    101  1.1  pk 		;;
    102  1.1  pk 
    103  1.1  pk 	2)
    104  1.1  pk 		cat << \__disklabel_corrupted_1
    105  1.1  pk 
    106  1.1  pk FATAL ERROR: The disklabel on the root disk is corrupted!  You must
    107  1.1  pk re-label the disk with SYS_INST before continuing.
    108  1.1  pk 
    109  1.1  pk __disklabel_corrupted_1
    110  1.1  pk 		exit
    111  1.1  pk 		;;
    112  1.1  pk 
    113  1.1  pk 	*)
    114  1.1  pk 		;;
    115  1.1  pk esac
    116  1.1  pk 
    117  1.1  pk # Assume partition 'a' of $ROOTDISK is for the root filesystem.  Confirm
    118  1.1  pk # this with the user.  Check and mount the root filesystem.
    119  1.1  pk resp=""			# force one iteration
    120  1.1  pk while [ "X${resp}" = "X" ]; do
    121  1.1  pk 	echo -n	"Root filesystem? [${ROOTDISK}a] "
    122  1.1  pk 	getresp "${ROOTDISK}a"
    123  1.1  pk 	_root_filesystem="/dev/`basename $resp`"
    124  1.1  pk 	if [ ! -b ${_root_filesystem} ]; then
    125  1.1  pk 		echo "Sorry, ${resp} is not a block device."
    126  1.1  pk 		resp=""	# force loop to repeat
    127  1.1  pk 	fi
    128  1.1  pk done
    129  1.1  pk 
    130  1.1  pk echo	"Checking root filesystem..."
    131  1.1  pk if ! fsck -pf ${_root_filesystem}; then
    132  1.1  pk 	echo	"ERROR: can't check root filesystem!"
    133  1.1  pk 	exit 1
    134  1.1  pk fi
    135  1.1  pk 
    136  1.1  pk echo	"Mounting root filesystem..."
    137  1.1  pk if ! mount -o ro ${_root_filesystem} /mnt; then
    138  1.1  pk 	echo	"ERROR: can't mount root filesystem!"
    139  1.1  pk 	exit 1
    140  1.1  pk fi
    141  1.1  pk 
    142  1.1  pk # Grab the fstab so we can munge it for our own use.
    143  1.1  pk if [ ! -f /mnt/etc/fstab ]; then
    144  1.1  pk 	echo	"ERROR: no /etc/fstab!"
    145  1.1  pk 	exit 1
    146  1.1  pk fi
    147  1.1  pk cp /mnt/etc/fstab /tmp/fstab
    148  1.1  pk 
    149  1.1  pk # Grab the hosts table so we can use it.
    150  1.1  pk if [ ! -f /mnt/etc/hosts ]; then
    151  1.1  pk 	echo	"ERROR: no /etc/hosts!"
    152  1.1  pk 	exit 1
    153  1.1  pk fi
    154  1.1  pk cp /mnt/etc/hosts /tmp/hosts
    155  1.1  pk 
    156  1.1  pk # Start up the network in same/similar configuration as the installed system
    157  1.1  pk # uses.
    158  1.1  pk cat << \__network_config_1
    159  1.1  pk 
    160  1.1  pk The upgrade program would now like to enable the network.  It will use the
    161  1.1  pk configuration already stored on the root filesystem.  This is required
    162  1.1  pk if you wish to use the network installation capabilities of this program.
    163  1.1  pk 
    164  1.1  pk __network_config_1
    165  1.1  pk echo -n	"Enable network? [y] "
    166  1.1  pk getresp "y"
    167  1.1  pk case "$resp" in
    168  1.1  pk 	y*|Y*)
    169  1.1  pk 		if ! enable_network; then
    170  1.1  pk 			echo "ERROR: can't enable network!"
    171  1.1  pk 			exit 1
    172  1.1  pk 		fi
    173  1.1  pk 
    174  1.1  pk 		cat << \__network_config_2
    175  1.1  pk 
    176  1.1  pk You will now be given the opportunity to escape to the command shell to
    177  1.1  pk do any additional network configuration you may need.  This may include
    178  1.1  pk adding additional routes, if needed.  In addition, you might take this
    179  1.1  pk opportunity to redo the default route in the event that it failed above.
    180  1.1  pk 
    181  1.1  pk __network_config_2
    182  1.1  pk 		echo -n "Escape to shell? [n] "
    183  1.1  pk 		getresp "n"
    184  1.1  pk 		case "$resp" in
    185  1.1  pk 			y*|Y*)
    186  1.1  pk 				echo "Type 'exit' to return to upgrade."
    187  1.1  pk 				sh
    188  1.1  pk 				;;
    189  1.1  pk 
    190  1.1  pk 			*)
    191  1.1  pk 				;;
    192  1.1  pk 		esac
    193  1.1  pk 		;;
    194  1.1  pk 	*)
    195  1.1  pk 		;;
    196  1.1  pk esac
    197  1.1  pk 
    198  1.1  pk # Now that the network has been configured, it is safe to configure the
    199  1.1  pk # fstab.  We remove all but ufs/ffs/nfs.
    200  1.1  pk (
    201  1.1  pk 	rm -f /tmp/fstab.new
    202  1.1  pk 	while read line; do
    203  1.1  pk 		_fstype=`echo $line | awk '{print $3}'`
    204  1.1  pk 		if [ "X${_fstype}" = X"ufs" -o \
    205  1.1  pk 		    "X${_fstype}" = X"ffs" -o \
    206  1.1  pk 		    "X${_fstype}" = X"nfs" ]; then
    207  1.1  pk 			echo $line >> /tmp/fstab.new
    208  1.1  pk 		fi
    209  1.1  pk 	done
    210  1.1  pk ) < /tmp/fstab
    211  1.1  pk 
    212  1.1  pk if [ ! -f /tmp/fstab.new ]; then
    213  1.1  pk 	echo	"ERROR: strange fstab!"
    214  1.1  pk 	exit 1
    215  1.1  pk fi
    216  1.1  pk 
    217  1.1  pk # Convert ufs to ffs.
    218  1.1  pk sed -e 's/ufs/ffs/' < /tmp/fstab.new > /tmp/fstab
    219  1.1  pk rm -f /tmp/fstab.new
    220  1.1  pk 
    221  1.1  pk echo	"The fstab is configured as follows:"
    222  1.1  pk echo	""
    223  1.1  pk cat /tmp/fstab
    224  1.1  pk cat << \__fstab_config_1
    225  1.1  pk 
    226  1.1  pk You may wish to edit the fstab.  For example, you may need to resolve
    227  1.1  pk dependencies in the order which the filesystems are mounted.  Note that
    228  1.1  pk this fstab is only for installation purposes, and will not be copied into
    229  1.1  pk the root filesystem.
    230  1.1  pk 
    231  1.1  pk __fstab_config_1
    232  1.1  pk echo -n	"Edit the fstab? [n] "
    233  1.1  pk getresp "n"
    234  1.1  pk case "$resp" in
    235  1.1  pk 	y*|Y*)
    236  1.1  pk 		vi /tmp/fstab
    237  1.1  pk 		;;
    238  1.1  pk 
    239  1.1  pk 	*)
    240  1.1  pk 		;;
    241  1.1  pk esac
    242  1.1  pk 
    243  1.1  pk echo	""
    244  1.1  pk munge_fstab /tmp/fstab /tmp/fstab.shadow
    245  1.1  pk 
    246  1.1  pk if ! umount /mnt; then
    247  1.1  pk 	echo	"ERROR: can't unmount previously mounted root!"
    248  1.1  pk 	exit 1
    249  1.1  pk fi
    250  1.1  pk 
    251  1.1  pk # Check all of the filesystems.
    252  1.1  pk check_fs /tmp/fstab.shadow
    253  1.1  pk 
    254  1.1  pk # Mount filesystems.
    255  1.1  pk mount_fs /tmp/fstab.shadow
    256  1.1  pk 
    257  1.1  pk # Install sets.
    258  1.1  pk install_sets $UPGRSETS
    259  1.1  pk 
    260  1.1  pk # Get timezone info
    261  1.1  pk get_timezone
    262  1.1  pk 
    263  1.1  pk # Fix up the fstab.
    264  1.1  pk echo -n	"Converting ufs to ffs in /etc/fstab..."
    265  1.1  pk sed -e 's/ufs/ffs/' < /mnt/etc/fstab > /tmp/fstab
    266  1.1  pk echo	"done."
    267  1.1  pk echo -n	"Would you like to edit the resulting fstab? [y] "
    268  1.1  pk getresp "y"
    269  1.1  pk case "$resp" in
    270  1.1  pk 	y*|Y*)
    271  1.1  pk 		vi /tmp/fstab
    272  1.1  pk 		;;
    273  1.1  pk 
    274  1.1  pk 	*)
    275  1.1  pk 		;;
    276  1.1  pk esac
    277  1.1  pk 
    278  1.1  pk # Copy in configuration information and make devices in target root.
    279  1.1  pk (
    280  1.1  pk 	cd /tmp
    281  1.1  pk 	for file in fstab; do
    282  1.1  pk 		if [ -f $file ]; then
    283  1.1  pk 			echo -n "Copying $file..."
    284  1.1  pk 			cp $file /mnt/etc/$file
    285  1.1  pk 			echo "done."
    286  1.1  pk 		fi
    287  1.1  pk 	done
    288  1.1  pk 
    289  1.1  pk 	echo -n "Installing timezone link..."
    290  1.1  pk 	rm -f /mnt/etc/localtime
    291  1.1  pk 	ln -s /usr/share/zoneinfo/$TZ /mnt/etc/localtime
    292  1.1  pk 	echo "done."
    293  1.1  pk 
    294  1.1  pk 	echo -n "Making devices..."
    295  1.1  pk 	pid=`twiddle`
    296  1.1  pk 	cd /mnt/dev
    297  1.1  pk 	sh MAKEDEV all
    298  1.1  pk 	kill $pid
    299  1.1  pk 	echo "done."
    300  1.1  pk 
    301  1.1  pk 	echo -n "Copying kernel..."
    302  1.1  pk 	cp -p /netbsd /mnt/netbsd
    303  1.1  pk 	echo "done."
    304  1.1  pk 
    305  1.1  pk 	md_installboot ${ROOTDISK}
    306  1.1  pk )
    307  1.1  pk 
    308  1.1  pk unmount_fs /tmp/fstab.shadow
    309  1.1  pk 
    310  1.1  pk # Pat on the back.
    311  1.1  pk md_congrats
    312  1.1  pk 
    313  1.1  pk # ALL DONE!
    314  1.1  pk exit 0
    315