dnl	$OpenBSD: install,v 1.36 2009/06/28 13:37:41 sthen Exp $

There are several ways to install OpenBSD onto a disk. The easiest way
in terms of preliminary setup is to use the OpenBSD ramdisk kernel that can
be booted from tape.

Alternatively, if the MACHINE is hooked up to a network, it is possible
to set up another machine as a server for diskless setup, which is a
convenient way to install on a machine whose disk does not currently
hold a usable operating system.
This is difficult to get set up correctly the first time, but easy to
use afterwards.  (See ``Installing using a diskless setup'' below).

Booting from the Installation Media:

Prior to attempting an installation, everything of value on the target
system should be backed up.  While installing OpenBSD does not necessarily
wipe out all the partitions on the hard disk, errors during the install
process can have unforeseen consequences and will probably leave the system
unbootable if the installation process is not completed. Availability
of the installation media for the prior installation, such as a Motorola
SystemV/MACHINE tape is always a good insurance, should it be necessary
to "go back" for some reason.

After taking care of all that, the system should be brought down gracefully
using the shutdown(8) and/or halt(8) commands, which will eventually go
back to the ``BUG>'' prompt (it may be necessary to send a break if the
system is completely halted).

Booting from SCSI tape:

Bootable tapes can be booted with the following command at the prompt:

    167-Bug> BO xx yy

Where `xx' is the SCSI controller number (00 for the built-in SCSI
controller), and `yy' is the encoding for the SCSI device ID, which varies
between controllers.

Most BUG versions can list the available disk and tape controllers, using the
"IOT;H" command:

    I/O Controllers Available:
    CLUN  CNTRL-TYPE  CNTRL-Address  N-Devices
       0  VME167      $FFF47000      *
       6  VME328      $FFFF9000      *

In this example, the built-in controller, as well as an external MVME328
controller, are available.

The encoding for the drive ID is as follows:
- built-in controller and MVME327 SCSI controller:
    'yy' is ten times the device ID.
- MVME328 SCSI controller:
    'yy' is eight times the device ID, written in hexadecimal
- MVME350 tape controller:
    'yy' is always zero, as this controller only supports one tape drive.

MVME147 boards are slightly different, as they only support booting from
the built-in SCSI controller (if present), using the following convention:
- 'xx' is the device ID.
- 'yy' is zero.

MVME141 boards are quite similar to the MVME147, but can boot from various
controller; the IOT;H command will list all the available boot options.
Usually, the boot device numbers will be:
- `xx' is the `Lun' value printed by IOT;H, and is usually the device ID.
- `yy' is the subdevice number, if any.

Thus to boot a MVME141 from a MVME327 controller:
- `xx' is the SCSI device ID.
- `yy' is zero.

For example, booting from a tape drive using SCSI ID #4:
    147-Bug> BO 04 00
for MVME141 and MVME147, and
    167-Bug> BO 00 40
for any other MACHINE board using the built-in controller. However, a tape
drive connected to an MVME328 board using SCSI ID #5, will be booted as:
    167-Bug> BO 06 28

Note that OpenBSD/MACHINE can boot off any tape drive supported by the BUG,
even if its controller is not supported by OpenBSD.

Installing using a diskless setup:

First, a diskless client configuration should be set up on a server. If
the boot server is an OpenBSD system, the diskless(8) manual page will
provide detailed information on the process.

If the server runs another operating system, the setup instructions will
likely be available as part of the documentation that came with it (on
SunOS systems, add_client(8) and the Sun System/Networks administrators
guide constitute a good start; on Solaris systems, share(1M) is a good
starting point as well).

OpenBSD/MACHINE can boot off any network card supported by the BUG, even
if the card itself is not supported by OpenBSD. The list of BUG-supported
network controllers is available with the "NIOT;A" command. For example:

    167-Bug> NIOT;A
    Network Controllers/Nodes Supported
    CLUN  DLUN  Name      Address
       0     0  VME167    $FFF46000
       2     0  VME376    $FFFF1200
       3     0  VME376    $FFFF1400
       4     0  VME376    $FFFF1600
       5     0  VME376    $FFFF5400
       6     0  VME376    $FFFF5600
       7     0  VME376    $FFFFA400
      10     0  VME374    $FF000000
      11     0  VME374    $FF100000
      12     0  VME374    $FF200000
      13     0  VME374    $FF300000
      14     0  VME374    $FF400000
      15     0  VME374    $FF500000

The "NIOT;H" lists only the available controllers in the machine. For
example, if no external network card is present, only the built-in
controller will be reported:

    167-Bug> NIOT;H
    Network Controllers/Nodes Available
    CLUN  DLUN  Name      Address
       0     0  VME167    $FFF46000

If the BUG does not support the NIOT command (most MVME141, MVME147
and MVME165 don't), then it has no support for netbooting, and you'll
have to use S-Records, described later in this document.

Before netbooting, enter "NIOT" and fill the parameters. Be sure to provide
the correct values for Controller LUN and Device LUN (as listed in the
"NIOT;H" output); also the "Boot File Load Address" and "Boot File
Execution Address" need to be set to 006F0000. The "Boot File Name" must
match the name of the netboot file on the server (copying it as
"netboot.mvme68k" is usually a wise choice). Finally, "Argument File Name"
needs to be set to "bsd.rd" in order to boot the installation miniroot,
rather than the regular kernel.

Here are acceptable values for a 167 card using the built-in controller:

    167-Bug> NIOT
    Controller LUN =00? 
    Device LUN     =00? 
    Node Control Memory Address =01FF0000? 
    Client IP Address      = 
    Server IP Address      = 
    Subnet IP Address Mask = 
    Broadcast IP Address   = 
    Gateway IP Address     = 
    Boot File Name ("NULL" for None)     =? netboot.mvme68k
    Argument File Name ("NULL" for None) =? bsd.rd
    Boot File Load Address         =001F0000? 006F0000
    Boot File Execution Address    =001F0000? 006F0000
    Boot File Execution Delay      =00000000? 
    Boot File Length               =00000000? 
    Boot File Byte Offset          =00000000? 
    BOOTP/RARP Request Retry       =00? 
    TFTP/ARP Request Retry         =00? 
    Trace Character Buffer Address =00000000? 
    BOOTP/RARP Request Control: Always/When-Needed (A/W)=W? 
    BOOTP/RARP Reply Update Control: Yes/No (Y/N)       =Y? 

If you change the NIOT configuration, you will be asked whether you want to
make these changes permanent. Do not answer Y unless you plan to netboot
this board very often; be sure to have the ENV settings use a correct
address for the NIOT parameters block in this case. A valid setting is:

    Network Auto Boot Configuration Parameters Pointer (NVRAM) =
        00000000? FFFC0080

for example.

Once the NIOT parameters are set, it should be possible to boot the machine
from the server with the NBO command. However, in some cases, netbooting
will prevent the OpenBSD kernel from probing the built-in SCSI controller
(if any) properly, so it is recommended to do a disk probe first:

    167-Bug> IOI;C
    167-Bug> IOI

This can take up to a couple of minutes, depending on how many SCSI
controllers are found in the machine. Once the BUG prompt is back, you can
safely netboot:
    167-Bug> NBO 00 00

or if you know the IP address for the MACHINE and the diskless server,
you can directly provide the boot loader's filename and the kernel name
on the commandline:

     167-Bug> NBO 00 00 netboot.mvme68k bsd.rd

where, in this example, is the address of the MACHINE computer,
and the address of the diskless server.

If the BUG version does not understand the NIOT and NBO commands (most
MVME141, MVME147 and MVME165 don't), the alternative is to boot from

Booting from S-Records:

First, a diskless client configuration should be set up on a server. Refer
to the short description above for details.

Second, using a terminal emulator able to read files from the local machine
and send their contents over the serial link, such as cu(1) and tip(1) - both
being available on OpenBSD - the MACHINE workstation should be put in
S-Records receive mode, with the LO command at the BUG prompt:

    147-Diag> LO

If this command prints an error message and returns to the BUG prompt
immediately, it might be necessary to switch directories, using the SD
command (the prompt will change from 147-Bug to 147-Diag), before retrying.

Then, the contents of the ``sboot'' file should be sent from the terminal
emulator. Depending on the speed of the serial link, this will take some
time, but no more than a couple of minutes.

If a prompt does not come back after a few minutes, it is likely that the
S-Records download is hosed. In this case, the MACHINE board should be reset
before a further attempt to download the S-Records is made.

Once the transfer is finished, entering GO at the BUG prompt will start the
S-Records boot loader. This is a very crude bootloader which will attempt
to fetch a secondary boot program via TFTP requests, like the NBO command.

This will cause the kernel provided by the diskless setup to be booted.
After the initial probe messages you'll be asked to start the install
or upgrade procedure.

Installing using the tape or netboot procedure:


	Boot your machine from the installation media as described above.

	It will take a while to load the kernel especially from a slow
	network connection, most likely more than a minute.  If some action
	doesn't eventually happen, or the spinning cursor has stopped and
	nothing further has happened, either your boot media is bad, your
	diskless setup isn't correct, or you may have a hardware or
	configuration problem.




OpenBSDInstallPart6({:-CD-ROM, NFS, -:})



OpenBSDDISKInstall(,{:-only -:})





Net Boot or Diskless Setup Information:

The set up is similar to SunOS diskless setup, but not identical, because
the Sun setup assumes that the bootblocks load a kernel image, which then
uses NFS to access the exported root partition, while the OpenBSD bootblocks
use internal NFS routines to load the kernel image directly from the
exported root partition.

Please understand that no one gets this right the first try, since
there is a lot of setup and all the host daemons must be running and
configured correctly.  If you have problems, extract the diskless(8)
manpage, find someone who's been through it before and use the host
syslog and tcpdump(8) to get visibility of what's happening (or not).

Your MACHINE expects to be able to download a second stage bootstrap
program via TFTP after having acquired its IP address through RevARP when
instructed to boot "over the net". If you are booting from S-Records, 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 MACHINE
board which has been assigned IP address will make a TFTP
request for `8273900B.MACHINE'); if you are booting from the NBO command,
you can specify the filename which will be looked for.

Normally, this file is a 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/netboot' in the OpenBSD/MACHINE

After the boot program has been loaded into memory and given control by
the BUG, it starts locating the machine's remote root directory through
the BOOTPARAM protocol. First a BOOTPARAM WHOAMI request is broadcast
on the local net. The answer to this request (if it comes in) contains
the client's name. This name is used in the next step, a BOOTPARAM GETFILE
request -- sent to the server that responded to the WHOAMI request --
requesting the name and address of the machine that will serve the client's
root directory, as well as the path of the client's root on that server.

Finally, this information (if it comes in) is used to issue a REMOTE MOUNT
request to the client's root filesystem server, asking for an NFS file
handle corresponding to the root filesystem. If successful, the boot
program starts reading from the remote root filesystem in search of the
kernel which is then read into memory.

Unpack `base{:--:}OSrev.tgz' and `etc{:--:}OSrev.tgz' on the server in the root directory
for your target machine. If you elect to use a separately NFS-mounted
filesystem for `/usr' with your diskless setup, make sure the "./usr" base
files in base{:--:}OSrev.tgz end up in the correct location. One way to do this is
to temporarily use a loopback mount on the server, re-routing <root>/usr to
your server's exported OpenBSD "/usr" directory. Also put the kernel and
the install/upgrade scripts into the root directory.

A few configuration files need to be edited:

		Add the IP addresses of both server and client.

		This files contains the client's hostname; use the same
		name as in <root>/etc/hosts.

		Enter the entries for the remotely mounted filesystems.
		For example:
			server:/export/root/client       /     nfs  rw 0 0
			server:/export/exec/MACHINE.OpenBSD /usr  nfs  rw 0 0