Home | History | Annotate | Line # | Download | only in miniroot
install.md revision 1.8
      1 #!/bin/sh
      2 #
      3 #	$NetBSD: install.md,v 1.8 2003/02/23 22:29:38 he Exp $
      4 #
      5 # Copyright (c) 1996 The NetBSD Foundation, Inc.
      6 # All rights reserved.
      7 #
      8 # This code is derived from software contributed to The NetBSD Foundation
      9 # by Jason R. Thorpe.
     10 #
     11 # Redistribution and use in source and binary forms, with or without
     12 # modification, are permitted provided that the following conditions
     13 # are met:
     14 # 1. Redistributions of source code must retain the above copyright
     15 #    notice, this list of conditions and the following disclaimer.
     16 # 2. Redistributions in binary form must reproduce the above copyright
     17 #    notice, this list of conditions and the following disclaimer in the
     18 #    documentation and/or other materials provided with the distribution.
     19 # 3. All advertising materials mentioning features or use of this software
     20 #    must display the following acknowledgement:
     21 #        This product includes software developed by the NetBSD
     22 #        Foundation, Inc. and its contributors.
     23 # 4. Neither the name of The NetBSD Foundation nor the names of its
     24 #    contributors may be used to endorse or promote products derived
     25 #    from this software without specific prior written permission.
     26 #
     27 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     28 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     29 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     30 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     31 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     32 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     33 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     34 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     35 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     36 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     37 # POSSIBILITY OF SUCH DAMAGE.
     38 #
     39 
     40 #
     41 # machine dependent section of installation/upgrade script
     42 #
     43 
     44 # Machine-dependent install sets
     45 MDSETS=""
     46 
     47 md_set_term() {
     48 	if [ ! -z "$TERM" ]; then
     49 		return
     50 	fi
     51 	echo -n "Specify terminal type [hp300h]: "
     52 	getresp "hp300h"
     53 	TERM="$resp"
     54 	export TERM
     55 	# XXX call tset?
     56 }
     57 
     58 md_makerootwritable() {
     59 	# Was: do_mfs_mount "/tmp" "2048"
     60 	# /tmp is the mount point
     61 	# 2048 is the size in DEV_BIZE blocks
     62 
     63 	umount /tmp > /dev/null 2>&1
     64 	if ! mount_mfs -s 2048 swap /tmp ; then
     65 		cat << \__mfs_failed_1
     66 
     67 FATAL ERROR: Can't mount the memory filesystem.
     68 
     69 __mfs_failed_1
     70 		exit
     71 	fi
     72 
     73 	# Bleh.  Give mount_mfs a chance to DTRT.
     74 	sleep 2
     75 }
     76 
     77 md_get_diskdevs() {
     78 	# return available disk devices
     79 	dmesg | awk -F : '/^rd[0-9]*:./ { print $1; }' | sort -u
     80 	dmesg | awk -F : '/^sd[0-9]*:.*cylinders/ { print $1; }' | sort -u
     81 }
     82 
     83 md_get_cddevs() {
     84 	# return available CD-ROM devices
     85 	dmesg | awk -F : '/^sd[0-9]*:.*CD-ROM/ { print $1; }' | sort -u
     86 }
     87 
     88 md_get_ifdevs() {
     89 	# return available network interfaces
     90 	dmesg | awk -F : '/^le[0-9]*:/ { print $1; }' | sort -u
     91 }
     92 
     93 md_installboot() {
     94 	# $1 is the root disk
     95 
     96 	echo -n "Installing boot block..."
     97 	disklabel -W ${1}
     98 	disklabel -B ${1}
     99 	echo "done."
    100 }
    101 
    102 grep_check_q () {
    103 	pattern=$1; shift
    104 	awk 'BEGIN{ es=1; } /'"$pattern"'/{ es=0; } END{ exit es; }' "$@"
    105 }
    106 
    107 plain_grep () {
    108 	pattern=$1; shift
    109 	awk "/$pattern/"'{ print; }' "$@"
    110 }
    111 
    112 md_checkfordisklabel() {
    113 	# $1 is the disk to check
    114 
    115 	disklabel -r $1 > /dev/null 2> /tmp/checkfordisklabel
    116 	if grep_check_q "no disk label" /tmp/checkfordisklabel; then
    117 		rval="1"
    118 	elif grep_check_q "disk label corrupted" /tmp/checkfordisklabel; then
    119 		rval="2"
    120 	else
    121 		rval="0"
    122 	fi
    123 
    124 	rm -f /tmp/checkfordisklabel
    125 }
    126 
    127 hp300_init_label_scsi_disk() {
    128 	# $1 is the disk to label
    129 
    130 	# Name the disks we install in the temporary fstab.
    131 	if [ "X${_disk_instance}" = "X" ]; then
    132 		_disk_instance="0"
    133 	else
    134 		_disk_instance=`expr $_disk_instance + 1`
    135 	fi
    136 	_cur_disk_name="install-disk-${_disk_instance}"
    137 
    138 	# Get geometry information from the user.
    139 	more << \__scsi_label_1
    140 
    141 You will need to provide some information about your disk's geometry.
    142 Geometry info for SCSI disks was printed at boot time.  If that information
    143 is not available, use the information provided in your disk's manual.
    144 Please note that the geometry printed at boot time is preferred.
    145 
    146 IMPORTANT NOTE: due to a limitation in the disklabel(8) program, the
    147 number of cylinders on the disk will be increased by 1 so that the initial
    148 label can be placed on disk for editing.  When the disklabel editor appears,
    149 make absolutely certain you subtract 1 from the total number of cylinders,
    150 and adjust the size of partition 'c' such that:
    151 
    152 	size = (sectors per track) * (tracks per cyl) * (total cylinders)
    153 
    154 Note that the disklabel editor will be run twice; once to set the size of
    155 partition 'c' and correct the geometry, and again so that you may correctly
    156 edit the partition map.  This is to work around the afore mentioned
    157 limitation in disklabel(8).  Apologies offered in advance.
    158 
    159 __scsi_label_1
    160 
    161 	# Give the opportunity to review the boot messages.
    162 	echo -n	"Review boot messages now? [y] "
    163 	getresp "y"
    164 	case "$resp" in
    165 		y*|Y*)
    166 			(echo ""; dmesg; echo "") | more
    167 			;;
    168 
    169 		*)
    170 			;;
    171 	esac
    172 
    173 	echo	""
    174 	echo -n	"Number of bytes per disk sector? [512] "
    175 	getresp "512"
    176 	_secsize="$resp"
    177 
    178 	resp=""		# force one iteration
    179 	while [ "X${resp}" = "X" ]; do
    180 		echo -n	"Number of cylinders? "
    181 		getresp ""
    182 	done
    183 	_cylinders="$resp"
    184 	_fudge_cyl=`expr $_cylinders + 1`
    185 
    186 	resp=""		# force one iteration
    187 	while [ "X${resp}" = "X" ]; do
    188 		echo -n	"Number of tracks (heads)? "
    189 		getresp ""
    190 	done
    191 	_tracks_per_cyl="$resp"
    192 
    193 	resp=""		# force one iteration
    194 	while [ "X${resp}" = "X" ]; do
    195 		echo -n	"Number of disk sectors (blocks)? "
    196 		getresp ""
    197 	done
    198 	_nsectors="$resp"
    199 
    200 	# Calculate some values we need.
    201 	_sec_per_cyl=`expr $_nsectors / $_cylinders`
    202 	_sec_per_track=`expr $_sec_per_cyl / $_tracks_per_cyl`
    203 	_new_c_size=`expr $_sec_per_track \* $_tracks_per_cyl \* $_cylinders`
    204 
    205 	# Emit a disktab entry, suitable for getting started.
    206 	# What we have is a `c' partition with the total number of
    207 	# blocks, and an `a' partition with 1 sector; just large enough
    208 	# to open.  Don't ask.
    209 	echo	"" >> /etc/disktab
    210 	echo	"# Created by install" >> /etc/disktab
    211 	echo	"${_cur_disk_name}:\\" >> /etc/disktab
    212 	echo -n	"	:ty=winchester:ns#${_sec_per_track}:" >> /etc/disktab
    213 	echo	"nt#${_tracks_per_cyl}:nc#${_fudge_cyl}:\\" >> /etc/disktab
    214 	echo	"	:pa#1:\\" >> /etc/disktab
    215 	echo	"	:pc#${_nsectors}:" >> /etc/disktab
    216 
    217 	# Ok, here's what we need to do.  First of all, we install
    218 	# this initial label by opening the `c' partition of the disk
    219 	# and using the `-r' flag for disklabel(8).  However, because
    220 	# of limitations in disklabel(8), we've had to fudge the number
    221 	# of cylinders up 1 so that disklabel(8) doesn't complain about
    222 	# `c' running past the end of the disk, which can be quite
    223 	# common even with OEM HP drives!  So, we've given ourselves
    224 	# an `a' partition, which is the minimum needed to open the disk
    225 	# so that we can perform the DIOCWDLABEL ioctl.  So, once the
    226 	# initial label is installed, we open the `a' partition so that
    227 	# we can fix up the number of cylinders and make the size of
    228 	# `c' come out to (ncyl * ntracks_per_cyl * nsec_per_track).
    229 	# After that's done, we re-open `c' and let the user actually
    230 	# edit the partition table.  It's horrible, I know.  Bleh.
    231 
    232 	disklabel -W ${1}
    233 	if ! disklabel -w -r ${1} ${_cur_disk_name}; then
    234 		echo ""
    235 		echo "ERROR: can't bootstrap disklabel!"
    236 		rval="1"
    237 		return
    238 	fi
    239 
    240 	echo ""
    241 	echo "The disklabel editor will now start.  During this phase, you"
    242 	echo "must reset the 'cylinders' value to ${_cylinders}, and adjust"
    243 	echo "the size of partition 'c' to ${_new_c_size}.  Do not modify"
    244 	echo "the partition map at this time.  You will have the opportunity"
    245 	echo "to do so in a moment."
    246 	echo ""
    247 	echo -n	"Press <return> to continue. "
    248 	getresp ""
    249 
    250 	disklabel -W ${1}
    251 	if ! disklabel -e /dev/r${1}a; then
    252 		echo ""
    253 		echo "ERROR: can't fixup geometry!"
    254 		rval="1"
    255 		return
    256 	fi
    257 
    258 	cat << \__explain_motives_2
    259 
    260 Now that you have corrected the geometry of your disk, you may edit the
    261 partition map.  Don't forget to fill in the fsize (frag size), bsize
    262 (filesystem block size), and cpg (cylinders per group) values.  If you
    263 are unsure what these should be, use:
    264 
    265 	fsize: 1024
    266 	bsize: 4096
    267 	cpg: 16
    268 
    269 __explain_motives_2
    270 	echo -n	"Press <return> to continue. "
    271 	getresp ""
    272 
    273 	rval="0"
    274 	return
    275 }
    276 
    277 hp300_init_label_hpib_disk() {
    278 	# $1 is the disk to label
    279 
    280 	# We look though the boot messages attempting to find
    281 	# the model number for the provided disk.
    282 	_hpib_disktype=""
    283 	if dmesg | grep_check_q "${1}: "; then
    284 		_hpib_disktype=HP`dmesg | plain_grep "${1}: " | sort -u | \
    285 		    awk '{print $2}'`
    286 	fi
    287 	if [ "X${_hpib_disktype}" = "X" ]; then
    288 		echo ""
    289 		echo "ERROR: $1 doesn't appear to exist?!"
    290 		rval="1"
    291 		return
    292 	fi
    293 
    294 	# Peer through /etc/disktab to see if the disk has a "default"
    295 	# layout.  If it doesn't, we have to treat it like a SCSI disk;
    296 	# i.e. prompt for geometry, and create a default to place
    297 	# on the disk.
    298 	if ! grep_check_q "${_hpib_disktype}[:|]" /etc/disktab; then
    299 		echo ""
    300 		echo "WARNING: can't find defaults for $1 ($_hpib_disktype)"
    301 		echo ""
    302 		hp300_init_label_scsi_disk $1
    303 		return
    304 	fi
    305 
    306 	# We've found the defaults.  Now use them to place an initial
    307 	# disklabel on the disk.
    308 	# XXX What kind of ugliness to we have to deal with to get around
    309 	# XXX stupidity on the part of disklabel semantics?
    310 	disklabel -W ${1}
    311 	if ! disklabel -r -w ${1} $_hpib_disktype; then
    312 		# Error message displayed by disklabel(8)
    313 		echo ""
    314 		echo "ERROR: can't install default label!"
    315 		echo ""
    316 		echo -n	"Try a different method? [y] "
    317 		getresp "y"
    318 		case "$resp" in
    319 			y*|Y*)
    320 				hp300_init_label_scsi_disk $1
    321 				return
    322 				;;
    323 
    324 			*)
    325 				rval="1"
    326 				return
    327 				;;
    328 		esac
    329 	fi
    330 
    331 	rval="0"
    332 	return
    333 }
    334 
    335 md_labeldisk() {
    336 	# $1 is the disk to label
    337 
    338 	# Check to see if there is a disklabel present on the device.
    339 	# If so, we can just edit it.  If not, we must first install
    340 	# a default label.
    341 	md_checkfordisklabel $1
    342 	case "$rval" in
    343 		0)
    344 			# Go ahead and just edit the disklabel.
    345 			disklabel -W $1
    346 			disklabel -e $1
    347 			;;
    348 
    349 		*)
    350 		echo -n "No disklabel present, installing a default for type: "
    351 			case "$1" in
    352 				rd*)
    353 					echo "HP-IB"
    354 					hp300_init_label_hpib_disk $1
    355 					;;
    356 
    357 				sd*)
    358 					echo "SCSI"
    359 					hp300_init_label_scsi_disk $1
    360 					;;
    361 
    362 				*)
    363 					# Shouldn't happen, but...
    364 					echo "unknown?!  Giving up."
    365 					return;
    366 					;;
    367 			esac
    368 
    369 			# Check to see if installing the default was
    370 			# successful.  If so, go ahead and pop into the
    371 			# disklabel editor.
    372 			if [ "X${rval}" != X"0" ]; then
    373 				echo "Sorry, can't label this disk."
    374 				echo ""
    375 				return;
    376 			fi
    377 
    378 			# We have some defaults installed.  Pop into
    379 			# the disklabel editor.
    380 			disklabel -W $1
    381 			if ! disklabel -e $1; then
    382 				echo ""
    383 				echo "ERROR: couldn't set partition map for $1"
    384 				echo ""
    385 			fi
    386 	esac
    387 }
    388 
    389 md_prep_disklabel() {
    390 	# $1 is the root disk
    391 
    392 	# Make sure there's a disklabel there.  If there isn't, puke after
    393 	# disklabel prints the error message.
    394 	md_checkfordisklabel $1
    395 	case "$resp" in
    396 		1)
    397 			cat << \__md_prep_disklabel_1
    398 
    399 FATAL ERROR: There is no disklabel present on the root disk!  You must
    400 label the disk with SYS_INST before continuing.
    401 
    402 __md_prep_disklabel_1
    403 			exit
    404 			;;
    405 
    406 		2)
    407 			cat << \__md_prep_disklabel_2
    408 
    409 FATAL ERROR: The disklabel on the root disk is corrupted!  You must
    410 re-label the disk with SYS_INST before continuing.
    411 
    412 __md_prep_disklabel_2
    413 			exit
    414 			;;
    415 
    416 		*)
    417 			;;
    418 	esac
    419 
    420 	# Give the user the opportinuty to edit the root disklabel.
    421 	cat << \__md_prep_disklabel_3
    422 
    423 You have already placed a disklabel onto the target root disk.
    424 However, due to the limitations of the standalone program used
    425 you may want to edit that label to change partition type information.
    426 You will be given the opporunity to do that now.  Note that you may
    427 not change the size or location of any presently open partition.
    428 
    429 __md_prep_disklabel_3
    430 	echo -n "Do you wish to edit the root disklabel? [y] "
    431 	getresp "y"
    432 	case "$resp" in
    433 		y*|Y*)
    434 			disklabel -W $1
    435 			disklabel -e $1
    436 			;;
    437 
    438 		*)
    439 			;;
    440 	esac
    441 
    442 	cat << \__md_prep_disklabel_4
    443 
    444 You will now be given the opportunity to place disklabels on any additional
    445 disks on your system.
    446 __md_prep_disklabel_4
    447 
    448 	_DKDEVS=`rmel ${ROOTDISK} ${_DKDEVS}`
    449 	resp="X"	# force at least one iteration
    450 	while [ "X$resp" != X"done" ]; do
    451 		labelmoredisks
    452 	done
    453 }
    454 
    455 md_copy_kernel() {
    456 	echo -n "Copying kernel..."
    457 	cp -p /netbsd /mnt/netbsd
    458 	echo "done."
    459 
    460 	cat << __md_copy_kernel_1
    461 
    462 The INSTALL kernel from the miniroot has been copied to your root disk.
    463 It has minimal facilities enabled.  The first thing you should do after
    464 installation is install an appropriate kernel for your machine (such as
    465 the GENERIC kernel).
    466 
    467 __md_copy_kernel_1
    468 	echo -n	"Press <return> to continue. "
    469 	getresp ""
    470 }
    471 
    472 	# Note, while they might not seem machine-dependent, the
    473 	# welcome banner and the punt message may contain information
    474 	# and/or instructions specific to the type of machine.
    475 
    476 md_welcome_banner() {
    477 (
    478 	echo	""
    479 	echo	"Welcome to the NetBSD/hp300 ${VERSION} installation program."
    480 	cat << \__welcome_banner_1
    481 
    482 This program is designed to help you install NetBSD on your system in a
    483 simple and rational way.  You'll be asked several questions, and it would
    484 probably be useful to have your disk's hardware manual, the installation
    485 notes, and a calculator handy.
    486 
    487 In particular, you will need to know some reasonably detailed
    488 information about your disk's geometry.  This program can determine
    489 some limited information about certain specific types of HP-IB disks.
    490 If you have SCSI disks, however, prior knowledge of disk geometry
    491 is absolutely essential.  The kernel will attempt to display geometry
    492 information for SCSI disks during boot, if possible.  If you did not
    493 make it note of it before, you may wish to reboot and jot down your
    494 disk's geometry before proceeding.
    495 
    496 As with anything which modifies your hard disk's contents, this
    497 program can cause SIGNIFICANT data loss, and you are advised
    498 to make sure your hard drive is backed up before beginning the
    499 installation process.
    500 
    501 Default answers are displyed in brackets after the questions.
    502 You can hit Control-C at any time to quit, but if you do so at a
    503 prompt, you may have to hit return.  Also, quitting in the middle of
    504 installation may leave your system in an inconsistent state.
    505 
    506 __welcome_banner_1
    507 ) | more
    508 }
    509 
    510 md_not_going_to_install() {
    511 		cat << \__not_going_to_install_1
    512 
    513 OK, then.  Enter 'halt' at the prompt to halt the machine.  Once the
    514 machine has halted, power-cycle the system to load new boot code.
    515 
    516 __not_going_to_install_1
    517 }
    518 
    519 md_congrats() {
    520 	cat << \__congratulations_1
    521 
    522 CONGRATULATIONS!  You have successfully installed NetBSD!  To boot the
    523 installed system, enter halt at the command prompt.  Once the system has
    524 halted, power-cycle the machine in order to load new boot code.  Make sure
    525 you boot from the root disk.
    526 
    527 __congratulations_1
    528 }
    529 
    530 md_native_fstype() {
    531 	# Nothing to do.
    532 }
    533 
    534 md_native_fsopts() {
    535 	# Nothing to do.
    536 }
    537