| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | Mounting the root filesystem via NFS (nfsroot) | 
|  | 2 | =============================================== | 
|  | 3 |  | 
|  | 4 | Written 1996 by Gero Kuhlmann <gero@gkminix.han.de> | 
|  | 5 | Updated 1997 by Martin Mares <mj@atrey.karlin.mff.cuni.cz> | 
| Nico Schottelius | 7e9dd12 | 2006-03-24 03:18:18 -0800 | [diff] [blame] | 6 | Updated 2006 by Nico Schottelius <nico-kernel-nfsroot@schottelius.org> | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 7 | Updated 2006 by Horms <horms@verge.net.au> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 8 |  | 
|  | 9 |  | 
|  | 10 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 11 | In order to use a diskless system, such as an X-terminal or printer server | 
|  | 12 | for example, it is necessary for the root filesystem to be present on a | 
|  | 13 | non-disk device. This may be an initramfs (see Documentation/filesystems/ | 
| Matt LaPlante | fff9289 | 2006-10-03 22:47:42 +0200 | [diff] [blame] | 14 | ramfs-rootfs-initramfs.txt), a ramdisk (see Documentation/initrd.txt) or a | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 15 | filesystem mounted via NFS. The following text describes on how to use NFS | 
|  | 16 | for the root filesystem. For the rest of this text 'client' means the | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 17 | diskless system, and 'server' means the NFS server. | 
|  | 18 |  | 
|  | 19 |  | 
|  | 20 |  | 
|  | 21 |  | 
|  | 22 | 1.) Enabling nfsroot capabilities | 
|  | 23 | ----------------------------- | 
|  | 24 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 25 | In order to use nfsroot, NFS client support needs to be selected as | 
|  | 26 | built-in during configuration. Once this has been selected, the nfsroot | 
|  | 27 | option will become available, which should also be selected. | 
|  | 28 |  | 
|  | 29 | In the networking options, kernel level autoconfiguration can be selected, | 
|  | 30 | along with the types of autoconfiguration to support. Selecting all of | 
|  | 31 | DHCP, BOOTP and RARP is safe. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 32 |  | 
|  | 33 |  | 
|  | 34 |  | 
|  | 35 |  | 
|  | 36 | 2.) Kernel command line | 
|  | 37 | ------------------- | 
|  | 38 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 39 | When the kernel has been loaded by a boot loader (see below) it needs to be | 
|  | 40 | told what root fs device to use. And in the case of nfsroot, where to find | 
|  | 41 | both the server and the name of the directory on the server to mount as root. | 
|  | 42 | This can be established using the following kernel command line parameters: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 43 |  | 
|  | 44 |  | 
|  | 45 | root=/dev/nfs | 
|  | 46 |  | 
|  | 47 | This is necessary to enable the pseudo-NFS-device. Note that it's not a | 
|  | 48 | real device but just a synonym to tell the kernel to use NFS instead of | 
|  | 49 | a real device. | 
|  | 50 |  | 
|  | 51 |  | 
|  | 52 | nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] | 
|  | 53 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 54 | If the `nfsroot' parameter is NOT given on the command line, | 
|  | 55 | the default "/tftpboot/%s" will be used. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 56 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 57 | <server-ip>	Specifies the IP address of the NFS server. | 
|  | 58 | The default address is determined by the `ip' parameter | 
|  | 59 | (see below). This parameter allows the use of different | 
|  | 60 | servers for IP autoconfiguration and NFS. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 61 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 62 | <root-dir>	Name of the directory on the server to mount as root. | 
|  | 63 | If there is a "%s" token in the string, it will be | 
|  | 64 | replaced by the ASCII-representation of the client's | 
|  | 65 | IP address. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 66 |  | 
|  | 67 | <nfs-options>	Standard NFS options. All options are separated by commas. | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 68 | The following defaults are used: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 69 | port		= as given by server portmap daemon | 
| Dan Aloni | 91dd26a | 2007-02-12 00:51:54 -0800 | [diff] [blame] | 70 | rsize		= 4096 | 
|  | 71 | wsize		= 4096 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 72 | timeo		= 7 | 
|  | 73 | retrans		= 3 | 
|  | 74 | acregmin	= 3 | 
|  | 75 | acregmax	= 60 | 
|  | 76 | acdirmin	= 30 | 
|  | 77 | acdirmax	= 60 | 
|  | 78 | flags		= hard, nointr, noposix, cto, ac | 
|  | 79 |  | 
|  | 80 |  | 
|  | 81 | ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf> | 
|  | 82 |  | 
|  | 83 | This parameter tells the kernel how to configure IP addresses of devices | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 84 | and also how to set up the IP routing table. It was originally called | 
|  | 85 | `nfsaddrs', but now the boot-time IP configuration works independently of | 
|  | 86 | NFS, so it was renamed to `ip' and the old name remained as an alias for | 
|  | 87 | compatibility reasons. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 88 |  | 
|  | 89 | If this parameter is missing from the kernel command line, all fields are | 
|  | 90 | assumed to be empty, and the defaults mentioned below apply. In general | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 91 | this means that the kernel tries to configure everything using | 
|  | 92 | autoconfiguration. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 93 |  | 
|  | 94 | The <autoconf> parameter can appear alone as the value to the `ip' | 
| Amos Waterland | f33e1d9 | 2007-12-14 11:30:22 -0800 | [diff] [blame] | 95 | parameter (without all the ':' characters before).  If the value is | 
|  | 96 | "ip=off" or "ip=none", no autoconfiguration will take place, otherwise | 
|  | 97 | autoconfiguration will take place.  The most common way to use this | 
|  | 98 | is "ip=dhcp". | 
|  | 99 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 100 | <client-ip>	IP address of the client. | 
|  | 101 |  | 
|  | 102 | Default:  Determined using autoconfiguration. | 
|  | 103 |  | 
|  | 104 | <server-ip>	IP address of the NFS server. If RARP is used to determine | 
|  | 105 | the client address and this parameter is NOT empty only | 
|  | 106 | replies from the specified server are accepted. | 
|  | 107 |  | 
| Anand Gadiyar | 411c940 | 2009-07-07 15:24:23 +0530 | [diff] [blame] | 108 | Only required for NFS root. That is autoconfiguration | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 109 | will not be triggered if it is missing and NFS root is not | 
|  | 110 | in operation. | 
|  | 111 |  | 
|  | 112 | Default: Determined using autoconfiguration. | 
|  | 113 | The address of the autoconfiguration server is used. | 
|  | 114 |  | 
|  | 115 | <gw-ip>	IP address of a gateway if the server is on a different subnet. | 
|  | 116 |  | 
|  | 117 | Default: Determined using autoconfiguration. | 
|  | 118 |  | 
|  | 119 | <netmask>	Netmask for local network interface. If unspecified | 
|  | 120 | the netmask is derived from the client IP address assuming | 
|  | 121 | classful addressing. | 
|  | 122 |  | 
|  | 123 | Default:  Determined using autoconfiguration. | 
|  | 124 |  | 
|  | 125 | <hostname>	Name of the client. May be supplied by autoconfiguration, | 
|  | 126 | but its absence will not trigger autoconfiguration. | 
| Wu Fengguang | 8cbccbe | 2010-06-02 16:02:44 +0000 | [diff] [blame] | 127 | If specified and DHCP is used, the user provided hostname will | 
|  | 128 | be carried in the DHCP request to hopefully update DNS record. | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 129 |  | 
|  | 130 | Default: Client IP address is used in ASCII notation. | 
|  | 131 |  | 
|  | 132 | <device>	Name of network device to use. | 
|  | 133 |  | 
|  | 134 | Default: If the host only has one device, it is used. | 
|  | 135 | Otherwise the device is determined using | 
|  | 136 | autoconfiguration. This is done by sending | 
|  | 137 | autoconfiguration requests out of all devices, | 
|  | 138 | and using the device that received the first reply. | 
|  | 139 |  | 
|  | 140 | <autoconf>	Method to use for autoconfiguration. In the case of options | 
|  | 141 | which specify multiple autoconfiguration protocols, | 
|  | 142 | requests are sent using all protocols, and the first one | 
|  | 143 | to reply is used. | 
|  | 144 |  | 
|  | 145 | Only autoconfiguration protocols that have been compiled | 
|  | 146 | into the kernel will be used, regardless of the value of | 
|  | 147 | this option. | 
|  | 148 |  | 
| Amos Waterland | f33e1d9 | 2007-12-14 11:30:22 -0800 | [diff] [blame] | 149 | off or none: don't use autoconfiguration | 
| Amos Waterland | 92ffb85 | 2008-01-05 23:23:06 -0800 | [diff] [blame] | 150 | (do static IP assignment instead) | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 151 | on or any:   use any protocol available in the kernel | 
| Simon Horman | a6c05c3 | 2007-12-25 20:54:42 -0800 | [diff] [blame] | 152 | (default) | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 153 | dhcp:        use DHCP | 
|  | 154 | bootp:       use BOOTP | 
|  | 155 | rarp:        use RARP | 
|  | 156 | both:        use both BOOTP and RARP but not DHCP | 
|  | 157 | (old option kept for backwards compatibility) | 
|  | 158 |  | 
|  | 159 | Default: any | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 160 |  | 
|  | 161 |  | 
| Chuck Lever | 306a075 | 2010-09-17 10:54:37 -0400 | [diff] [blame] | 162 | nfsrootdebug | 
|  | 163 |  | 
|  | 164 | This parameter enables debugging messages to appear in the kernel | 
|  | 165 | log at boot time so that administrators can verify that the correct | 
|  | 166 | NFS mount options, server address, and root path are passed to the | 
|  | 167 | NFS client. | 
|  | 168 |  | 
|  | 169 |  | 
|  | 170 | rdinit=<executable file> | 
|  | 171 |  | 
|  | 172 | To specify which file contains the program that starts system | 
|  | 173 | initialization, administrators can use this command line parameter. | 
|  | 174 | The default value of this parameter is "/init".  If the specified | 
|  | 175 | file exists and the kernel can execute it, root filesystem related | 
|  | 176 | kernel command line parameters, including `nfsroot=', are ignored. | 
|  | 177 |  | 
|  | 178 | A description of the process of mounting the root file system can be | 
|  | 179 | found in: | 
|  | 180 |  | 
|  | 181 | Documentation/early-userspace/README | 
|  | 182 |  | 
|  | 183 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 184 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 185 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 186 | 3.) Boot Loader | 
|  | 187 | ---------- | 
|  | 188 |  | 
|  | 189 | To get the kernel into memory different approaches can be used. | 
|  | 190 | They depend on various facilities being available: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 191 |  | 
|  | 192 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 193 | 3.1)  Booting from a floppy using syslinux | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 194 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 195 | When building kernels, an easy way to create a boot floppy that uses | 
| Shane McDonald | 1c82832 | 2008-10-15 22:01:46 -0700 | [diff] [blame] | 196 | syslinux is to use the zdisk or bzdisk make targets which use zimage | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 197 | and bzimage images respectively. Both targets accept the | 
|  | 198 | FDARGS parameter which can be used to set the kernel command line. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 199 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 200 | e.g. | 
|  | 201 | make bzdisk FDARGS="root=/dev/nfs" | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 202 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 203 | Note that the user running this command will need to have | 
|  | 204 | access to the floppy drive device, /dev/fd0 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 205 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 206 | For more information on syslinux, including how to create bootdisks | 
|  | 207 | for prebuilt kernels, see http://syslinux.zytor.com/ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 208 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 209 | N.B: Previously it was possible to write a kernel directly to | 
|  | 210 | a floppy using dd, configure the boot device using rdev, and | 
|  | 211 | boot using the resulting floppy. Linux no longer supports this | 
|  | 212 | method of booting. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 213 |  | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 214 | 3.2) Booting from a cdrom using isolinux | 
|  | 215 |  | 
|  | 216 | When building kernels, an easy way to create a bootable cdrom that | 
|  | 217 | uses isolinux is to use the isoimage target which uses a bzimage | 
|  | 218 | image. Like zdisk and bzdisk, this target accepts the FDARGS | 
|  | 219 | parameter which can be used to set the kernel command line. | 
|  | 220 |  | 
|  | 221 | e.g. | 
|  | 222 | make isoimage FDARGS="root=/dev/nfs" | 
|  | 223 |  | 
|  | 224 | The resulting iso image will be arch/<ARCH>/boot/image.iso | 
|  | 225 | This can be written to a cdrom using a variety of tools including | 
|  | 226 | cdrecord. | 
|  | 227 |  | 
|  | 228 | e.g. | 
|  | 229 | cdrecord dev=ATAPI:1,0,0 arch/i386/boot/image.iso | 
|  | 230 |  | 
|  | 231 | For more information on isolinux, including how to create bootdisks | 
|  | 232 | for prebuilt kernels, see http://syslinux.zytor.com/ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 233 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 234 | 3.2) Using LILO | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 235 | When using LILO all the necessary command line parameters may be | 
|  | 236 | specified using the 'append=' directive in the LILO configuration | 
|  | 237 | file. | 
|  | 238 |  | 
|  | 239 | However, to use the 'root=' directive you also need to create | 
|  | 240 | a dummy root device, which may be removed after LILO is run. | 
|  | 241 |  | 
|  | 242 | mknod /dev/boot255 c 0 255 | 
|  | 243 |  | 
|  | 244 | For information on configuring LILO, please refer to its documentation. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 245 |  | 
| Nico Schottelius | 7e9dd12 | 2006-03-24 03:18:18 -0800 | [diff] [blame] | 246 | 3.3) Using GRUB | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 247 | When using GRUB, kernel parameter are simply appended after the kernel | 
|  | 248 | specification: kernel <kernel> <parameters> | 
| Nico Schottelius | 7e9dd12 | 2006-03-24 03:18:18 -0800 | [diff] [blame] | 249 |  | 
|  | 250 | 3.4) Using loadlin | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 251 | loadlin may be used to boot Linux from a DOS command prompt without | 
|  | 252 | requiring a local hard disk to mount as root. This has not been | 
|  | 253 | thoroughly tested by the authors of this document, but in general | 
|  | 254 | it should be possible configure the kernel command line similarly | 
|  | 255 | to the configuration of LILO. | 
|  | 256 |  | 
|  | 257 | Please refer to the loadlin documentation for further information. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 258 |  | 
| Nico Schottelius | 7e9dd12 | 2006-03-24 03:18:18 -0800 | [diff] [blame] | 259 | 3.5) Using a boot ROM | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 260 | This is probably the most elegant way of booting a diskless client. | 
|  | 261 | With a boot ROM the kernel is loaded using the TFTP protocol. The | 
|  | 262 | authors of this document are not aware of any no commercial boot | 
|  | 263 | ROMs that support booting Linux over the network. However, there | 
|  | 264 | are two free implementations of a boot ROM, netboot-nfs and | 
|  | 265 | etherboot, both of which are available on sunsite.unc.edu, and both | 
|  | 266 | of which contain everything you need to boot a diskless Linux client. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 267 |  | 
| Nico Schottelius | 7e9dd12 | 2006-03-24 03:18:18 -0800 | [diff] [blame] | 268 | 3.6) Using pxelinux | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 269 | Pxelinux may be used to boot linux using the PXE boot loader | 
|  | 270 | which is present on many modern network cards. | 
|  | 271 |  | 
|  | 272 | When using pxelinux, the kernel image is specified using | 
| Nico Schottelius | 7e9dd12 | 2006-03-24 03:18:18 -0800 | [diff] [blame] | 273 | "kernel <relative-path-below /tftpboot>". The nfsroot parameters | 
|  | 274 | are passed to the kernel by adding them to the "append" line. | 
| Horms | 64552a5 | 2006-07-10 04:43:58 -0700 | [diff] [blame] | 275 | It is common to use serial console in conjunction with pxeliunx, | 
|  | 276 | see Documentation/serial-console.txt for more information. | 
|  | 277 |  | 
|  | 278 | For more information on isolinux, including how to create bootdisks | 
|  | 279 | for prebuilt kernels, see http://syslinux.zytor.com/ | 
| Nico Schottelius | 7e9dd12 | 2006-03-24 03:18:18 -0800 | [diff] [blame] | 280 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 281 |  | 
|  | 282 |  | 
|  | 283 |  | 
|  | 284 | 4.) Credits | 
|  | 285 | ------- | 
|  | 286 |  | 
|  | 287 | The nfsroot code in the kernel and the RARP support have been written | 
|  | 288 | by Gero Kuhlmann <gero@gkminix.han.de>. | 
|  | 289 |  | 
|  | 290 | The rest of the IP layer autoconfiguration code has been written | 
|  | 291 | by Martin Mares <mj@atrey.karlin.mff.cuni.cz>. | 
|  | 292 |  | 
|  | 293 | In order to write the initial version of nfsroot I would like to thank | 
|  | 294 | Jens-Uwe Mager <jum@anubis.han.de> for his help. |