The Flow of Things

The Flow of Things

There are two daemon processes that provide the NFS services on the server. These are mountd and nfsd. Mountd is responsible for checking access permissions to the exported filesystem. When a clients tries to mount a filesystem, mountd returns a pointer to the filesystem if the client has permission to mount it.

The workhorse on the server side is the nfsd daemon. It has the responsibility of handling all filesystem requests from the clients. Once a filesystem has been mounted, all access to the data on that remote filesystem is made through nfsd. Remember that you could be exporting directories and not just entire filesystems. Therefore it’s better to say that access to the mount point and below is made through nfsd.

Also key to this whole process is the portmapper, portmap. The portmapper converts TCP/IP port numbers to RPC program numbers. What this means is that when the NFS starts up, it registers its port with the local portmap process. The clients access the server by asking the portmapper on the server for the port number of nfsd and mountd. The port number is then used on all subsequent RPC calls.

In principle, mounting a remote filesystem is like mounting a local one. The general syntax is:

mount <options> <filesystem> <mountpoint>

One of the primary differences is that since we are an NFS filesystem, we have to explicitly tell mount, by using the ‘-t nfs option. We can also include other options such as ‘-r’ for read only. Let’s assume that we have our two machines jmohr and siemau. On siemau is an NFS filesystem that we want to mount from jmohr. Assuming that the proper entries exist in the /etc/exports file on siemau, the command on jmohr might look like this:

mount -t nfs junior:/usr/data /data

Like other filesystems, the local mount command parses the command into tokens and ensures that entries don’t already exist in the mount table (/etc/mnttab) for either the filesystem or the directory. Realizing that this is a remote filesystem, mount gets the IP address for siemau (by whatever means are configured on the local machine) and gets the port number of mountd on siemau. The mount command then passes mountd the pathname of the requested directory (/usr/data).

Now it’s the server’s turn. To makes sure it can service the request, mountd must first check /etc/exports for the requested filesystem. In this case /usr/data. If jmohr is permitted, mountd passes back what is called a file handle, or pointer. Now the mount back on jmohr uses that file handle and the mount point (/data) as arguments the mount() system call. Finally, an entry is placed in the local mount table.

There are two primary NFS configuration files: /etc/exports and /etc/fstab. The /etc/exports file exists on the server and list those files and directories that can be accessed by remote hosts. It can also be configured to allow or deny access to specific hosts. Since each of these is a filesystem, you can manage anything mounted by NFS through /etc/fstab. This allows you to mount remote filesystems at boot or in any way you can with a “normal” filesystem. One advantage NFS has over local filesystems is that you can configure them to be mounted only when you need them. That is, if the files in the directories are not used, the connection is not made. However, if the files are needed, the connection is automatically made. This is the concept of automounting, which we will get into next.