.\" $NetBSD: diskless.8,v 1.34 2018/10/29 21:04:18 wiz Exp $
.\"
.\" Copyright (c) 1994 Gordon W. Ross, Theo de Raadt
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 3. The name of the author may not be used to endorse or promote products
.\" derived from this software without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd October 23, 2018
.Dt DISKLESS 8
.Os
.Sh NAME
.Nm diskless
.Nd booting a system over the network
.Sh DESCRIPTION
The ability to boot a system over the network is useful for
two kinds of systems:
.Bl -tag -width diskless
.It Em diskless
a system with no attached mass storage media to boot or run from
.Pq e.g. a network computer .
.It Em dataless
a system with a hard drive that only contains system and application
software, and user data is mounted over the network from a central server.
.El
.Pp
It can also be done as a temporary measure while repairing or
re-installing file systems on a local disk.
This capability is necessarily platform dependent because of its
dependence on system firmware support; not all platforms supported by
.Nx
are capable of being network booted.
.Pp
The protocols used to obtain a network address
.Pq e.g. an Tn \&IP host address ,
include, but are not limited to:
.Pp
.Bl -tag -width BOOTP -offset indent -compact
.It Tn RARP
Reverse Address Resolution Protocol
.Pq Tn ARP
.It Tn DHCP
Dynamic Host Configuration Protocol
.It Tn BOOTP
Bootstrap Protocol
.El
.Pp
This information can also be derived from non-volatile
.Tn RAM
or by a transform of a network interface
.Pq e.g. Tn Ethernet
.Tn MAC
address.
.Pp
The protocols used to load a
.Nx
kernel over a network include, but are not limited to:
.Pp
.Bl -tag -width TFTP -offset indent -compact
.It Tn TFTP
Trivial File Transfer Protocol
.It Tn NFS
.Tn Sun
Network File System
.It Tn RMP
.Tn \&HP
Remote Maintenance Protocol
.It Tn MOP
.Tn DEC
Maintenance Operations Protocol
.El
.Pp
Derivation of the filename of the secondary bootstrap program can
be done by a transform of a network interface
.Tn MAC
address
.Pq or other protocol address ,
or provided by a server as with
.Tn BOOTP ,
and
.Tn DHCP .
How this is done is platform dependent; see
.Xr boot 8 .
.Pp
The
.Nx
kernel doesn't care how it gets loaded and started.
The protocols used to boot
.Nx
can be completely different than the ones that
.Nx
uses operationally, i.e. you can netboot the system using
.Tn \&HP
.Tn RMP
and the
.Nx
kernel can use
.Tn \&IP
to communicate after bootstrap.
.Pp
There is no standard way to pass all the required information
from a boot loader to an operating system kernel, so the
.Nx
kernel usually has to recapitulate the same
.Pq or similar
protocol exchanges over the network to obtain a network address,
determine which servers to use, and so on.
.Nx
supports obtaining this information from
.Tn RARP ,
.Tn BOOTP ,
.Tn DHCP ,
and
.Tn Sun RPC
.Qq bootparams .
See
.Xr options 4
for a list of methods that can be compiled into a
.Nx
kernel.
.Pp
.Nx
only supports the
.Tn Sun
Network File System
.Pq Tn NFS
for mounting its root file system over a network.
.Nx
can use any local mass storage device for which it has a driver,
after bootstrap, even if that device is not supported by the system's
firmware for booting.
.Pp
.Sy N.B.
.Tn DHCP
is essentially a series of extensions to
.Tn BOOTP ;
the
.Nx
.Xr dhcpd 8
is capable of responding to both kinds of protocol requests.
.Pp
In the majority of configurations, network boot servers and clients
are attached to the same
.Tn LAN
so that broadcast queries from the clients can be heard by the servers.
Unless specially configured, routers block broadcasts from propagating from
.Tn LAN
to
.Tn LAN ;
some routers can be configured to
.Qq forward
broadcast
.Tn BOOTP
packets to another
.Tn LAN
attached to that router, which permits a server on that remote
.Tn LAN
to respond to the client's broadcast query.
.Sh OPERATION
When booting a system over the network, there are three
phases of interaction between client and server:
.Pp
.Bl -enum -compact
.It
The system firmware
.Pq or stage-1 bootstrap
loads a boot program.
.It
The boot program loads a
.Nx
kernel.
.It
The
.Nx
kernel performs an
.Tn NFS
mount of the root file system.
.El
.Pp
Each of these phases are described in further detail below.
.Ss 1. loading a boot program
In phase 1, the system firmware loads a boot program.
Firmware designs vary widely,
so this phase is inherently machine-specific.
Some examples:
.Pp
.Tn DEC
Alpha systems use
.Tn BOOTP
to determine the client's
.Tn \&IP
address and then use
.Tn TFTP
load a secondary bootstrap program from the server and filename
specified in the
.Tn BOOTP
reply.
.Tn DEC
Alpha systems can also use
.Tn MOP
to load a program to run the system.
.Pp
.Tn Sun
systems use
.Tn RARP
to determine the client's
.Tn \&IP
address, transform that address to a hexadecimal string to form
the filename of the secondary boot program, and then use
.Tn TFTP
to download the boot program from the server that sent the
.Tn RARP
reply.
.Pp
.Tn \&HP
300-series systems use the
.Tn \&HP
.Tn RMP
to download a boot program.
.Pp
Typical personal computers may load a network boot program either
from diskette or from a
.Tn PROM
on a Network Interface Card
.Pq Tn NIC .
Some
.Tn BIOS Ns No \&es
support booting from a network interface.
.Ss 2. loading a kernel
In phase 2, the secondary boot program loads a kernel.
Operation in this phase depends on the design of the boot program
.Po
the design described here is the one used by
.Tn Sun
and
.Nx Ns Tn /hp300
.Pc .
The boot program:
.Pp
.Bl -enum -compact
.It
gets the client
.Tn \&IP
address using
.Tn RARP .
.It
gets the client name and server
.Tn \&IP
address by broadcasting an
.Tn RPC / BOOTPARAMS / WHOAMI
request with the client
.Tn \&IP
address.
.It
gets the server path for this client's
root using an
.Tn RPC / BOOTPARAMS / GETFILE
request with the client name.
.It
gets the root file handle by calling
.Xr mountd 8
with the server path for the client root file system.
.It
gets the kernel file handle by calling
.Tn NFS
.Fn lookup
on the root file handle.
.It
loads the kernel using
.Tn NFS
read calls on the kernel file handle.
.It
transfers control to the kernel entry point.
.El
.Pp
A
.Tn BOOTP
and/or
.Tn DHCP
secondary bootstrap program will do the following:
.Pp
.Bl -enum -compact
.It
query for the client's bootstrap parameters.
The response must include the client's
.Tn \&IP
address, and a
.Tn TFTP
server to load the
.Nx
kernel from.
.It
loads the
.Nx
kernel from the
.Tn TFTP
server.
.It
transfers control to the kernel entry point.
.El
.Ss 3. NFS mounting the root file system
In phase 3, the kernel performs an
.Tn NFS
mount of the root file system.
The kernel repeats much of the work done by the boot program
because there is no standard way for the boot program to pass
the information it gathered on to the kernel.
.Pp
In general, the GENERIC kernel
.Xr config 1
file for any particular architecture will specify compile-time
options to use the same protocol used by the secondary boot program
for that architecture.
A
.Nx
kernel can be compiled to use any of
.Tn BOOTP ,
.Tn DHCP ,
or
.Tn Sun RPC BOOTPARAMS ;
see
.Xr options 4 .
.Pp
The procedure typically used by the kernel is as follows:
.Pp
.Bl -enum -compact
.It
The kernel finds a boot server using the same procedures
as described above to determine the client's
.Tn \&IP
address, an
.Tn NFS
server, etc.
.It
The kernel gets the
.Tn NFS
file handle for root using the same procedure as described above.
.It
The kernel calls the
.Tn NFS
.Fn getattr
function to get the last-modified time of the root
directory, and uses it to check the system clock.
.El
.Sh SERVER CONFIGURATION
Before a client can bootstrap over the network,
its server must be configured.
Each daemon that implements these protocols must be set up so
that it can answer queries from the clients.
Some of these daemons are invoked as packets come in, by
.Xr inetd 8 ,
and some must run independently, started from
.Pa /etc/rc ;
see
.Xr rc.conf 5 .
.Bl -column "Protocol" "rpc.bootparamd" "inetd.conf(5)" -offset indent
.It Sy Protocol Ta Sy Program Ta Sy Startup
.It RARP Ta rarpd Ta Xr rc.conf 5
.It DHCP Ta dhcpd Ta Xr rc.conf 5
.It BOOTP Ta bootpd Ta Xr inetd.conf 5
.It TFTP Ta tftpd Ta Xr inetd.conf 5
.It Sun RPC Ta rpcbind Ta Xr rc.conf 5
.It Sun RPC Ta rpc.bootparamd Ta Xr rc.conf 5
.It Sun NFS Ta mountd Ta Xr rc.conf 5
.It Sun NFS Ta nfsiod Ta Xr rc.conf 5
.It \&HP RMP Ta rbootd Ta Xr rc.conf 5
.El
.Pp
.Sy N.B.
.Tn DHCP
is essentially a series of extensions to
.Tn BOOTP ;
the
.Nx
.Xr dhcpd 8
is capable of responding to both kinds of protocol requests.
Since they both bind to the same
.Tn UDP
port, only one may be run on a given server.
.Pp
In the following examples, the client's hostname is
.Sy myclient ;
the server is
.Sy myserver ,
and the addresses are all fictional.
In these examples
the hostnames may be Fully Qualified Domain Names
.Pq FQDN, e.g. Qq myclient.mydomain.com
provided that they are used consistently.
.Ss RARP
For clients that use
.Tn RARP
to obtain their
.Tn \&IP
address,
an entry must be added for each client to
.Pa /etc/ethers
with the client's
.Tn Ethernet
.Tn MAC
address and Internet hostname:
.Pp
.Bd -literal -offset indent -compact
8:0:20:7:c5:c7 myclient
.Ed
.Pp
This will be used by
.Xr rarpd 8
to reply to queries from the clients.
There must be one entry per client system.
.Pp
A client system's
.Tn Ethernet
.Tn MAC
address is often printed on the system case, or on a chip on its
motherboard, or on the
.Tn NIC .
If not,
.Qq sniffing
the network with
.Xr tcpdump 8
when the client is powered-on should reveal its
.Tn Ethernet
.Tn MAC
address.
.Pp
Each client system that uses
.Tn RARP
must have its own, unique
.Tn \&IP
address assigned to it.
Assign an
.Tn \&IP
address for myclient in your
.Pa /etc/hosts
file, or in the master file for your
.Tn DNS
zone.
For
.Pa /etc/hosts
the entry should look like:
.Pp
.Bd -literal -offset indent -compact
192.197.96.12 myclient
.Ed
.Ss DHCP/BOOTP
The
.Nx
.Tn DHCP
server
.Xr dhcpd 8
was developed by the Internet Software Consortium
.Pq Lk http://www.isc.org/ "ISC" .
.Pp
.Tn DHCP
can provide a wide range of information to a requesting client;
the key data for bootstrapping a diskless client are:
.Pp
.Bl -enum -compact
.It
an
.Tn \&IP
address
.It
a subnet mask
.It
a
.Tn TFTP
server address for loading the secondary bootstrap and the
.Nx
kernel
.It
a filename of the secondary bootstrap
.It
an
.Tn NFS
server address for the client's file system
.It
the client's root file system path, to be
.Tn NFS
mounted.
.El
.Pp
An example for
.Pa /etc/dhcpd.conf
.Bd -literal -offset indent
host myclient {
hardware ethernet 8:0:20:7:c5:c7;
fixed-address myclient; # client's assigned IP address
filename "myclient.netboot"; # secondary bootstrap
next-server myserver; # TFTP server for secondary bootstrap
option swap-server myserver; # NFS server for root filesystem
option root-path "/export/myclient/root";
}
.Ed
.Pp
That
.Sy host
declaration goes inside a
.Sy subnet
declaration, which gives parameters for all hosts on the subnet
that will be using
.Tn DHCP ,
such as the
.Qq routers
.Pq the default route ,
.Qq subnet-mask ,
.Qq broadcast-address ,
.Qq domain-name-servers ,
etc.
See
.Xr dhcpd.conf 5
for details.
In that example,
.Sy myclient
has an assigned IP address.
.Pp
The
.Tn DHCP
parameters required for network bootstrapping a system will vary
from platform to platform, as dictated by each system's firmware.
In particular, because the
.Tn DHCP
is extensible, some hardware vendors have specified
.Tn DHCP
options to return information to requesting clients that are specific
to that platform.
Please see your platform's
.Xr boot 8
for details.
.Ss TFTP
If booting a
.Tn Sun
system, or other system that expects to use
.Tn TFTP ,
ensure that
.Xr inetd 8
is configured to run
.Xr tftpd 8 .
The
.Xr tftpd 8
server should be set up to serve the directory
.Pa /tftpboot .
.Pp
If booting a
.Tn SPARC
system, install a copy of the appropriate diskless secondary boot
loader
.Po
such as
.Pa /usr/mdec/boot
or
.Pa ofwboot.net
.Pc
in the
.Pa /tftpboot
directory.
Make a link such that the boot program is
accessible by a filename composed of the client's
.Tn \&IP
address in hexadecimal, a dot, and the architecture name
.Pq all upper case .
For example:
.Pp
.Bd -literal -offset indent -compact
# cd /tftpboot
# ln -s boot C0C5600C.SUN4
.Ed
.Pp
For a
.Tn Sun-3
or
.Tn UltraSPARC
system, the filename would be just C0C5600C
.Po
these systems' firmware does not append the architecture name
.Pc .
The name used is architecture dependent, it simply has to match
what the booting client's system firmware wishes to it to be.
.Pp
If the client's system firmware fails to fetch the expected file,
.Xr tcpdump 8
can be used to discover which filename the client is being requested.
Also, examination of
.Xr tftpd 8
log entries
.Po
typically in
.Pa /var/log/messages
.Pc
should show whether the server is hearing the client system, and
what filename the client is asking for.
.Ss HP RMP
If booting an
.Tn HP
300-series system, ensure that
.Pa /etc/rbootd.conf
is configured properly to transfer the boot program to the client.
An entry might look like this:
.Pp
.Bd -literal -offset indent -compact
08:00:09:01:23:E6 SYS_UBOOT # myclient
.Ed
.Pp
The secondary bootstrap program for an
.Tn \&HP
300-series system
.Pa SYS_UBOOT
.Po
which may be called
.Pa uboot.lif
before installation
.Pc
must be installed in the directory
.Pa /usr/mdec/rbootd .
.Pp
See the
.Xr rbootd 8
manual page for more information.
.Ss Sun RPC BOOTPARAMS
Add
.Sy myclient
to the bootparams database in
.Pa /etc/bootparams :
.Pp
.Bd -literal -offset indent -compact
myclient root=myserver:/export/myclient/root \\
swap=myserver:/export/myclient/root/swap \\
dump=myserver:/export/myclient/root/swap
.Ed
.Pp
and ensure that
.Xr rpc.bootparamd 8
and
.Xr rpcbind 8
are running.
Both
.Sy myclient
and
.Sy myserver
must have
.Tn \&IP
addresses in the
.Tn DNS
or
.Pa /etc/hosts .
.Ss Diskless Client File Systems
Build the swap file for
.Sy myclient
on the
.Tn NFS
server:
.Pp
.Bd -literal -offset indent -compact
# cd /export/myclient/root
# dd if=/dev/zero of=swap bs=16k count=1024
.Ed
.Pp
This creates a 16 megabyte swap file.
.Pp
Populate
.Sy myclient Ns No 's
root file system on the
.Tn NFS
server.
How this is done depends on the client architecture and the version
of the
.Nx
distribution.
It can be as simple as copying and modifying the server's root
file system, or unpack a complete
.Nx
binary distribution for the appropriate platform.
.Pp
If the
.Tn NFS
server is going to support multiple different architectures
.Po
e.g.
.Tn Alpha ,
.Tn PowerPC ,
.Tn SPARC ,
.Tn MIPS
.Pc ,
then it is important to think carefully about how to lay out the
.Tn NFS
server's exported file systems, to share what can be shared
.Pq e.g. text files, configuration files, user home directories ,
and separate that which is distinct to each architecture
.Pq e.g. binary executables, libraries .
.Ss NFS
Export the client-populated file systems on the
.Tn NFS
server in
.Pa /etc/exports :
.Pp
.Bd -literal -offset indent -compact
/usr -ro myclient
# for SunOS:
# /export/myclient -rw=myclient,root=myclient
# for NetBSD:
/export/myclient -maproot=root -alldirs myclient
.Ed
.Pp
If the server and client are of the same architecture, then the client
can share the server's
.Pa /usr
file system
.Pq as is done above .
If not, you must build a properly fleshed out
.Pa /usr
partition for the client in some other part of the server's
file system, to serve to the client.
.Pp
If your server is a
.Tn SPARC ,
and your client a
.Tn Sun-3 ,
you might create and fill
.Pa /export/usr.sun3
and then use the following
.Pa /etc/exports
lines:
.Pp
.Bd -literal -offset indent -compact
/export/usr.sun3 -ro myclient
/export/myclient -rw=myclient,root=myclient
.Ed
.Pp
Of course, in either case you will have to have an
.Tn NFS
server running on the server side.
.Sh CLIENT CONFIGURATION
Copy and customize at least the following files in
.Pa /export/myclient/root :
.Pp
.Bd -literal -offset indent -compact
# cd /export/myclient/root/etc
# vi fstab
# cp /etc/hosts hosts
# echo 'hostname="myclient"' >> rc.conf
# echo "inet 192.197.96.12" > ifconfig.le0
.Ed
.Pp
Note that "le0" above should be replaced with the name of
the network interface that the client will use for booting;
the network interface name is device dependent in
.Nx .
.Pp
Correct the critical mount points and the swap file in the client's
.Pa /etc/fstab
.Po
which will be
.Pa /export/myclient/root/etc/fstab
.Pc
i.e.
.Pp
.Bd -literal -offset indent -compact
myserver:/export/myclient/root / nfs rw 0 0
myserver:/usr /usr nfs rw 0 0
/swap none swap sw 0 0
.Ed
.Pp
Note, you
.Em must
specify the swap file in
.Pa /etc/fstab
or it will not be used!
See
.Xr swapctl 8 .
.Pp
It may be useful to set
.Dq flushroutes=NO
in
.Pa /etc/rc.conf
to avoid the default route supplied by the boot setup
disappearing mid-boot.
.Sh FILES
.Bl -tag -width /usr/mdec/rbootd -compact
.It Pa /etc/hosts
table of associated
.Tn \&IP
addresses and
.Tn \&IP
host names; see
.Xr hosts 5
.It Pa /etc/ethers
table of associated
.Tn Ethernet
.Tn MAC
addresses and
.Tn \&IP
host names used by
.Xr rarpd 8 ;
see
.Xr ethers 5
.It Pa /etc/bootparams
client root pathname and swap pathname; see
.Xr bootparams 5
.It Pa /etc/exports
exported
.Tn NFS
mount points; see
.Xr exports 5
.It Pa /etc/rbootd.conf
configuration file for
.Tn \&HP RMP ;
see
.Xr rbootd 8
.It Pa /usr/mdec/rbootd
location of boot programs offered by
.Xr rbootd 8
.It Pa /tftpboot
location of boot programs offered by
.Xr tftpd 8
.El
.Sh SEE ALSO
.Xr bootparams 5 ,
.Xr dhcpd.conf 5 ,
.Xr ethers 5 ,
.Xr exports 5 ,
.Xr fstab 5 ,
.Xr hosts 5 ,
.Xr networks 5 ,
.Xr boot 8 ,
.Xr dhcpd 8 ,
.Xr mopd 8 ,
.Xr mountd 8 ,
.Xr nfsd 8 ,
.Xr rarpd 8 ,
.Xr rbootd 8 ,
.Xr reboot 8 ,
.Xr rpc.bootparamd 8 ,
.Xr tftpd 8
.Rs
.%R RFC
.%N 903
.%D June 1984
.%T "Reverse Address Resolution Protocol"
.Re
.Rs
.%R RFC
.%N 906
.%D June 1984
.%T "Bootstrap Loading using TFTP"
.Re
.Rs
.%R RFC
.%N 951
.%D September 1985
.%T "Bootstrap Protocol"
.Re
.Rs
.%R RFC
.%N 1350
.%D July 1992
.%T "The TFTP Protocol (Revision 2)"
.Re
.Rs
.%R RFC
.%N 2131
.%D March 1997
.%T "Dynamic Host Configuration Protocol"
.Re
.Rs
.%R RFC
.%N 2132
.%D March 1997
.%T "DHCP Options and BOOTP Vendor Extensions"
.Re
.Pp
.Lk http://www.rfc-editor.org/ "RFC Editor"