NFS:
Part I, The Protocol
Ron McCarty
The Network File Server (NFS) protocol provides an open standard
for giving clients remote access to file systems. NFS allows administrators
to create centralized file systems that ease management tasks such
as backups and virus checking. Large, centralized drivers are easier
to maintain than many distributed small drives.
Besides lending itself to centralized storage, NFS has also proven
itself useful in other applications such as diskless and thin clients,
network clustering, and cross-platform interoperability applications.
A better understanding of the protocol and implementation considerations
will ensure smooth operations of remote file access via NFS. This
two-part article covers NFS -- the first part covers the protocol
and design considerations, and the second part covers using NFS
on Solaris and Linux.
In the Beginning...
The NFS protocol was originally designed by Sun and eventually
released to the Internet with RFC 1094, "NFS: Network File
System Protocol Specification" in 1989. It is interesting to
note that Novell's strategy at the time was to perfect file
services in a very closed manner, and although Sun had not, until
the recent open source movement, been as open on network implementations,
they did see the importance of interoperability with other systems.
RFC 1094 covered the original two specifications, but Version
3 was already under specification development as Sun released the
original RFC. Version 3's specification is covered in RFC 1813,
"NFS Version 3 Protocol Specification". Version 4 of the
protocol is defined in RFC 3010, "NFS Version 4 Protocol".
NFS is widely deployed on all types of UNIX hosts, Microsoft and
Novell networks, and IBM solutions such as AS400 and OS/390. Despite
its not being known outside the network realm, it may be the most
widely deployed platform-independent network file system.
UNIX Roots
Although NFS is not platform specific, it does have roots in UNIX;
stated otherwise, the file hierarchy and access methods are very
similar to the UNIX practice of handling file systems including
structure, user and group identification, and file handling. For
example, the NFS concept of file system follows the same structure
of a UNIX file system and is directly mounted within it. When NFS
is used by other operating systems, a method of mapping user identification,
file permissions, and file access limitations must be used. Table
1 lists resources on popular implementations of the mapping.
NFS
NFS works within a client/server architecture. The client accesses
file systems exported by the NFS server through the NFS mount point
on the client. The access is typically transparent to the client
application.
Unlike many client server communications, NFS uses remote procedure
calls for communications. A typical client would connect to a well-known
port and then use particulars of the protocol to request specific
action. With the remote procedure call, however, the client creates
the procedure call and then sends it to the server for execution.
A detailed view of NFS is covered shortly.
As an example, consider the client that has mounted the directory
usr2 into the local root file system:
/root/usr2/ --> remote:/root/usr/
Should the client application need to access the directory, it simply
requests the directory and file name of the operating system. The
operating system then provides access through the NFS client. For
example, consider the simple UNIX command cd. cd is
not aware of network protocols, but by using:
cd /root/usr2/
the cd places the working directory on the remote file system
without the cd command (or the user, necessarily) knowing that
the file system is remote.
When the NFS server receives the request, it will then determine
that the user has access rights for the particular action requested
and, assuming access permission, the NFS server will serve the file
requested.
A Closer Look
From the client perspective, there are several steps that occur
when a remote file system is mounted locally through NFS. As mentioned,
the NFS client creates an RPC for the server to execute. Note that
the client, under UNIX, is implemented as one program (the mount
command), but the server is actually implemented as several programs
with a port mapper, mount daemon, and NFS server being the minimum.
During initial communication with the server, the client mount
command will communicate with the server's port mapper, which
is listening on the known port 111. Most implementations of the
client mount command will support multiple versions of NFS,
which improves the likelihood of a common protocol between client
and server. The mount command starts with the highest protocol
supported, thus ensuring the common protocol is also the newest
protocol supported by both client and server.
(Version 3 is probably the most deployed version of NFS, with
NFS Version 4 support gaining slowly by most implementations, so
the material covered is Version 3.)
The server's port mapper server will respond with the protocol
supported as well as the port the mount daemon is running on. At
this point, the client mount can connect to the mount daemon and
issue the mount command via RPC to the server mount daemon.
Once successfully completed, the client can then connect to the
NFS server on port 2049 and, using one of the 20 RPCs as defined
by RFC 1813 and summarized in the following table, to access the
remote file system.
ACCESS -- Check access permission
COMMIT -- Commit cached data on a server to stable storage
CREATE -- Create a file
FSINFO -- Get static file system information
FSSTAT -- Get dynamic file system information
GETATTR -- Get file attributes
LINK -- Create link to an object
LOOKUP -- Lookup filename
MKDIR -- Create a directory
MKNOD -- Create a special device
READ -- Read file
READDIR -- Read From directory
READDIRPLUS -- Extended read from directory
READLINK -- Read symbolic link
REMOVE -- Remove a file
RENAME -- Rename a file or directory
RMDIR -- Remove a directory
SETATTR -- Set file attributes
SYMLINK -- Create a symbolic link
WRITE -- Write file
Most of the commands are very intuitive and, due to NFS's
UNIX roots, most administrators recognize the commands. The following
tcdump output shows the READ command created by the
UNIX cat command to read the test-file file:
10:30:16.012010 eth0 > 192.168.1.254.3476097947 > \
192.168.1.252.2049: 144 lookup fh 32,0/224145 "test-file"
10:30:16.012010 eth0 > 192.168.1.254.3476097947 > \
192.168.1.252.2049: 144 lookup fh 32,0/224145 "test-file"
10:30:16.012729 eth0 < 192.168.1.252.2049 > \
192.168.1.254.3476097947: reply ok 128 lookup fh 32,0/224307 (DF)
10:30:16.012729 eth0 < 192.168.1.252.2049 > \
192.168.1.254.3476097947: reply ok 128 lookup fh 32,0/224307 (DF)
10:30:16.013124 eth0 > 192.168.1.254.3492875163 > \
192.168.1.252.2049: 140 read fh 32,0/224307 4096 bytes @ 0
10:30:16.013124 eth0 > 192.168.1.254.3492875163 > \
192.168.1.252.2049: 140 read fh 32,0/224307 4096 bytes @ 0
10:30:16.013650 eth0 < 192.168.1.252.2049 > \
192.168.1.254.3492875163: reply ok 108 read (DF)
10:30:16.013650 eth0 < 192.168.1.252.2049 > \
192.168.1.254.3492875163: reply ok 108 read (DF)
NFS has traditionally been implemented over UDP, but TCP support is
provided by the protocol specifications and supported by some versions
of NFS. The greatest advantage TCP provides is the improvement of
retransmissions on troublesome networks. (With UDP, an entire RPC
message, made up of several UDP packets, must be retransmitted should
a failure occur. With TCP only the dropped fragment is retransmitted.)
NFS Access
NFS implementations typically provide access rights through four
methods: user and file attributes, share-level access, host-level
access, and hybrids of the other methods.
User and file attributes rely on UNIX built-in support of user,
group, and file access permissions. To ease management, user and
group identifications should be uniform across NFS clients and servers.
File permissions and access should be carefully considered as well.
NFS can inadvertently provide access to files that was not planned
with the original creation of the files.
Share-level access allows limiting the access to a specific activity
regardless of the UNIX file ownership or permissions. For example,
an NFS can be limited to read only. Most implementations of NFS
will allow the share-level access to be further limited to particular
users or groups. For example, grant read-only access to the group
"human resources".
Host-level access allows file systems to be mounted only on particular
hosts and is generally a good idea since file systems can easily
be mounted by any host supporting NFS.
Hybrid access simply mixes the above methods (such as share-level
access with particular user access). Another example is to only
allow users from a particular host to access an NFS.
Summary
NFS, though not typical for a network protocol, provides an efficient
method to providing remote file access to users. I've covered
operation of the protocol in the first part of this two-part series.
Next time, I will cover Linux and Solaris implementations of the
protocol with examples and traces. Stay tuned.
Ronald McCarty received his bachelor's degree in Computer
and Information Systems at the University of Maryland's international
campus at Schwaebisch Gmuend, Germany. After completing his degree,
Ronald McCarty started his network career as network administrator
at the Schwaebisch Gmuend campus. Ronald McCarty works for Lucent
Technologies as a senior systems engineer on a customer team responsible
for a major telecommunications carrier. He spends his free time
with his two best friends in the world: his daughter, Janice, and
his wife, Claudia. Ron can be reached at: ronald.mccarty@gte.net.
|