diff options
Diffstat (limited to 'distrib/hp300/miniroot/inst/install.sh')
-rw-r--r-- | distrib/hp300/miniroot/inst/install.sh | 493 |
1 files changed, 420 insertions, 73 deletions
diff --git a/distrib/hp300/miniroot/inst/install.sh b/distrib/hp300/miniroot/inst/install.sh index 2f172d90f50..00ddd77fa32 100644 --- a/distrib/hp300/miniroot/inst/install.sh +++ b/distrib/hp300/miniroot/inst/install.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $NetBSD: install.sh,v 1.1.2.3 1995/11/07 10:33:25 thorpej Exp $ +# $NetBSD: install.sh,v 1.1.2.7 1995/11/16 07:30:54 thorpej Exp $ # # Copyright (c) 1995 Jason R. Thorpe. # All rights reserved. @@ -36,6 +36,7 @@ # user interface. VERSION=1.1 +export VERSION # XXX needed in subshell ROOTDISK="" # filled in below FILESYSTEMS="/tmp/filesystems" # used thoughout FQDN="" # domain name @@ -59,6 +60,27 @@ isin() { 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 $! +} + # # machine dependent section # @@ -87,11 +109,350 @@ md_installboot() { echo "done." } +md_checkfordisklabel() { + # $1 is the disk to check + + disklabel -r $1 > /dev/null 2> /tmp/checkfordisklabel + if grep "no disk label" /tmp/checkfordisklabel; then + rval="1" + elif grep "disk label corrupted" /tmp/checkfordisklabel; then + rval="2" + else + rval="0" + fi + + rm -f /tmp/checkfordisklabel +} + +hp300_init_label_scsi_disk() { + # $1 is the disk to label + + # Name the disks we install in the temporary fstab. + if [ "X${_disk_instance}" = "X" ]; then + _disk_instance="0" + else + _disk_instance=`expr $_disk_instance + 1` + fi + _cur_disk_name="install-disk-${_disk_instance}" + + # Get geometry information from the user. + more << \__scsi_label_1 + +You will need to provide some information about your disk's geometry. +Geometry info for SCSI disks was printed at boot time. If that information +is not available, use the information provided in your disk's manual. +Please note that the geometry printed at boot time is preferred. + +IMPORTANT NOTE: due to a limitation in the disklabel(8) program, the +number of cylinders on the disk will be increased by 1 so that the initial +label can be placed on disk for editing. When the disklabel editor appears, +make absolutely certain you subtract 1 from the total number of cylinders, +and adjust the size of partition 'c' such that: + + size = (sectors per track) * (tracks per cyl) * (total cylinders) + +Note that the disklabel editor will be run twice; once to set the size of +partition 'c' and correct the geometry, and again so that you may correctly +edit the partition map. This is to work around the afore mentioned +limitation in disklabel(8). Apologies offered in advance. + +__scsi_label_1 + + # Give the opportunity to review the boot messages. + echo -n "Review boot messages now? [y] " + getresp "y" + case "$resp" in + y*|Y*) + (echo ""; dmesg; echo "") | more + ;; + + *) + ;; + esac + + echo "" + echo -n "Number of bytes per disk sector? [512] " + getresp "512" + _secsize="$resp" + + resp="" # force one iteration + while [ "X${resp}" = "X" ]; do + echo -n "Number of cylinders? " + getresp "" + done + _cylinders="$resp" + _fudge_cyl=`expr $_cylinders + 1` + + resp="" # force one iteration + while [ "X${resp}" = "X" ]; do + echo -n "Number of tracks (heads)? " + getresp "" + done + _tracks_per_cyl="$resp" + + resp="" # force one iteration + while [ "X${resp}" = "X" ]; do + echo -n "Number of disk sectors (blocks)? " + getresp "" + done + _nsectors="$resp" + + # Calculate some values we need. + _sec_per_cyl=`expr $_nsectors / $_cylinders` + _sec_per_track=`expr $_sec_per_cyl / $_tracks_per_cyl` + _new_c_size=`expr $_sec_per_track \* $_tracks_per_cyl \* $_cylinders` + + # Emit a disktab entry, suitable for getting started. + # What we have is a `c' partition with the total number of + # blocks, and an `a' partition with 1 sector; just large enough + # to open. Don't ask. + echo "" >> /etc/disktab + echo "# Created by install" >> /etc/disktab + echo "${_cur_disk_name}:\\" >> /etc/disktab + echo -n " :ty=winchester:ns#${_sec_per_track}:" >> /etc/disktab + echo "nt#${_tracks_per_cyl}:nc#${_fudge_cyl}:\\" >> /etc/disktab + echo " :pa#1:\\" >> /etc/disktab + echo " :pc#${_nsectors}:" >> /etc/disktab + + # Ok, here's what we need to do. First of all, we install + # this initial label by opening the `c' partition of the disk + # and using the `-r' flag for disklabel(8). However, because + # of limitations in disklabel(8), we've had to fudge the number + # of cylinders up 1 so that disklabel(8) doesn't complain about + # `c' running past the end of the disk, which can be quite + # common even with OEM HP drives! So, we've given ourselves + # an `a' partition, which is the minimum needed to open the disk + # so that we can perform the DIOCWDLABEL ioctl. So, once the + # initial label is installed, we open the `a' partition so that + # we can fix up the number of cylinders and make the size of + # `c' come out to (ncyl * ntracks_per_cyl * nsec_per_track). + # After that's done, we re-open `c' and let the user actually + # edit the partition table. It's horrible, I know. Bleh. + + disklabel -W ${1} + if ! disklabel -w -r ${1} ${_cur_disk_name}; then + echo "" + echo "ERROR: can't bootstrap disklabel!" + rval="1" + return + fi + + echo "" + echo "The disklabel editor will now start. During this phase, you" + echo "must reset the 'cylinders' value to ${_cylinders}, and adjust" + echo "the size of partition 'c' to ${_new_c_size}. Do not modify" + echo "the partition map at this time. You will have the opportunity" + echo "to do so in a moment." + echo "" + echo -n "Press <return> to continue. " + getresp "" + + disklabel -W ${1} + if ! disklabel -e /dev/r${1}a; then + echo "" + echo "ERROR: can't fixup geometry!" + rval="1" + return + fi + + cat << \__explain_motives_2 + +Now that you have corrected the geometry of your disk, you may edit the +partition map. Don't forget to fill in the fsize (frag size), bsize +(filesystem block size), and cpg (cylinders per group) values. If you +are unsure what these should be, use: + + fsize: 1024 + bsize: 4096 + cpg: 16 + +__explain_motives_2 + echo -n "Press <return> to continue. " + getresp "" + + rval="0" + return +} + +hp300_init_label_hpib_disk() { + # $1 is the disk to label + + # We look though the boot messages attempting to find + # the model number for the provided disk. + _hpib_disktype="" + if dmesg | grep "${1}: " > /dev/null 2>&1; then + _hpib_disktype=HP`dmesg | grep "${1}: " | sort -u | \ + awk '{print $2}'` + fi + if [ "X${_hpib_disktype}" = "X" ]; then + echo "" + echo "ERROR: $1 doesn't appear to exist?!" + rval="1" + return + fi + + # Peer through /etc/disktab to see if the disk has a "default" + # layout. If it doesn't, we have to treat it like a SCSI disk; + # i.e. prompt for geometry, and create a default to place + # on the disk. + if ! grep "${_hpib_disktype}[:|]" /etc/disktab > /dev/null \ + 2>&1; then + echo "" + echo "WARNING: can't find defaults for $1 ($_hpib_disktype)" + echo "" + hp300_init_label_scsi_disk $1 + return + fi + + # We've found the defaults. Now use them to place an initial + # disklabel on the disk. + # XXX What kind of ugliness to we have to deal with to get around + # XXX stupidity on the part of disklabel semantics? + disklabel -W ${1} + if ! disklabel -r -w ${1} $_hpib_disktype; then + # Error message displayed by disklabel(8) + echo "" + echo "ERROR: can't install default label!" + echo "" + echo -n "Try a different method? [y] " + getresp "y" + case "$resp" in + y*|Y*) + hp300_init_label_scsi_disk $1 + return + ;; + + *) + rval="1" + return + ;; + esac + fi + + rval="0" + return +} + +md_labeldisk() { + # $1 is the disk to label + + # Check to see if there is a disklabel present on the device. + # If so, we can just edit it. If not, we must first install + # a default label. + md_checkfordisklabel $1 + case "$rval" in + 0) + # Go ahead and just edit the disklabel. + disklabel -W $1 + disklabel -e $1 + ;; + + *) + echo -n "No disklabel present, installing a default for type: " + case "$1" in + rd*) + echo "HP-IB" + hp300_init_label_hpib_disk $1 + ;; + + sd*) + echo "SCSI" + hp300_init_label_scsi_disk $1 + ;; + + *) + # Shouldn't happen, but... + echo "unknown?! Giving up." + return; + ;; + esac + + # Check to see if installing the default was + # successful. If so, go ahead and pop into the + # disklabel editor. + if [ "X${rval}" != X"0" ]; then + echo "Sorry, can't label this disk." + echo "" + return; + fi + + # We have some defaults installed. Pop into + # the disklabel editor. + disklabel -W $1 + if ! disklabel -e $1; then + echo "" + echo "ERROR: couldn't set partition map for $1" + echo "" + fi + esac +} + + # Note, while they might not seem machine-dependent, the + # welcome banner and the punt message may contain information + # and/or instructions specific to the type of machine. + +md_welcome_banner() { +( + echo "" + echo "Welcome to the NetBSD/hp300 ${VERSION} installation program." + cat << \__welcome_banner_1 + +This program is designed to help you install NetBSD on your system in a +simple and rational way. You'll be asked several questions, and it would +probably be useful to have your disk's hardware manual, the installation +notes, and a calculator handy. + +In particular, you will need to know some reasonably detailed +information about your disk's geometry. This program can determine +some limited information about certain specific types of HP-IB disks. +If you have SCSI disks, however, prior knowledge of disk geometry +is absolutely essential. The kernel will attempt to display geometry +information for SCSI disks during boot, if possible. If you did not +make it note of it before, you may wish to reboot and jot down your +disk's geometry before proceeding. + +As with anything which modifies your hard disk's contents, this +program can cause SIGNIFICANT data loss, and you are advised +to make sure your hard drive is backed up before beginning the +installation process. + +Default answers are displyed in brackets after the questions. +You can hit Control-C at any time to quit, but if you do so at a +prompt, you may have to hit return. Also, quitting in the middle of +installation may leave your system in an inconsistent state. + +__welcome_banner_1 +) | more +} + +md_not_going_to_install() { + cat << \__not_going_to_install_1 + +OK, then. Enter 'halt' at the prompt to halt the machine. Once the +machine has halted, power-cycle the system to load new boot code. + +__not_going_to_install_1 +} + +md_congrats() { + cat << \__congratulations_1 + +CONGRATULATIONS! You have successfully installed NetBSD! To boot the +installed system, enter halt at the command prompt. Once the system has +halted, power-cycle the machine in order to load new boot code. Make sure +you boot from the root disk. + +__congratulations_1 +} + # end of machine dependent section 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 2048 swap $1 ; then + if ! mount_mfs -s $2 swap $1 ; then cat << \__mfs_failed_1 FATAL ERROR: Can't mount the memory filesystem. @@ -129,26 +490,13 @@ __getrootdisk_1 fi } -checkfordisklabel() { - disklabel -r $1 > /dev/null 2> /tmp/checkfordisklabel - if grep "no disk label" /tmp/checkfordisklabel; then - rval="1" - elif grep "disk label corrupted" /tmp/checkfordisklabel; then - rval="2" - else - rval="0" - fi - - rm -f /tmp/checkfordisklabel -} - labelmoredisks() { cat << \__labelmoredisks_1 You may label the following disks: __labelmoredisks_1 - echo "$_DKDEVS" | grep -v "${ROOTDISK}" + echo "$_DKDEVS" echo "" echo -n "Label which disk? [done] " getresp "done" @@ -157,10 +505,8 @@ __labelmoredisks_1 ;; *) - if echo "$_DKDEVS" | grep -v "${ROOTDISK}" | \ - grep "^$resp" > /dev/null ; then - # XXX CODE ME - echo "Yup, it exists." + if echo "$_DKDEVS" | grep "^$resp" > /dev/null ; then + md_labeldisk $resp else echo "" echo "The disk $resp does not exist." @@ -220,6 +566,9 @@ __configurenetwork_1 if isin $resp $_IFS ; then _interface_name=$resp + # Keep in the list in case it's misconfigured + # and the user want's to re-do it. + # Get IP address resp="" # force one iteration while [ "X${resp}" = X"" ]; do @@ -231,7 +580,7 @@ __configurenetwork_1 # Get symbolic name resp="" # force one iteration while [ "X${resp}" = X"" ]; do - echo -n "Symbolic name? " + echo -n "Symbolic (host) name? " getresp "" _interface_symname=$resp done @@ -333,7 +682,7 @@ __install_ftp_2 fi _ftp_file=`echo ${resp} | awk '{print $1}'` - echo "get ${_ftp_file} |\"tar -zxvpf -\"" >> \ + echo "get ${_ftp_file} |\"tar --unlink -zxvpf -\"" >> \ /tmp/ftp-script.sh done @@ -364,7 +713,7 @@ install_common_nfs_cdrom() { fi # Extract file - cat $_common_filename | (cd /mnt; tar -zxvpf -) + cat $_common_filename | (cd /mnt; tar --unlink -zxvpf -) echo "Extraction complete." } @@ -584,14 +933,14 @@ __install_tape_2 1) ( cd /mnt - dd if=$TAPE | tar -zxvpf - + dd if=$TAPE | tar --unlink -zxvpf - ) ;; 2) ( cd /mnt - dd if=$TAPE | tar -xvpf - + dd if=$TAPE | tar --unlink -xvpf - ) ;; @@ -629,32 +978,8 @@ __get_timezone_1 export TZ } -echo "" -echo "Welcome to the NetBSD ${VERSION} installation program." -cat << \__welcome_banner_1 - -This program is designed to help you put NetBSD on your hard disk, -in a simple and rational way. You'll be asked several questions, -and it would probably be useful to have your disk's hardware -manual, the installation notes, and a calculator handy. - -In particular, you will need to know some reasonably detailed -information about your disk's geometry. This program can determine -some limited information about certain specific types of HP-IB disks. -If you have SCSI disks, however, prior knowledge of disk geometry -is absolutely essential. - -As with anything which modifies your hard disk's contents, this -program can cause SIGNIFICANT data loss, and you are advised -to make sure your hard drive is backed up before beginning the -installation process. - -Default answers are displyed in brackets after the questions. -You can hit Control-C at any time to quit, but if you do so at a -prompt, you may have to hit return. Also, quitting in the middle of -installation may leave your system in an inconsistent state. - -__welcome_banner_1 +# Good {morning,afternoon,evening,night}. +md_welcome_banner echo -n "Proceed with installation? [n] " getresp "n" case "$resp" in @@ -662,18 +987,16 @@ case "$resp" in echo "Cool! Let's get to it..." ;; *) - cat << \__welcome_banner_2 - -OK, then. Enter 'halt' at the prompt to halt the machine. Once the -machine has halted, power-cycle the system to load new boot code. - -__welcome_banner_2 + 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 + # We don't like it, but it sure makes a few things a lot easier. -do_mfs_mount "/tmp" +do_mfs_mount "/tmp" "2048" # Install the shadowed disktab file; lets us write to it for temporary # purposes without mounting the miniroot read-write. @@ -685,8 +1008,8 @@ done # Make sure there's a disklabel there. If there isn't, puke after # disklabel prints the error message. -checkfordisklabel ${ROOTDISK} -case $rval in +md_checkfordisklabel ${ROOTDISK} +case "$resp" in 1) cat << \__disklabel_not_present_1 @@ -739,6 +1062,7 @@ 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 @@ -869,6 +1193,26 @@ case "$resp" in 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 "" @@ -1015,7 +1359,7 @@ if [ -f /base.tar.gz ]; then getresp "y" case "$resp" in y*|Y*) - cat $_f | (cd /mnt; tar -zxvpf -) + cat $_f | (cd /mnt; tar --unlink -zxvpf -) _yup="TRUE" ;; *) @@ -1088,7 +1432,7 @@ get_timezone # Copy in configuration information and make devices in target root. ( cd /tmp - for file in fstab hostname.* hosts myname mygate; do + for file in fstab hostname.* hosts myname mygate resolv.conf; do if [ -f $file ]; then echo -n "Copying $file..." cp $file /mnt/etc/$file @@ -1102,8 +1446,10 @@ get_timezone echo "done." echo -n "Making devices..." + pid=`twiddle` cd /mnt/dev sh MAKEDEV all + kill $pid echo "done." echo -n "Copying kernel..." @@ -1114,19 +1460,20 @@ get_timezone ) # Unmount all filesystems and check their integrity. -sync; sleep 2 -umount -a -echo "Checking filesystem integrity..." -fsck -pf +echo -n "Syncing disks..." +pid=`twiddle` +sync; sleep 4; sync; sleep 2; sync; sleep 2 +kill $pid +echo "done." -cat << \__congratulations_1 +echo "Unmounting filesystems..." +umount -va -CONGRATULATIONS! You have successfully installed NetBSD on your hard disk! -To boot the installed system, enter halt at the command prompt. Once the -system has halted, power-cycle the machine in order to load new boot code. -Make sure you boot from the disk. +echo "Checking filesystem integrity..." +fsck -pf -__congratulations_1 +# Pat on the back. +md_congrats # ALL DONE! -exit +exit 0 |