|  | =============================================== | 
|  | Mounting the root filesystem via NFS (nfsroot) | 
|  | =============================================== | 
|  |  | 
|  | :Authors: | 
|  | 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> | 
|  |  | 
|  | Updated 2018 by Chris Novakovic <chris@chrisn.me.uk> | 
|  |  | 
|  |  | 
|  |  | 
|  | 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.rst), a ramdisk (see | 
|  | Documentation/admin-guide/initrd.rst) 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. | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | 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. | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | 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>:<ntp0-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. | 
|  |  | 
|  | Value is exported to /proc/net/pnp with the prefix "bootserver " | 
|  | (see below). | 
|  |  | 
|  | 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. | 
|  | If a '.' character is present, anything | 
|  | before the first '.' is used as the client's hostname, and anything | 
|  | after it is used as its NIS domain name. May be supplied by | 
|  | autoconfiguration, but its absence will not trigger autoconfiguration. | 
|  | If specified and DHCP is used, the user-provided hostname (and NIS | 
|  | domain name, if present) will be carried in the DHCP request; this | 
|  | may cause a DNS record to be created or updated for the client. | 
|  |  | 
|  | 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) | 
|  |  | 
|  | if dhcp is used, the client identifier can be used by following | 
|  | format "ip=dhcp,client-id-type,client-id-value" | 
|  |  | 
|  | Default: any | 
|  |  | 
|  | <dns0-ip>	IP address of primary nameserver. | 
|  | Value is exported to /proc/net/pnp with the prefix "nameserver " | 
|  | (see below). | 
|  |  | 
|  | Default: None if not using autoconfiguration; determined | 
|  | automatically if using autoconfiguration. | 
|  |  | 
|  | <dns1-ip>	IP address of secondary nameserver. | 
|  | See <dns0-ip>. | 
|  |  | 
|  | <ntp0-ip>	IP address of a Network Time Protocol (NTP) server. | 
|  | Value is exported to /proc/net/ipconfig/ntp_servers, but is | 
|  | otherwise unused (see below). | 
|  |  | 
|  | Default: None if not using autoconfiguration; determined | 
|  | automatically if using autoconfiguration. | 
|  |  | 
|  | After configuration (whether manual or automatic) is complete, two files | 
|  | are created in the following format; lines are omitted if their respective | 
|  | value is empty following configuration: | 
|  |  | 
|  | - /proc/net/pnp: | 
|  |  | 
|  | #PROTO: <DHCP|BOOTP|RARP|MANUAL>	(depending on configuration method) | 
|  | domain <dns-domain>			(if autoconfigured, the DNS domain) | 
|  | nameserver <dns0-ip>			(primary name server IP) | 
|  | nameserver <dns1-ip>			(secondary name server IP) | 
|  | nameserver <dns2-ip>			(tertiary name server IP) | 
|  | bootserver <server-ip>			(NFS server IP) | 
|  |  | 
|  | - /proc/net/ipconfig/ntp_servers: | 
|  |  | 
|  | <ntp0-ip>				(NTP server IP) | 
|  | <ntp1-ip>				(NTP server IP) | 
|  | <ntp2-ip>				(NTP server IP) | 
|  |  | 
|  | <dns-domain> and <dns2-ip> (in /proc/net/pnp) and <ntp1-ip> and <ntp2-ip> | 
|  | (in /proc/net/ipconfig/ntp_servers) are requested during autoconfiguration; | 
|  | they cannot be specified as part of the "ip=" kernel command line parameter. | 
|  |  | 
|  | Because the "domain" and "nameserver" options are recognised by DNS | 
|  | resolvers, /etc/resolv.conf is often linked to /proc/net/pnp on systems | 
|  | that use an NFS root filesystem. | 
|  |  | 
|  | Note that the kernel will not synchronise the system time with any NTP | 
|  | servers it discovers; this is the responsibility of a user space process | 
|  | (e.g. an initrd/initramfs script that passes the IP addresses listed in | 
|  | /proc/net/ipconfig/ntp_servers to an NTP client before mounting the real | 
|  | root filesystem if it is on NFS). | 
|  |  | 
|  |  | 
|  | 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/driver-api/early-userspace/early_userspace_support.rst | 
|  |  | 
|  |  | 
|  | Boot Loader | 
|  | =========== | 
|  |  | 
|  | To get the kernel into memory different approaches can be used. | 
|  | They depend on various facilities being available: | 
|  |  | 
|  |  | 
|  | - 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 https://syslinux.zytor.com/ | 
|  |  | 
|  | .. note:: | 
|  | 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. | 
|  |  | 
|  | - 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 https://syslinux.zytor.com/ | 
|  |  | 
|  | - 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. | 
|  |  | 
|  | e.g:: | 
|  |  | 
|  | mknod /dev/boot255 c 0 255 | 
|  |  | 
|  | For information on configuring LILO, please refer to its documentation. | 
|  |  | 
|  | - Using GRUB | 
|  |  | 
|  | When using GRUB, kernel parameter are simply appended after the kernel | 
|  | specification: kernel <kernel> <parameters> | 
|  |  | 
|  | - 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. | 
|  |  | 
|  | - 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. | 
|  |  | 
|  | - 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/admin-guide/serial-console.rst for more information. | 
|  |  | 
|  | For more information on isolinux, including how to create bootdisks | 
|  | for prebuilt kernels, see https://syslinux.zytor.com/ | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | 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. |