diff options
author | Jason Downs <downsj@cvs.openbsd.org> | 1997-02-16 19:32:39 +0000 |
---|---|---|
committer | Jason Downs <downsj@cvs.openbsd.org> | 1997-02-16 19:32:39 +0000 |
commit | b2fb130e47aa017b38d5d193563fef8fd0fbd1bb (patch) | |
tree | bfce361e39cb6e7c03cc8759c15447b5b1d8a132 /distrib/hp300/ramdisk/install.md | |
parent | db1478165da4ca45be1a7da078523643ec3f0035 (diff) |
Getting there...
Diffstat (limited to 'distrib/hp300/ramdisk/install.md')
-rw-r--r-- | distrib/hp300/ramdisk/install.md | 551 |
1 files changed, 401 insertions, 150 deletions
diff --git a/distrib/hp300/ramdisk/install.md b/distrib/hp300/ramdisk/install.md index 10b6e98b8d2..2cfec5a84bb 100644 --- a/distrib/hp300/ramdisk/install.md +++ b/distrib/hp300/ramdisk/install.md @@ -1,4 +1,7 @@ -# $OpenBSD: install.md,v 1.1 1997/02/16 18:20:03 downsj Exp $ +#!/bin/sh +# +# $OpenBSD: install.md,v 1.2 1997/02/16 19:32:35 downsj Exp $ +# $NetBSD: install.md,v 1.1.2.4 1996/08/26 15:45:14 gwr Exp $ # # Copyright (c) 1996 The NetBSD Foundation, Inc. # All rights reserved. @@ -36,231 +39,479 @@ # # -# machine dependent section of installation/upgrade script. -# +# machine dependent section of installation/upgrade script # -TMPWRITEABLE=/tmp/writeable -KERNFSMOUNTED=/tmp/kernfsmounted - -md_copy_kernel() { - echo "This must be done later by hand" -} +# Machine-dependent install sets +MDSETS="" md_set_term() { if [ ! -z "$TERM" ]; then return fi - echo -n "Specify terminal type [xterm]: " - getresp "xterm" + echo -n "Specify terminal type [hp300h]: " + getresp "hp300h" TERM="$resp" export TERM + # XXX call tset? } -md_get_diskdevs() { - egrep "^sd[0-9] " < /kern/msgbuf +md_makerootwritable() { + # Was: do_mfs_mount "/tmp" "2048" + # /tmp is the mount point + # 2048 is the size in DEV_BIZE blocks + + umount /tmp > /dev/null 2>&1 + if ! mount_mfs -s 2048 swap /tmp ; then + cat << \__mfs_failed_1 + +FATAL ERROR: Can't mount the memory filesystem. + +__mfs_failed_1 + exit + fi + + # Bleh. Give mount_mfs a chance to DTRT. + sleep 2 } -md_get_cddevs() { - egrep "^cd[0-9] " < /kern/msgbuf +md_get_diskdevs() { + # return available disk devices + dmesg | grep "^rd[0-9]*:." | cut -d":" -f1 | sort -u + dmesg | grep "^sd[0-9]*:.*cylinders" | cut -d":" -f1 | sort -u } -md_get_ifdevs() { - # return available network devices - egrep "(^ie[0-9] )|(^le[0-9] )"< /kern/msgbuf | cut -d" " -f1 | sort -u +md_get_cddevs() { + # return available CD-ROM devices + dmesg | grep "sd[0-9]*:.*CD-ROM" | cut -d":" -f1 | sort -u } -md_get_partition_range() { - # return range of valid partition letters - echo "[a-p]" +md_get_ifdevs() { + # return available network interfaces + dmesg | grep "^le[0-9]*:" | cut -d":" -f1 | sort -u } md_installboot() { - echo "Nothing to do." -} -md_labeldisk() { - echo "huh" -} + # $1 is the root disk + echo -n "Installing boot block..." + disklabel -W ${1} + disklabel -B ${1} + echo "done." +} md_checkfordisklabel() { # $1 is the disk to check - local rval - disklabel $1 >> /dev/null 2> /tmp/checkfordisklabel + disklabel -r $1 > /dev/null 2> /tmp/checkfordisklabel if grep "no disk label" /tmp/checkfordisklabel; then - rval=1 + rval="1" elif grep "disk label corrupted" /tmp/checkfordisklabel; then - rval=2 + rval="2" else - rval=0 + rval="0" fi rm -f /tmp/checkfordisklabel - return $rval } -md_prep_disklabel() -{ - local _disk - - _disk=$1 - md_checkfordisklabel $_disk - case $? in - 0) - echo -n "Do you wish to edit the disklabel on $_disk? [y] " - ;; - 1) - echo "WARNING: Disk $_disk has no label" - echo -n "Do you want to create one with the disklabel editor? [y] " - ;; - 2) - echo "WARNING: Label on disk $_disk is corrupted" - echo -n "Do you want to try and repair the damage using the disklabel editor? [y] " - ;; - esac +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*) ;; - *) return ;; + y*|Y*) + (echo ""; dmesg; echo "") | more + ;; + + *) + ;; esac - # display example - cat << \__md_prep_disklabel_1 + 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 -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). + 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 "" -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. + disklabel -W ${1} + if ! disklabel -e /dev/r${1}a; then + echo "" + echo "ERROR: can't fixup geometry!" + rval="1" + return + fi -[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] + cat << \__explain_motives_2 -__md_prep_disklabel_1 - echo -n "Press [Enter] to continue " +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 "" - disklabel -W ${_disk} - disklabel -e ${_disk} + + rval="0" + return } -md_welcome_banner() { -{ - if [ "$MODE" = "install" ]; then +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 "Welcome to the OpenBSD/hp300 ${VERSION} installation program." - cat << \__welcome_banner_1 + echo "ERROR: $1 doesn't appear to exist?!" + rval="1" + return + fi -This program is designed to help you put OpenBSD on your 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. -__welcome_banner_1 + # 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 - else + # 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 "Welcome to the OpenBSD/hp300 ${VERSION} upgrade program." - cat << \__welcome_banner_2 + 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 -This program is designed to help you upgrade your OpenBSD system in a -simple and rational way. + rval="0" + return +} -As a reminder, installing the `etc' binary set is NOT recommended. -Once the rest of your system has been upgraded, you should manually -merge any changes to files in the `etc' set into those files which -already exist on your system. -__welcome_banner_2 - fi +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 +} + +md_prep_disklabel() { + # $1 is the root disk + + # Make sure there's a disklabel there. If there isn't, puke after + # disklabel prints the error message. + md_checkfordisklabel $1 + case "$resp" in + 1) + cat << \__md_prep_disklabel_1 + +FATAL ERROR: There is no disklabel present on the root disk! You must +label the disk with SYS_INST before continuing. + +__md_prep_disklabel_1 + exit + ;; + + 2) + cat << \__md_prep_disklabel_2 + +FATAL ERROR: The disklabel on the root disk is corrupted! You must +re-label the disk with SYS_INST before continuing. + +__md_prep_disklabel_2 + exit + ;; + + *) + ;; + esac + + # Give the user the opportinuty to edit the root disklabel. + cat << \__md_prep_disklabel_3 + +You have already placed a disklabel onto the target root disk. +However, due to the limitations of the standalone program used +you may want to edit that label to change partition type information. +You will be given the opporunity to do that now. Note that you may +not change the size or location of any presently open partition. + +__md_prep_disklabel_3 + echo -n "Do you wish to edit the root disklabel? [y] " + getresp "y" + case "$resp" in + y*|Y*) + disklabel -W $1 + disklabel -e $1 + ;; + + *) + ;; + esac + + cat << \__md_prep_disklabel_4 -cat << \__welcome_banner_3 +You will now be given the opportunity to place disklabels on any additional +disks on your system. +__md_prep_disklabel_4 -As with anything which modifies your disk's contents, this + _DKDEVS=`rmel ${ROOTDISK} ${_DKDEVS}` + resp="X" # force at least one iteration + while [ "X$resp" != X"done" ]; do + labelmoredisks + done +} + +md_copy_kernel() { + echo -n "Copying kernel..." + cp -p /netbsd /mnt/netbsd + echo "done." +} + + # 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 OpenBSD/hp300 ${VERSION} installation program." + cat << \__welcome_banner_1 + +This program is designed to help you install OpenBSD 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 data is backed up before beginning the +to make sure your hard drive is backed up before beginning the installation process. -Default answers are displayed in brackets after the questions. +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_3 -} | more +__welcome_banner_1 +) | more } md_not_going_to_install() { - cat << \__not_going_to_install_1 + cat << \__not_going_to_install_1 -OK, then. Enter `halt' at the prompt to halt the machine. Once the +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() { - local what; - if [ "$MODE" = "install" ]; then - what="installed"; - else - what="upgraded"; - fi - cat << __congratulations_1 + cat << \__congratulations_1 -CONGRATULATIONS! You have successfully $what OpenBSD! -To boot the installed system, enter halt at the command prompt. Once the -system has halted, reset the machine and boot from the disk. +CONGRATULATIONS! You have successfully installed OpenBSD! 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 } md_native_fstype() { + # Nothing to do. } -md_makerootwritable() { - - if [ -e ${TMPWRITEABLE} ] - then - md_mountkernfs - return - fi - umount /tmp >> /dev/null 2>&1 - if ! mount -t ffs -u /dev/rd0a / ; then - cat << \__rd0_failed_1 - -FATAL ERROR: Can't mount the ram filesystem. - -__rd0_failed_1 - exit - fi - - # Bleh. Give mount_mfs a chance to DTRT. - sleep 2 - > ${TMPWRITEABLE} - - md_mountkernfs -} -md_mountkernfs() { - if [ -e ${KERNFSMOUNTED} ] - then - return - fi - if ! mount -t kernfs /kern /kern - then - cat << \__kernfs_failed_1 -FATAL ERROR: Can't mount kernfs filesystem -__kernfs_failed_1 - exit - fi - > ${KERNFSMOUNTED} +md_native_fsopts() { + # Nothing to do. } |