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