from netbsd; will be customized to openbsd later of course...
authorderaadt <deraadt@openbsd.org>
Sun, 19 Nov 1995 13:34:59 +0000 (13:34 +0000)
committerderaadt <deraadt@openbsd.org>
Sun, 19 Nov 1995 13:34:59 +0000 (13:34 +0000)
distrib/notes/donations
distrib/notes/hp300/contents
distrib/notes/hp300/install
distrib/notes/sparc/install
distrib/sparc/install.sh
distrib/sparc/upgrade.sh

index eb5d1b0..a716ee9 100644 (file)
@@ -1,8 +1,18 @@
+       Jason Brazile
+       Dave Burgess
+       Charles Conn
+       Canada Connect Corporation
        Brian Carlstrom
+       Tom Coulter
+       Charles D. Cranor
        Demon Internet, UK
+       Greg Gingerich
        Michael L. Hitch
+       Scott Kaplan
+       Chris Legrow
        Herb Peyerl
        Mike Price
        Thor Lancelot Simon
        Bill Sommerfeld
+       Paul Southworth
        Steve Wadlow
index dab1af1..92aea17 100644 (file)
@@ -68,12 +68,12 @@ the NetBSD 1.1 distribution tree, and are as follows:
 
 The hp300 security distribution set is named "secr11" and can be found
 in the "hp300/security" subdirectory of the NetBSD 1.1 distribution
-tree.  It contains crypt.c (the source file for the DES encryption
-algorithm) and the binaries which depend on it.  It can only be found
-on those sites which carry the complete NetBSD distribution and that
-can legally obtain it.  (Remember, because of United States law, this
-distribution set may not be exported to locations outside of the
-United States and Canada.)  [ XXXK gzipped, XXXK uncompressed ]
+tree.  It contains executables which are built in the "src/domestic" portion
+if the NetBSD source tree.  It can only be found on those sites which carry
+the complete NetBSD distribution and that can legally obtain it.  (Remember,
+because of United States law, this distribution set may not be exported to
+locations outside of the United States and Canada.)
+[ 128K gzipped, 275K uncompressed ]
 
 The hp300 binary distribution sets are distributed as gzipped tar files.
 Each hp300 binary distribution set also has its own "CKSUMS" file, just
@@ -84,6 +84,10 @@ The following are included in the `.../install' directory:
        SYS_INST.gz     A gzipped copy of the SYS_INST miniroot
                        installation program.
 
+       SYS_NBOOT.gz    A gzipped copy of the network boot block.
+                       This is useful if you are installing
+                       a diskless NetBSD/hp300 system.
+
        inst-11.fs.gz   A gzipped copy of the miniroot filesystem.
 
        netbsd.gz       A gzipped GENERIC kernel.
index 0c282aa..446ebec 100644 (file)
@@ -6,7 +6,47 @@ The miniroot's install program will:
 
        * Allow you to place disklabels on additional disks.
          Note that partition sizes and offsets are expressed
-         in sectors.
+         in sectors.  When you fill out the disklabel, you will
+         need to specify partition types and filesystem parameters.
+         If you're unsure what the these values should be, use the
+         following:
+
+               fstype: 4.2BSD
+               fsize: 1024
+               bsize: 4096
+               cpg: 16
+
+         If the partition will be a swap partition, use the following:
+
+               fstype: swap
+               fsize: 0 (or blank)
+               bsize: 0 (or blank)
+               cpg: 0 (or blank)
+
+         You will also need to specify the number of partitions.
+         The number of partitions is determined by the `index' of
+         the last partition letter, where a == 1, b == 2, etc.
+         Therefore, if the last filled partition is partition `g',
+         there are 7 partitions.  Any partitions with size of 0
+         may be removed from the list.
+
+         If the disk is the boot disk, you _must_ offset the root
+         partition (`a') one cylinder, as the hp300 boot code
+         if large enough to spill past the label area.  In this case,
+         the `c' partition must be fstype `boot'.
+
+         Anything after a `#' is a comment.
+
+         The following is an example disklabel partition map:
+
+7 partitions:
+#        size   offset    fstype   [fsize bsize   cpg]
+  a:    30912      448    4.2BSD     1024  8192    16   # (Cyl.    1 - 69)
+  b:   130816    31360      swap                        # (Cyl.   70 - 361)
+  c:  1296512        0      boot                        # (Cyl.    0 - 2893)
+  e:    81984   162176    4.2BSD     1024  8192    16   # (Cyl.  362 - 544)
+  f:   102592   244160    4.2BSD     1024  4096    16   # (Cyl.  545 - 773)
+  g:   949760   346752    4.2BSD     1024  8192    16   # (Cyl.  774 - 2893)
 
        * Create filesystems on target partitions.
 
index 48297a1..eb56c18 100644 (file)
@@ -18,6 +18,39 @@ If the server runs another operating system, you'll have to consult
 documentation that came with it (on SunOS systems, add_client(8) is a
 good start).
 
+Your Sparcstation expects to be able to download a second stage bootstrap
+program via TFTP after havinf acquired its IP address through RevARP when
+instructed to boot "over the net". It will look for a filename composed of
+the machine's IP address followed by the machine's architecture, separated
+by a period. For example, a sun4c machine which has been assigned IP
+address 130.115.144.11, will make an TFTP request for `8273900B.SUN4C'.
+Normally, this file is symbolic link to an appropriate second-stage
+boot program, which should be located in a place where the TFTP daemon
+can find it (remember, many TFTP daemons run in a chroot'ed environment).
+You can find the boot program in `/usr/mdec/boot' in the NetBSD/sparc
+distribution. Unfortunately, it is necessary to install this file
+differently for sun4 and sun4c clients: the sun4 version needs to have its
+`a.out' header stripped off (otherwise the machine will crash), while the
+sun4c version must retain it (otherwise the PROM will complain).
+
+Here's an example to illustrate this whole mess:
+
+    server# cd /<client-root-dir>/usr/mdec
+    if client is a sun4:
+       server# set SKIP=1
+       server# set KARCH=SUN4
+    else
+       server# set SKIP=0
+       server# set KARCH=SUN4C
+    server# dd if=boot of=/tftpboot/boot.sparc.netbsd.$KARCH skip=$SKIP bs=32
+    server# cd /tftpboot
+    server# ln -s boot.sparc.netbsd.$KARCH 8273900B.$KARCH
+
+Note: some versions of Openboot ROMs (sun4c) seem to require that the
+boot program size is nicely rounded. Therefore it may be necessary to
+strip(8) off the symbol table.
+
+
 As noted above in the section `Preparing your System for NetBSD Installation',
 you have several options when choosing a location to store the installation
 filesets. However, the easiest way is to put the *.tar.gz files you want
@@ -200,13 +233,13 @@ On version 2 OpenBOOT ROMs:
     ok setenv boot-device /sbus/esp/sd@0,0
 
 
-Congratulations, you have successfully installed NetBSD 1.0.  When you
+Congratulations, you have successfully installed NetBSD 1.1.  When you
 reboot into NetBSD, you should log in as "root" at the login prompt.
 There is no initial password, but if you're using the machine in a
 networked environment, you should create yourself an account and
 protect it and the "root" account with good passwords.
 
-Some of the files in the NetBSD 1.0 distribution might need to be
+Some of the files in the NetBSD 1.1 distribution might need to be
 tailored for your site.  In particular, the /etc/sendmail.cf file will
 almost definitely need to be adjusted, and other files in /etc will
 probably need to be modified.  If you are unfamiliar with UN*X-like
@@ -224,7 +257,8 @@ least the following pieces:
     gzip (GNU gzip) SunOS binary
     gtar (GNU tar) SunOS binary
     the "install.sh" script
-    a "/boot" file from a SunOS sun4c machine
+    a "/boot" file from a SunOS machine that matches your machine type
+       (e.g. sun or sun4c)
     a kernel, most likely "/netbsd"
 
 All these pieces, except "/boot", are supplied in the NetBSD/sparc
@@ -274,13 +308,13 @@ The installboot man page says to do something like this:
     sunos# /usr/mdec/installboot -vlt /mnt/boot /usr/mdec/bootsd /dev/rsd2a
 
 You can now extract the provided "*.tar.gz files onto your disk.  The
-provided script, "install.sh" will help you:
+provided script, "install_from_sunos.sh" will help you:
 
     sunos# ls -FC
     base.tar.gz      etc.tar.gz       man.tar.gz       secr.tar.gz
     comp.tar.gz      games.tar.gz     misc.tar.gz      text.tar.gz
     install.sh       netbsd.id3_scsi
-    sunos# ./install.sh
+    sunos# ./install_from_sunos.sh
     [...]
 
 This script NEEDS gzip and gtar (GNU gzip and GNU tar) on your
index 829e184..e657741 100644 (file)
@@ -1,5 +1,5 @@
 #!/bin/sh
-#      $NetBSD: install.sh,v 1.2.2.1 1995/11/01 21:26:21 pk Exp $
+#      $NetBSD: install.sh,v 1.2.2.2 1995/11/16 22:30:55 pk Exp $
 #
 # Copyright (c) 1995 Jason R. Thorpe.
 # All rights reserved.
@@ -75,7 +75,7 @@ twiddle()
                sleep 1; echo -n "-\b";
                sleep 1; echo -n "\\\b";
                sleep 1; echo -n "|\b";
-        done > /dev/tty & echo $!
+       done > /dev/tty & echo $!
 }
 
 set_terminal() {
@@ -90,17 +90,17 @@ set_terminal() {
 #
 md_get_diskdevs() {
        # return available disk devices
-       dmesg | egrep "(^sd[0-9]:|^x[dy][0-9]:)" | cut -d" " -f1 | sort | uniq
+       dmesg | egrep "(^sd[0-9]|^x[dy][0-9])" | cut -d" " -f1 | sort -u
 }
 
 md_get_cddevs() {
        # return available CDROM devices
-       dmesg | grep "^sd" | grep "rev" | cut -d" " -f1
+       dmesg | grep "^cd[0-9]" | cut -d" " -f1 | sort -u
 }
 
 md_get_ifdevs() {
        # return available network devices
-       dmesg | egrep "(^le[0-9]|^ie[0-9])" | cut -d" " -f1
+       dmesg | egrep "(^le[0-9]|^ie[0-9])" | cut -d" " -f1 | sort -u
 }
 
 md_installboot() {
@@ -221,71 +221,91 @@ addifconfig() {
 
 
 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:
+You may configure the following network interfaces (the interfaces
+marked with [X] have been succesfully configured):
 
 __configurenetwork_1
 
-       _IFS=`md_get_ifdevs`
-       echo    $_IFS
-       echo    ""
-       echo -n "Configure which interface? [done] "
-       getresp "done"
-       case "$resp" in
+               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")
                        ;;
-
                *)
-                       if isin $resp $_IFS ; then
-                               _interface_name=$resp
-
-                               # remove from list
-                               _IFS=`rmel $resp "$_IFS"`
-
-                               # 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 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}
+                       _ifs=$resp
+                       if isin $_ifs $_IFS ; then
+                               if configure_ifs $_ifs ; then
+                                       _ifsdone="$_ifs $_ifsdone"
                                fi
                        else
-                               echo ""
-                               echo "The interface $resp does not exist."
+                               echo "Invalid response: \"$resp\" is not in list"
                        fi
                        ;;
-       esac
+               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
 }
 
 install_ftp() {
@@ -370,25 +390,61 @@ __install_ftp_2
 
 install_common_nfs_cdrom() {
        # $1 - directory containing file
-
-       # Get the name of the file.
-       resp=""         # force one iteration
-       while [ "X${resp}" = X"" ]; do
-               echo -n "File name? "
-               getresp ""
-       done
-       _common_filename="/mnt2/$1/$resp"
-
-       # Ensure file exists
-       if [ ! -f $_common_filename ]; then
-               echo "File $_common_filename does not exist.  Check to make"
-               echo "sure you entered the information properly."
+       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
 
-       # Extract file
-       cat $_common_filename | (cd /mnt; tar -zxvpf -)
-       echo "Extraction complete."
+       _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() {
@@ -464,6 +520,7 @@ __install_cdrom_2
        done
 
        # Mount the CD-ROM
+       mkdir /mnt2 > /dev/null 2>&1
        if ! mount -t ${_cdrom_filesystem} -o ro \
            /dev/${_cdrom_drive}${_cdrom_partition} /mnt2 ; then
                echo "Cannot mount CD-ROM drive.  Aborting."
@@ -615,7 +672,7 @@ __install_tape_2
                        2)
                                (
                                        cd /mnt
-                                       tar -zxvpf $TAPE
+                                       dd if=$TAPE | tar -xvpf -
                                )
                                ;;
 
@@ -638,16 +695,16 @@ 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/timezone, enter "?"
-at the first prompt below.
+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/timezone/??'`
+                       sed -e 's?/usr/share/zoneinfo/??'`
        fi
        while :; do
-               echo -n "What timezone are you in [$TZ]? "
+               echo -n "What timezone are you in [\`?' for list] [$TZ]? "
                getresp "$TZ"
                case "$resp" in
                "")
@@ -660,16 +717,23 @@ __get_timezone_1
                        ;;
                *)
                        _a=$resp
-                       if [ -d /usr/share/zoneinfo/$_a ]; then
+                       while [ -d /usr/share/zoneinfo/$_a ]; do
                                echo -n "There are several timezones available"
-                               echo " within '$_a'"
-                               echo -n "Select a sub-timezone: "
+                               echo " within zone '$_a'"
+                               echo -n "Select a sub-timezone [\`?' for list]: "
                                getresp ""
-                               _a=${_a}/${resp}
-                       fi
+                               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".
+                               echo "You have selected timezone \"$_a\"".
                                break 2
                        fi
                        echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system."
@@ -773,6 +837,30 @@ echo -n    "Do you wish to edit the root disklabel? [y] "
 getresp "y"
 case "$resp" in
        y*|Y*)
+cat << \__disklabel_notice_2
+Here is an example of what the partition information will look like once
+you have entered the disklabel editor. Disk partition sizes and offsets
+are in sector (most likely 512 bytes) units. Make sure these size/offset
+pairs are on cylinder boundaries (the number of sector per cylinder is
+given in the `sectors/cylinder' entry, which is not shown here).
+
+Do not change any parameters except the partition layout and the label name.
+It's probably also wisest not to touch the `8 partitions:' line, even
+in case you have defined less than eight partitions.
+
+[Example]
+8 partitions:
+#        size   offset    fstype   [fsize bsize   cpg]
+  a:    50176        0    4.2BSD     1024  8192    16   # (Cyl.    0 - 111)
+  b:    64512    50176      swap                        # (Cyl.  112 - 255)
+  c:   640192        0   unknown                        # (Cyl.    0 - 1428)
+  d:   525504   114688    4.2BSD     1024  8192    16   # (Cyl.  256 - 1428)
+[End of example]
+
+__disklabel_notice_2
+               echo -n "Hit <enter> to enter the disklabel editor: "
+               getresp ""
+
                disklabel -W ${ROOTDISK}
                disklabel -e ${ROOTDISK}
                ;;
@@ -781,11 +869,11 @@ case "$resp" in
                ;;
 esac
 
-cat << \__disklabel_notice_2
+cat << \__disklabel_notice_3
 
 You will now be given the opportunity to place disklabels on any additional
 disks on your system.
-__disklabel_notice_2
+__disklabel_notice_3
 
 resp="X"       # force at least one iteration
 while [ "X$resp" != X"done" ]; do
@@ -797,9 +885,10 @@ done
 # 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).
+You will now have the opportunity to specify mount points for some or
+all of the partitions you have on your disk(s).
+You will be prompted for device name (for example `/dev/sd0d') and
+mount point (full path, e.g. `/usr').
 
 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
@@ -903,10 +992,7 @@ case "$resp" in
                done
                FQDN=$resp
 
-               resp=""         # force at least one iteration
-               while [ "X${resp}" != X"done" ]; do
-                       configurenetwork
-               done
+               configurenetwork
 
                echo -n "Enter IP address of default route: [none] "
                getresp "none"
@@ -1064,7 +1150,10 @@ if [ -f $RELDIR/base.tar.gz ]; then
        case "$resp" in
                y*|Y*)
                        for _f in $ALLSETS; do
-                               echo -n "Install $_f ? [y]"
+                               if [ ! -f $RELDIR/${_f}.tar.gz ]; then
+                                       continue;
+                               fi
+                               echo -n "Install set \"$_f\" ? [y]"
                                getresp "y"
                                case "$resp" in
                                y*|Y*)
@@ -1073,6 +1162,7 @@ if [ -f $RELDIR/base.tar.gz ]; then
                                        _yup=X
                                        ;;
                                *)
+                                       continue;
                                        ;;
                                esac
                                echo "Extraction complete."
@@ -1117,7 +1207,7 @@ while [ "X${resp}" = X"" ]; do
        # 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] "
+       echo -n "Extract more sets (from other media)? [n] "
        getresp "n"
        case "$resp" in
                y*|Y*)
@@ -1152,7 +1242,7 @@ done
        echo "done."
 
        echo "Copying kernel..."
-       cp /netbsd /mnt/netbsd
+       cp -p /netbsd /mnt/netbsd
 
        md_installboot ${ROOTDISK}
 )
index 74bff8f..47d1281 100644 (file)
@@ -1,5 +1,5 @@
 #!/bin/sh
-#      $NetBSD: upgrade.sh,v 1.3 1995/11/01 21:10:41 pk Exp $
+#      $NetBSD: upgrade.sh,v 1.3.2.1 1995/11/16 22:30:57 pk Exp $
 #
 # Copyright (c) 1995 Jason R. Thorpe.
 # All rights reserved.
@@ -75,7 +75,7 @@ twiddle()
                sleep 1; echo -n "-\b";
                sleep 1; echo -n "\\\b";
                sleep 1; echo -n "|\b";
-        done > /dev/tty & echo $!
+       done > /dev/tty & echo $!
 }
 
 set_terminal() {
@@ -90,17 +90,17 @@ set_terminal() {
 #
 md_get_diskdevs() {
        # return available disk devices
-       dmesg | grep "^sd.*at scsibus" | cut -d" " -f1
+       dmesg | egrep "(^sd[0-9]|^x[dy][0-9])" | cut -d" " -f1 | sort -u
 }
 
 md_get_cddevs() {
        # return available CDROM devices
-       dmesg | grep "^sd" | grep "rev" | cut -d" " -f1
+       dmesg | grep "^cd[0-9]" | cut -d" " -f1 | sort -u
 }
 
 md_get_ifdevs() {
        # return available network devices
-       dmesg | egrep "(^le[0-9]|^ie[0-9])" | cut -d" " -f1
+       dmesg | egrep "(^le[0-9]|^ie[0-9])" | cut -d" " -f1 | sort -u
 }
 
 md_installboot() {
@@ -370,25 +370,61 @@ __install_ftp_2
 
 install_common_nfs_cdrom() {
        # $1 - directory containing file
-
-       # Get the name of the file.
-       resp=""         # force one iteration
-       while [ "X${resp}" = X"" ]; do
-               echo -n "File name? "
-               getresp ""
-       done
-       _common_filename="/mnt2/$1/$resp"
-
-       # Ensure file exists
-       if [ ! -f $_common_filename ]; then
-               echo "File $_common_filename does not exist.  Check to make"
-               echo "sure you entered the information properly."
+       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
 
-       # Extract file
-       cat $_common_filename | (cd /mnt; tar -zxvpf -)
-       echo "Extraction complete."
+       _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() {
@@ -462,8 +498,8 @@ __install_cdrom_2
                                ;;
                esac
        done
-
        # Mount the CD-ROM
+       mkdir /mnt2 > /dev/null 2>&1
        if ! mount -t ${_cdrom_filesystem} -o ro \
            /dev/${_cdrom_drive}${_cdrom_partition} /mnt2 ; then
                echo "Cannot mount CD-ROM drive.  Aborting."
@@ -614,7 +650,7 @@ __install_tape_2
                        2)
                                (
                                        cd /mnt
-                                       tar -zxvpf $TAPE
+                                       dd if=$TAPE | tar -xvpf -
                                )
                                ;;
 
@@ -637,16 +673,16 @@ 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/timezone, enter "?"
-at the first prompt below.
+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/timezone/??'`
+                       sed -e 's?/usr/share/zoneinfo/??'`
        fi
        while :; do
-               echo -n "What timezone are you in [$TZ]? "
+               echo -n "What timezone are you in [\`?' for list] [$TZ]? "
                getresp "$TZ"
                case "$resp" in
                "")
@@ -659,16 +695,23 @@ __get_timezone_1
                        ;;
                *)
                        _a=$resp
-                       if [ -d /usr/share/zoneinfo/$_a ]; then
+                       while [ -d /usr/share/zoneinfo/$_a ]; do
                                echo -n "There are several timezones available"
-                               echo " within '$_a'"
-                               echo -n "Select a sub-timezone: "
+                               echo " within zone '$_a'"
+                               echo -n "Select a sub-timezone [\`?' for list]: "
                                getresp ""
-                               _a=${_a}/${resp}
-                       fi
+                               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".
+                               echo "You have selected timezone \"$_a\"".
                                break 2
                        fi
                        echo "'/usr/share/zoneinfo/$_a' is not a valid timezone on this system."
@@ -873,7 +916,6 @@ __install_sets_1
 ALLSETS="base comp etc games man misc text"
 UPGRSETS="base comp games man misc text"
 RELDIR=
-RELDIR=/a/release
 
 if [ -f $RELDIR/base.tar.gz ]; then
        echo -n "Install from sets in the current root filesystem? [y] "
@@ -881,7 +923,10 @@ if [ -f $RELDIR/base.tar.gz ]; then
        case "$resp" in
                y*|Y*)
                        for _f in $UPGRSETS; do
-                               echo -n "Install $_f ? [y]"
+                               if [ ! -f $RELDIR/${_f}.tar.gz ]; then
+                                       continue;
+                               fi
+                               echo -n "Install set \"$_f\" ? [y]"
                                getresp "y"
                                case "$resp" in
                                y*|Y*)
@@ -890,6 +935,7 @@ if [ -f $RELDIR/base.tar.gz ]; then
                                        _yup=X
                                        ;;
                                *)
+                                       continue;
                                        ;;
                                esac
                                echo "Extraction complete."
@@ -972,11 +1018,11 @@ esac
 
        if [ -f /mnt/netbsd ]; then
                echo "Saving existing kernel in netbsd.1.0."
-               cp /mnt/netbsd /mnt/netbsd.1.0
+               mv /mnt/netbsd /mnt/netbsd.1.0
        fi
 
        echo "Copying netbsd 1.1 kernel ..."
-       cp /netbsd /mnt/netbsd
+       cp -p /netbsd /mnt/netbsd
 
        if [ "$_INSTBOOT" = "Y" ]; then
                echo "Installing NetBSD bootblock..."