On small systems (e.g. embedded ones) IP addresses are often configured by bootloaders and get assigned to kernel via parameter "ip=". If set to "ip=dhcp", even nameserver entries from DHCP daemons are handled. These entries exported in /proc/net/pnp are commonly linked by /etc/resolv.conf. To configure nameservers for networks without DHCP, this patch adds option <dns0-ip> and <dns1-ip> to kernel-parameter 'ip='. Signed-off-by: Christoph Fritz <chf.fritz@googlemail.com> Tested-by: Jan Weitzel <j.weitzel@phytec.de> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			302 lines
		
	
	
	
		
			11 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			302 lines
		
	
	
	
		
			11 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
Mounting the root filesystem via NFS (nfsroot)
 | 
						|
===============================================
 | 
						|
 | 
						|
Written 1996 by Gero Kuhlmann <gero@gkminix.han.de>
 | 
						|
Updated 1997 by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
 | 
						|
Updated 2006 by Nico Schottelius <nico-kernel-nfsroot@schottelius.org>
 | 
						|
Updated 2006 by Horms <horms@verge.net.au>
 | 
						|
 | 
						|
 | 
						|
 | 
						|
In order to use a diskless system, such as an X-terminal or printer server
 | 
						|
for example, it is necessary for the root filesystem to be present on a
 | 
						|
non-disk device. This may be an initramfs (see Documentation/filesystems/
 | 
						|
ramfs-rootfs-initramfs.txt), a ramdisk (see Documentation/initrd.txt) or a
 | 
						|
filesystem mounted via NFS. The following text describes on how to use NFS
 | 
						|
for the root filesystem. For the rest of this text 'client' means the
 | 
						|
diskless system, and 'server' means the NFS server.
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
1.) Enabling nfsroot capabilities
 | 
						|
    -----------------------------
 | 
						|
 | 
						|
In order to use nfsroot, NFS client support needs to be selected as
 | 
						|
built-in during configuration. Once this has been selected, the nfsroot
 | 
						|
option will become available, which should also be selected.
 | 
						|
 | 
						|
In the networking options, kernel level autoconfiguration can be selected,
 | 
						|
along with the types of autoconfiguration to support. Selecting all of
 | 
						|
DHCP, BOOTP and RARP is safe.
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
2.) Kernel command line
 | 
						|
    -------------------
 | 
						|
 | 
						|
When the kernel has been loaded by a boot loader (see below) it needs to be
 | 
						|
told what root fs device to use. And in the case of nfsroot, where to find
 | 
						|
both the server and the name of the directory on the server to mount as root.
 | 
						|
This can be established using the following kernel command line parameters:
 | 
						|
 | 
						|
 | 
						|
root=/dev/nfs
 | 
						|
 | 
						|
  This is necessary to enable the pseudo-NFS-device. Note that it's not a
 | 
						|
  real device but just a synonym to tell the kernel to use NFS instead of
 | 
						|
  a real device.
 | 
						|
 | 
						|
 | 
						|
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
 | 
						|
 | 
						|
  If the `nfsroot' parameter is NOT given on the command line,
 | 
						|
  the default "/tftpboot/%s" will be used.
 | 
						|
 | 
						|
  <server-ip>	Specifies the IP address of the NFS server.
 | 
						|
		The default address is determined by the `ip' parameter
 | 
						|
		(see below). This parameter allows the use of different
 | 
						|
		servers for IP autoconfiguration and NFS.
 | 
						|
 | 
						|
  <root-dir>	Name of the directory on the server to mount as root.
 | 
						|
		If there is a "%s" token in the string, it will be
 | 
						|
		replaced by the ASCII-representation of the client's
 | 
						|
		IP address.
 | 
						|
 | 
						|
  <nfs-options>	Standard NFS options. All options are separated by commas.
 | 
						|
		The following defaults are used:
 | 
						|
			port		= as given by server portmap daemon
 | 
						|
			rsize		= 4096
 | 
						|
			wsize		= 4096
 | 
						|
			timeo		= 7
 | 
						|
			retrans		= 3
 | 
						|
			acregmin	= 3
 | 
						|
			acregmax	= 60
 | 
						|
			acdirmin	= 30
 | 
						|
			acdirmax	= 60
 | 
						|
			flags		= hard, nointr, noposix, cto, ac
 | 
						|
 | 
						|
 | 
						|
ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:
 | 
						|
   <dns0-ip>:<dns1-ip>
 | 
						|
 | 
						|
  This parameter tells the kernel how to configure IP addresses of devices
 | 
						|
  and also how to set up the IP routing table. It was originally called
 | 
						|
  `nfsaddrs', but now the boot-time IP configuration works independently of
 | 
						|
  NFS, so it was renamed to `ip' and the old name remained as an alias for
 | 
						|
  compatibility reasons.
 | 
						|
 | 
						|
  If this parameter is missing from the kernel command line, all fields are
 | 
						|
  assumed to be empty, and the defaults mentioned below apply. In general
 | 
						|
  this means that the kernel tries to configure everything using
 | 
						|
  autoconfiguration.
 | 
						|
 | 
						|
  The <autoconf> parameter can appear alone as the value to the `ip'
 | 
						|
  parameter (without all the ':' characters before).  If the value is
 | 
						|
  "ip=off" or "ip=none", no autoconfiguration will take place, otherwise
 | 
						|
  autoconfiguration will take place.  The most common way to use this
 | 
						|
  is "ip=dhcp".
 | 
						|
 | 
						|
  <client-ip>	IP address of the client.
 | 
						|
 | 
						|
  		Default:  Determined using autoconfiguration.
 | 
						|
 | 
						|
  <server-ip>	IP address of the NFS server. If RARP is used to determine
 | 
						|
		the client address and this parameter is NOT empty only
 | 
						|
		replies from the specified server are accepted.
 | 
						|
 | 
						|
		Only required for NFS root. That is autoconfiguration
 | 
						|
		will not be triggered if it is missing and NFS root is not
 | 
						|
		in operation.
 | 
						|
 | 
						|
		Default: Determined using autoconfiguration.
 | 
						|
		         The address of the autoconfiguration server is used.
 | 
						|
 | 
						|
  <gw-ip>	IP address of a gateway if the server is on a different subnet.
 | 
						|
 | 
						|
		Default: Determined using autoconfiguration.
 | 
						|
 | 
						|
  <netmask>	Netmask for local network interface. If unspecified
 | 
						|
		the netmask is derived from the client IP address assuming
 | 
						|
		classful addressing.
 | 
						|
 | 
						|
		Default:  Determined using autoconfiguration.
 | 
						|
 | 
						|
  <hostname>	Name of the client. May be supplied by autoconfiguration,
 | 
						|
  		but its absence will not trigger autoconfiguration.
 | 
						|
		If specified and DHCP is used, the user provided hostname will
 | 
						|
		be carried in the DHCP request to hopefully update DNS record.
 | 
						|
 | 
						|
  		Default: Client IP address is used in ASCII notation.
 | 
						|
 | 
						|
  <device>	Name of network device to use.
 | 
						|
 | 
						|
		Default: If the host only has one device, it is used.
 | 
						|
			 Otherwise the device is determined using
 | 
						|
			 autoconfiguration. This is done by sending
 | 
						|
			 autoconfiguration requests out of all devices,
 | 
						|
			 and using the device that received the first reply.
 | 
						|
 | 
						|
  <autoconf>	Method to use for autoconfiguration. In the case of options
 | 
						|
                which specify multiple autoconfiguration protocols,
 | 
						|
		requests are sent using all protocols, and the first one
 | 
						|
		to reply is used.
 | 
						|
 | 
						|
		Only autoconfiguration protocols that have been compiled
 | 
						|
		into the kernel will be used, regardless of the value of
 | 
						|
		this option.
 | 
						|
 | 
						|
                  off or none: don't use autoconfiguration
 | 
						|
				(do static IP assignment instead)
 | 
						|
		  on or any:   use any protocol available in the kernel
 | 
						|
			       (default)
 | 
						|
		  dhcp:        use DHCP
 | 
						|
		  bootp:       use BOOTP
 | 
						|
		  rarp:        use RARP
 | 
						|
		  both:        use both BOOTP and RARP but not DHCP
 | 
						|
		               (old option kept for backwards compatibility)
 | 
						|
 | 
						|
                Default: any
 | 
						|
 | 
						|
  <dns0-ip>	IP address of first nameserver.
 | 
						|
		Value gets exported by /proc/net/pnp which is often linked
 | 
						|
		on embedded systems by /etc/resolv.conf.
 | 
						|
 | 
						|
  <dns1-ip>	IP address of secound nameserver.
 | 
						|
		Same as above.
 | 
						|
 | 
						|
 | 
						|
nfsrootdebug
 | 
						|
 | 
						|
  This parameter enables debugging messages to appear in the kernel
 | 
						|
  log at boot time so that administrators can verify that the correct
 | 
						|
  NFS mount options, server address, and root path are passed to the
 | 
						|
  NFS client.
 | 
						|
 | 
						|
 | 
						|
rdinit=<executable file>
 | 
						|
 | 
						|
  To specify which file contains the program that starts system
 | 
						|
  initialization, administrators can use this command line parameter.
 | 
						|
  The default value of this parameter is "/init".  If the specified
 | 
						|
  file exists and the kernel can execute it, root filesystem related
 | 
						|
  kernel command line parameters, including `nfsroot=', are ignored.
 | 
						|
 | 
						|
  A description of the process of mounting the root file system can be
 | 
						|
  found in:
 | 
						|
 | 
						|
    Documentation/early-userspace/README
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
3.) Boot Loader
 | 
						|
    ----------
 | 
						|
 | 
						|
To get the kernel into memory different approaches can be used.
 | 
						|
They depend on various facilities being available:
 | 
						|
 | 
						|
 | 
						|
3.1)  Booting from a floppy using syslinux
 | 
						|
 | 
						|
	When building kernels, an easy way to create a boot floppy that uses
 | 
						|
	syslinux is to use the zdisk or bzdisk make targets which use zimage
 | 
						|
      	and bzimage images respectively. Both targets accept the
 | 
						|
     	FDARGS parameter which can be used to set the kernel command line.
 | 
						|
 | 
						|
	e.g.
 | 
						|
	   make bzdisk FDARGS="root=/dev/nfs"
 | 
						|
 | 
						|
   	Note that the user running this command will need to have
 | 
						|
     	access to the floppy drive device, /dev/fd0
 | 
						|
 | 
						|
     	For more information on syslinux, including how to create bootdisks
 | 
						|
     	for prebuilt kernels, see http://syslinux.zytor.com/
 | 
						|
 | 
						|
	N.B: Previously it was possible to write a kernel directly to
 | 
						|
	     a floppy using dd, configure the boot device using rdev, and
 | 
						|
	     boot using the resulting floppy. Linux no longer supports this
 | 
						|
	     method of booting.
 | 
						|
 | 
						|
3.2) Booting from a cdrom using isolinux
 | 
						|
 | 
						|
     	When building kernels, an easy way to create a bootable cdrom that
 | 
						|
     	uses isolinux is to use the isoimage target which uses a bzimage
 | 
						|
     	image. Like zdisk and bzdisk, this target accepts the FDARGS
 | 
						|
     	parameter which can be used to set the kernel command line.
 | 
						|
 | 
						|
	e.g.
 | 
						|
	  make isoimage FDARGS="root=/dev/nfs"
 | 
						|
 | 
						|
     	The resulting iso image will be arch/<ARCH>/boot/image.iso
 | 
						|
     	This can be written to a cdrom using a variety of tools including
 | 
						|
     	cdrecord.
 | 
						|
 | 
						|
	e.g.
 | 
						|
	  cdrecord dev=ATAPI:1,0,0 arch/x86/boot/image.iso
 | 
						|
 | 
						|
     	For more information on isolinux, including how to create bootdisks
 | 
						|
     	for prebuilt kernels, see http://syslinux.zytor.com/
 | 
						|
 | 
						|
3.2) Using LILO
 | 
						|
	When using LILO all the necessary command line parameters may be
 | 
						|
	specified using the 'append=' directive in the LILO configuration
 | 
						|
	file.
 | 
						|
 | 
						|
	However, to use the 'root=' directive you also need to create
 | 
						|
	a dummy root device, which may be removed after LILO is run.
 | 
						|
 | 
						|
	mknod /dev/boot255 c 0 255
 | 
						|
 | 
						|
	For information on configuring LILO, please refer to its documentation.
 | 
						|
 | 
						|
3.3) Using GRUB
 | 
						|
	When using GRUB, kernel parameter are simply appended after the kernel
 | 
						|
	specification: kernel <kernel> <parameters>
 | 
						|
 | 
						|
3.4) Using loadlin
 | 
						|
	loadlin may be used to boot Linux from a DOS command prompt without
 | 
						|
	requiring a local hard disk to mount as root. This has not been
 | 
						|
	thoroughly tested by the authors of this document, but in general
 | 
						|
	it should be possible configure the kernel command line similarly
 | 
						|
	to the configuration of LILO.
 | 
						|
 | 
						|
	Please refer to the loadlin documentation for further information.
 | 
						|
 | 
						|
3.5) Using a boot ROM
 | 
						|
	This is probably the most elegant way of booting a diskless client.
 | 
						|
	With a boot ROM the kernel is loaded using the TFTP protocol. The
 | 
						|
	authors of this document are not aware of any no commercial boot
 | 
						|
	ROMs that support booting Linux over the network. However, there
 | 
						|
	are two free implementations of a boot ROM, netboot-nfs and
 | 
						|
	etherboot, both of which are available on sunsite.unc.edu, and both
 | 
						|
	of which contain everything you need to boot a diskless Linux client.
 | 
						|
 | 
						|
3.6) Using pxelinux
 | 
						|
	Pxelinux may be used to boot linux using the PXE boot loader
 | 
						|
	which is present on many modern network cards.
 | 
						|
 | 
						|
	When using pxelinux, the kernel image is specified using
 | 
						|
	"kernel <relative-path-below /tftpboot>". The nfsroot parameters
 | 
						|
	are passed to the kernel by adding them to the "append" line.
 | 
						|
	It is common to use serial console in conjunction with pxeliunx,
 | 
						|
	see Documentation/serial-console.txt for more information.
 | 
						|
 | 
						|
	For more information on isolinux, including how to create bootdisks
 | 
						|
	for prebuilt kernels, see http://syslinux.zytor.com/
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
4.) Credits
 | 
						|
    -------
 | 
						|
 | 
						|
  The nfsroot code in the kernel and the RARP support have been written
 | 
						|
  by Gero Kuhlmann <gero@gkminix.han.de>.
 | 
						|
 | 
						|
  The rest of the IP layer autoconfiguration code has been written
 | 
						|
  by Martin Mares <mj@atrey.karlin.mff.cuni.cz>.
 | 
						|
 | 
						|
  In order to write the initial version of nfsroot I would like to thank
 | 
						|
  Jens-Uwe Mager <jum@anubis.han.de> for his help.
 |