An NFS-mounted root filesystem is typically most useful in two situations:
A system administrator may wish to aggregate storage for multiple
workstations in order to simplify maintenance, improve security and
reliability, and/or make more economical use of limited storage capacity.
In this scenario, a single, large server may host a dozen or more
workstations; all of the systems can be regularly backed up from a
central location, and individual clients are less prone to damage
by unsophisticated users or attack by malicious parties with physical
access. (Of course, if the server itself is compromised, then so are
all of the clients.)
An embedded system may not have a disk, an IDE interface, or even
a PCI bus. Even if it does, during development it may be too unstable
to use the disk, and a ramdisk may be too small to include all of the
necessary utilities or too large (as a part of the kernel image) to
allow for rapid turnaround during testing and development. An NFS root
allows quick kernel downloads, helps ensure filesystem integrity (since
the server is basically impervious to crashes by the client), and provides
virtually infinite storage.
(In this document we'll use the terms client and workstation
interchangeably.)
However, there are two small problems from the client's perspective:
It must find out its own IP address and possibly also the
rest of the ethernet configuration (gateway, netmask, name servers, etc.).
It must know or discover both the IP address of the NFS server and
the mount path (on the server) to the exported root filesystem.
The current implementation of NFSROOT in the Linux kernel (as of
2.4.x) allows for several approaches, including:
The complete ethernet configuration, including the NFS-path
to be mounted, may be passed as parameters to the kernel via
LILO, LOADLIN, or a hard-coded string within
linux/arch/i386/kernel/setup.c (or its equivalent for other
architectures).
The IP address may be discovered by RARP and the NFS-path
passed via kernel parameters.
The IP address may be discovered by RARP, with the NFS-path
derived from the RARP server and the just-granted IP address
(loosely speaking, ``mount -t nfs
<RARP-server>:/tftpboot/<IP-address-of-client>/dev/nfs'').
The client configuration may be discovered by BOOTP.
The client configuration may be discovered by DHCP.
Since the most common dynamic-address protocol these days is DHCP, its
addition as an option in kernels 2.2.19 and 2.4.x (3 < x <= 14)
is particularly welcome.
Before starting to set up a diskless environment, you should decide if
you will be booting via LILO, LOADLIN, or a custom, embedded
bootloader. The advantage of using something like LILO is flexibility;
the disadvantage is speed--booting a Linux kernel without LILO is
faster.
This may or may not be a consideration.