Difference between revisions of "Setting up an NFS File Server"

From wiki.emacinc.com
Jump to: navigation, search
Line 1: Line 1:
 
{{todo|final (12.19.13-11:10->MD+);(12.19.13-15:45->KY+)|Mike Dean|project=oe 4,oe 5,md,Finaldraft,ky}}
 
{{todo|final (12.19.13-11:10->MD+);(12.19.13-15:45->KY+)|Mike Dean|project=oe 4,oe 5,md,Finaldraft,ky}}
  
An NFS file server can provide a variety of services to Linux machines on a network.  It can provide a place to store files for a machine to use or write to, it can be used to allow machines to boot a root filesystem image stored on the NFS server, it can provide a place to store filesystem images when they're captured from MTD flash, or it can be connected to a desktop system to provide a commond file store.
+
An NFS file server can provide a variety of services to Linux machines on a network.  It can provide a place to store files for a machine to use or write to, it can be used to allow machines to boot a root filesystem image stored on the NFS server, it can provide a place to store filesystem images when they're captured from MTD flash, or it can be connected to a desktop system to provide a common file store.
  
NFS stands for Network File System. NFS has been in existence since 1984, and is now on version 4.1.  Sun Microsystems was the original developer behind NFS, creating the first version in 1984 but only using it internally for the first five years. Version 2 was released in 1989, and was the first version Sun released to the public.  Version 3 was released in 1995, and added support for files larger than 2 GB, asynchronous writes, performance improvements and support for TCP.  Version 4 was released in late 2000 and includes enhancements which are mostly useful for servers. Version 4.1 was released in 2010, and includes enhancements for clustered server usage.  Version 4.2 is currently in development. For embedded use, version 3 works well and is simpler to configure than version 4.
+
NFS stands for Network File System. NFS was first developed by Sun Microsystems in 1984. The current version, 4.1., was released in 2010. For embedded use, version 3 works well and is simpler to configure than version 4.
  
__TOC__
+
==NFS Services and Tools==
 
 
==NFS Server Fundamentals==
 
 
 
An NFS server requires some services to run.  These are a portmapper daemon, RPC support, and a security service.  NFS also requires tools, both for monitoring and for mounting filesystems.  Finally, NFS servers require a configuration file.
 
 
 
===NFS Services and Tools===
 
  
 
On Ubuntu, Debian, and similar systems, the services and tools required by an NFS server can be installed with the following command:
 
On Ubuntu, Debian, and similar systems, the services and tools required by an NFS server can be installed with the following command:
Line 19: Line 13:
 
On other distributions, check with your package manager for similar packages.
 
On other distributions, check with your package manager for similar packages.
  
===Configuring the NFS Server===
+
==Configuring the NFS Server==
  
The NFS server's shares are configured in the <code>/etc/exports</code> file. Each share takes a list of option names to configure its behavior.  Before configuring the NFS server, the following decisions need to be made (and a list of options created) based on the intended use(s) of the NFS share being created:
+
The NFS server's shares are configured in the <code>/etc/exports</code> file. Each share takes a list of option names to configure its behavior.  Before configuring the NFS server, the following decisions need to be made (and a list of options created) based on the intended use(s) of the NFS share being created:
  
* Do NFS clients need the ability to write to the NFS share?  If so, it needs to be exported <code>rw</code>. Otherwise, export it as <code>ro</code>
+
* Do NFS clients need the ability to write to the NFS share?  If so, it needs to be exported <code>rw</code>. Otherwise, export it as <code>ro</code>
* If the filesystem will be writeable, is performance or data integrity more important?  If performance, <code>async</code> will provide more performance at the risk of lost or corrupt data should the NFS server shut down unexpectedly during a write operation. Otherwise, <code>sync</code> should be used.
+
* If the filesystem will be writeable, is performance or data integrity more important?  If performance, <code>async</code> will provide more performance at the risk of lost or corrupt data should the NFS server shut down unexpectedly during a write operation. Otherwise, <code>sync</code> should be used.
* Is reliability or security more important? If reliability is, use <code>no_subtree_check</code>. Otherwise, use <code>subtree_check</code>.
+
* Is reliability or security more important? If reliability is, use <code>no_subtree_check</code>. Otherwise, use <code>subtree_check</code>.
* Is user level access control required? If not, getting the NFS server working is much simpler with the <code>no_root_squash</code> option.
+
* Is user level access control required? If not, getting the NFS server working is much simpler with the <code>no_root_squash</code> option.
  
Once the above decisions have been made for a share that's being created, the new NFS share needs to be configured in the <code>/etc/exports</code> file. There are three parts to the configuration line that specifies a share:
+
Once the above decisions have been made for a share that's being created, the new NFS share needs to be configured in the <code>/etc/exports</code> file. There are three parts to the configuration line that specifies a share:
  
 
  ''location''    ''address''(''options'')
 
  ''location''    ''address''(''options'')
  
Here:
 
  
* ''location'' - This specifies the directory on the NFS server's filesystem which will be exported as an NFS share.
+
* ''location'' - specifies the directory on the NFS server's filesystem which will be exported as an NFS share.
* ''address'' - This specifies an IP address, a range of IP addresses, a hostname or a hostname wildcard of machine(s) which are allowed to connect to this NFS share.
+
* ''address'' - specifies an IP address, a range of IP addresses, a hostname or a hostname wildcard of machine(s) which are allowed to connect to this NFS share.
* ''options'' - This is the list of options gathered above.  Each option is separated by a comma, with no spaces.
+
* ''options'' - is the list of options gathered above.  Each option is separated by a comma, with no spaces.
  
 
For example, to export the <code>/srv/fs</code> directory to all machines on a <code>192.168.1.0/24</code> network, read-only, with reliability and performance options turned on:
 
For example, to export the <code>/srv/fs</code> directory to all machines on a <code>192.168.1.0/24</code> network, read-only, with reliability and performance options turned on:
Line 53: Line 46:
  
 
  user@ldc:~$ exportfs -a
 
  user@ldc:~$ exportfs -a
 
  
 
==Testing==
 
==Testing==
  
In order to test to ensure that an NFS share was exported correctly, an NFS client needs to be installed on a second machine. If this machine is an EMAC board, the NFS client software should already be installed. On a Debian or Ubuntu system, the following command will install the needed packages:
+
In order to test to ensure that an NFS share was exported correctly, an NFS client needs to be installed on a second machine. If this machine is an EMAC board, the NFS client software should already be installed. On a Debian or Ubuntu system, the following command will install the needed packages:
  
 
  user@ldc:~$ sudo apt-get install nfs-common portmap
 
  user@ldc:~$ sudo apt-get install nfs-common portmap
Line 78: Line 70:
 
==Configuring a Client==
 
==Configuring a Client==
  
In the testing section is shown a method of mounting an NFS share on a temporary basis. For many uses of an NFS server, however, having the NFS client automatically mount the NFS share on boot is preferred (or required).  To enable this behavior, the NFS share needs to be configured rather than mounted directly.
+
In the testing section is shown a method of mounting an NFS share on a temporary basis. For many uses of an NFS server, however, having the NFS client automatically mount the NFS share on boot is preferred (or required).  
  
The <code>/etc/fstab</code> file provides information to the operating system regarding what devices need to be mounted where.  <code>fstab</code> stands for, "Filesystem Table."  Each line of the file represents one mountpoint.  To configure a system to mount an NFS share on boot, a line needs to be added to this file similar to the following:
+
To configure a system to mount an NFS share on boot, a line needs to be added to the <code>/etc/fstab</code> file similar to the following:
  
 
  192.168.1.20:/srv/fs  /srv/nfs  nfs    ro,async 0 0
 
  192.168.1.20:/srv/fs  /srv/nfs  nfs    ro,async 0 0
  
The above line configures the client system to connect to the <code>/srv/fs</code> share from the example in the configuring section above. To mount the <code>/srv/logs</code> share from the same section:
+
The above line configures the client system to connect to the <code>/srv/fs</code> share from the example in the configuring section above. To mount the <code>/srv/logs</code> share from the same section:
  
 
  10.0.0.30:/srv/logs  /srv/logs  nfs  rw,sync  0 0
 
  10.0.0.30:/srv/logs  /srv/logs  nfs  rw,sync  0 0
Line 96: Line 88:
 
  user@ldc:~$ sudo mount /srv/nfs
 
  user@ldc:~$ sudo mount /srv/nfs
  
If there is an error, check to ensure the directory for the mount on the client machine exists. For a share which is mounted <code>rw</code>, the <code>touch</code> command can be used to create an empty file in the NFS share from the client machine. For example:
+
If there is an error, check to ensure the directory for the mount on the client machine exists. For a share which is mounted <code>rw</code>, the <code>touch</code> command can be used to create an empty file in the NFS share from the client machine. For example:
  
 
  user@ldc:~$ touch /srv/logs/test_file
 
  user@ldc:~$ touch /srv/logs/test_file
Line 104: Line 96:
 
==Summary==
 
==Summary==
  
The NFS filesystem is useful for making files available to remote machines, whether the client machines only need to be able to read them or write to them. A use of NFS shares which is very helpful for embedded systems is to provide a network root filesystem.  See [[Booting with an NFS Root Filesystem]] for more information.
+
The NFS filesystem is useful for making files available to remote machines, whether the client machines only need to be able to read them or write to them. For embedded systems, NFS can be used to provide a network root filesystem.  See [[Booting with an NFS Root Filesystem]] for more information.

Revision as of 19:12, 30 December 2013

TODO: {{#todo:final (12.19.13-11:10->MD+);(12.19.13-15:45->KY+)|Mike Dean|oe 4,oe 5,md,Finaldraft,ky}}

An NFS file server can provide a variety of services to Linux machines on a network. It can provide a place to store files for a machine to use or write to, it can be used to allow machines to boot a root filesystem image stored on the NFS server, it can provide a place to store filesystem images when they're captured from MTD flash, or it can be connected to a desktop system to provide a common file store.

NFS stands for Network File System. NFS was first developed by Sun Microsystems in 1984. The current version, 4.1., was released in 2010. For embedded use, version 3 works well and is simpler to configure than version 4.

NFS Services and Tools

On Ubuntu, Debian, and similar systems, the services and tools required by an NFS server can be installed with the following command:

user@ldc:~$ sudo apt-get install nfs-kernel-server nfs-common portmap

On other distributions, check with your package manager for similar packages.

Configuring the NFS Server

The NFS server's shares are configured in the /etc/exports file. Each share takes a list of option names to configure its behavior. Before configuring the NFS server, the following decisions need to be made (and a list of options created) based on the intended use(s) of the NFS share being created:

  • Do NFS clients need the ability to write to the NFS share? If so, it needs to be exported rw. Otherwise, export it as ro
  • If the filesystem will be writeable, is performance or data integrity more important? If performance, async will provide more performance at the risk of lost or corrupt data should the NFS server shut down unexpectedly during a write operation. Otherwise, sync should be used.
  • Is reliability or security more important? If reliability is, use no_subtree_check. Otherwise, use subtree_check.
  • Is user level access control required? If not, getting the NFS server working is much simpler with the no_root_squash option.

Once the above decisions have been made for a share that's being created, the new NFS share needs to be configured in the /etc/exports file. There are three parts to the configuration line that specifies a share:

location     address(options)


  • location - specifies the directory on the NFS server's filesystem which will be exported as an NFS share.
  • address - specifies an IP address, a range of IP addresses, a hostname or a hostname wildcard of machine(s) which are allowed to connect to this NFS share.
  • options - is the list of options gathered above. Each option is separated by a comma, with no spaces.

For example, to export the /srv/fs directory to all machines on a 192.168.1.0/24 network, read-only, with reliability and performance options turned on:

/srv/fs      192.168.1.0/255.255.255.0(ro,async,no_subtree_check,no_root_squash)

To export the /srv/logs/ directory as a writeable NFS share with data integrity and reliability options on the 10.0.0.0/8 network:

/srv/logs    10.0.0.0/255.0.0.0(rw,sync,no_root_squash)

To export the /srv/homes directory as a writeable NFS share with data integrity, reliability and user level access control on the 172.16.0.0/16 network:

/srv/homes    172.16.0.0/255.255.0.0(rw,sync)

Adding any of the lines listed above will create the NFS share specified by the line, assuming the directory specified in the line exists. After adding an export line to /etc/exports, run the following command to notify the NFS server of the configuration change:

user@ldc:~$ exportfs -a

Testing

In order to test to ensure that an NFS share was exported correctly, an NFS client needs to be installed on a second machine. If this machine is an EMAC board, the NFS client software should already be installed. On a Debian or Ubuntu system, the following command will install the needed packages:

user@ldc:~$ sudo apt-get install nfs-common portmap

Now, to mount the /srv/fs share exported above with a server address of 192.168.1.20 on the local directory, /srv/nfs:

user@ldc:~$ sudo mount 192.168.1.20:/srv/fs /srv/nfs

To verify that it mounted:

user@ldc:~$ mount
...
192.168.1.20:/srv/fs on /srv/nfs type nfs (ro,vers=3,addr=192.168.1.20,clientaddr=192.168.1.142)

In the output is the line which shows the mount. The files in the directory can be listed:

user@ldc:~$ ls /srv/nfs
filea fileb filec filed

Configuring a Client

In the testing section is shown a method of mounting an NFS share on a temporary basis. For many uses of an NFS server, however, having the NFS client automatically mount the NFS share on boot is preferred (or required).

To configure a system to mount an NFS share on boot, a line needs to be added to the /etc/fstab file similar to the following:

192.168.1.20:/srv/fs  /srv/nfs   nfs    ro,async 0 0

The above line configures the client system to connect to the /srv/fs share from the example in the configuring section above. To mount the /srv/logs share from the same section:

10.0.0.30:/srv/logs  /srv/logs  nfs  rw,sync   0 0

After a line is entered into the /etc/fstab file, it can be mounted either this way:

user@ldc:~$ sudo mount -a

or this way:

user@ldc:~$ sudo mount /srv/nfs

If there is an error, check to ensure the directory for the mount on the client machine exists. For a share which is mounted rw, the touch command can be used to create an empty file in the NFS share from the client machine. For example:

user@ldc:~$ touch /srv/logs/test_file
user@ldc:~$ ls /srv/logs
test_file

Summary

The NFS filesystem is useful for making files available to remote machines, whether the client machines only need to be able to read them or write to them. For embedded systems, NFS can be used to provide a network root filesystem. See Booting with an NFS Root Filesystem for more information.