1# $FreeBSD: src/share/examples/diskless/README.BOOTP,v 1.2.4.1 2002/02/12 17:43:11 luigi Exp $
2# Notes on diskless boot.
3
4IMPORTANT NOTE:
5
6For quite some time
7the /etc/rc.d/{initdiskless,diskless} scripts support a slightly different
8diskless boot process than the one documented in the rest of this file.
9
10I am not deleting the information below because it contains some
11useful background information on diskless operation, but for the
12actual details you should look at diskless(8), /etc/rc.d/initdiskless,
13/etc/rc.d/diskless,
14and the /usr/share/examples/diskless/clone_root script which can
15be useful to set up clients and server for diskless boot.
16
17-----------------------------------------------------------------------
18
19		        BOOTP configuration mechanism
20
21			    Matthew Dillon
22			    dillon@backplane.com
23
24    BOOTP kernels automatically configure the machine's IP address, netmask,
25    optional NFS based swap, and NFS based root mount.  The NFS server will
26    typically export a shared read-only /, /usr, and /var to any number of
27    workstations.  The shared read-only root is typically either the server's
28    own root or, if you are more security concious, a contrived root.
29
30    The key issue with starting up a BOOTP kernel is that you typically want
31    to export read-only NFS partitions from the server, yet still be able to
32    customize each workstation ( or not ).
33
34    /etc/rc.diskless1 is responsible for doing core mounts and for retargeting
35    /conf/ME ( part of the read-only root NFS mount ) to /conf/$IP_OF_CLIENT.
36    /etc/rc.conf.local and /etc/rc.local, along with other machine-specific
37    configuration files, are typically softlinks to /conf/ME/<filename>.
38
39    In the BOOTP workstation /conf/$IP/rc.conf.local, you must typically
40    turn *OFF* most of the system option defaults in /etc/rc.conf as well
41    as do additional custom configuration of your environment
42
43    The /usr/src/share/examples/diskless directory contains a typical
44    X session / sshd based workstation configuration.  The directories
45    involved are HT.DISKLESS/ and 192.157.86.12/.
46
47    Essentially, the $IP/ directory ( which rc.diskless looks for in
48    /conf/$IP/ ) contains all the junk.  The HT.DISKLESS directory exists
49    to hold common elements of your custom configuration so you do not have
50    to repeat those elements for each workstation.  The example /conf
51    structure included here shows how to create a working sshd setup ( so
52    you can sshd into the diskless workstation ), retarget xdm's pid and error
53    files to R+W directories if /usr is mounted read-only, and retarget
54    syslogd and other programs.  This example is not designed to run out of
55    the box and some modifications are required.
56
57    >> NOTE <<  HT.DISKLESS/ttys contains the typical configuration required
58    to bring X up at boot time.  Essentially, it runs xdm in the foreground
59    with the appropriate arguments rather then a getty on ttyv0.  You must
60    run xdm on ttyv0 in order to prevent xdm racing with getty on a virtual
61    terminal.  Such a race can cause your keyboard to be directed away from
62    the X session, essentially making the session unusable.
63
64    Typically you should start with a clean slate by tar-copying this example
65    directory to /conf and then hack on it in /conf rather then in
66    /usr/share/examples/diskless.
67
68				BOOTP CLIENT SETUP
69
70    Here is a typical kernel configuration.  If you have only one ethernet
71    interface you do not need to wire BOOTP to a specific interface name.
72    BOOTP requires NFS and NFS_ROOT, and our boot scripts require MFS.  If
73    your /tmp is *not* a softlink to /var/tmp, the scripts also require NULLFS
74
75# BootP
76#
77options         BOOTP           # Use BOOTP to obtain IP address/hostname
78options         BOOTP_NFSROOT   # NFS mount root filesystem using BOOTP info
79options         "BOOTP_NFSV3"   # Use NFS v3 to NFS mount rootoptions
80options         BOOTP_COMPAT    # Workaround for broken bootp daemons.
81#options         "BOOTP_WIRED_TO=de0"
82
83options         MFS                     # Memory File System
84options         NFS                     # Network Filesystem
85options         NFS_ROOT		# Nfs can be root
86options		NULLFS			# nullfs to map /var/tmp to /tmp
87
88				BOOTP SERVER SETUP
89
90    The BOOTP server must be running on the same logical LAN as the
91    BOOTP client(s).  You need to setup two things:
92
93    (1) You need to NFS-export /, /usr, and /var.
94
95    (2) You need to run a BOOTP server.  DHCPD can do this.
96
97
98    NFS Export:
99
100	Here is an example "/etc/exports" file.
101
102/ -ro -maproot=root: -network 192.157.86.0 -mask 255.255.255.192
103/usr -ro -maproot=root: -network 192.157.86.0 -mask 255.255.255.192
104/var -ro -maproot=root: -network 192.157.86.0 -mask 255.255.255.192
105
106    In order to be an NFS server, the server must run portmap, mountd,
107    nfsd, and rpc.statd.  The standard NFS server options in /etc/rc.conf
108    will work ( you should put your overrides in /etc/rc.conf.local on the
109    server and not edit the distribution /etc/rc.conf, though ).
110
111    BOOTP Server:
112
113	This configuration file "/etc/dhcpd.conf" example is for
114	the '/usr/ports/net/isc-dhcp' dhcpd port.
115
116	    subnet 192.157.86.0 netmask 255.255.255.192 {
117		# range if you want to run the core dhcpd service of
118		# dynamic IP assignment, but it is not used with BOOTP
119		# workstations
120		range 192.157.86.32 192.157.86.62;
121
122		# misc configuration.
123		#
124		option routers 192.157.86.2;
125		option domain-name-servers 192.157.86.2;
126
127		server-name "apollo.fubar.com";
128		option subnet-mask 255.255.255.192;
129		option domain-name-servers 192.157.86.2;
130		option domain-name "fubar.com";
131		option broadcast-address 192.157.86.63;
132		option routers 192.157.86.2;
133	    }
134
135	    host test1 {
136		hardware ethernet 00:a0:c9:d3:38:25;
137		fixed-address 192.157.86.11;
138		option root-path "192.157.86.2:/";
139		option option-128 "192.157.86.2:/images/swap";
140	    }
141
142	    host test2 {
143	    #    hardware ethernet 00:e0:29:1d:16:09;
144		hardware ethernet 00:10:5a:a8:94:0e;
145		fixed-address 192.157.86.12;
146		option root-path "192.157.86.2:/";
147		option option-128 "192.157.86.2:/images/swap";
148	    }
149
150    SWAP.  This example includes options to automatically BOOTP configure
151    NFS swap on each workstation.  In order to use this capabilities you
152    need to NFS-export a swap directory READ+WRITE to the workstations.
153
154    You must then create a swap directory for each workstation you wish to
155    assign swap to.  In this example I created a dummy user 'lander' and
156    did an NFS export of /images/swap enforcing a UID of 'lander' for
157    all accesses.
158
159	apollo:/usr/ports/net# ls -la /images/swap
160	total 491786
161	drwxr-xr-x  2 root    wheel        512 Dec 28 07:00 .
162	drwxr-xr-x  8 root    wheel        512 Jan 20 10:54 ..
163	-rw-r--r--  1 lander  wheel   33554432 Dec 23 14:35 swap.192.157.86.11
164	-rw-r--r--  1 lander  wheel  335544320 Jan 24 16:55 swap.192.157.86.12
165	-rw-r--r--  1 lander  wheel  134217728 Jan 21 17:19 swap.192.157.86.6
166
167    A swap file is best created with dd:
168
169	# create a 32MB swap file for a BOOTP workstation
170	dd if=/dev/zero of=swap.IPADDRESS bs=1m count=32
171
172    It is generally a good idea to give your workstations some swap space,
173    but not a requirement if they have a lot of memory.
174
175