21.7. The /etc/exports Configuration File
The
/etc/exports
file controls which file systems are exported to remote hosts and specifies options. Blank lines are ignored, comments can be made by starting a line with the hash mark (#
), and long lines can be wrapped with a backslash (\
). Each exported file system should be on its own individual line, and any lists of authorized hosts placed after an exported file system must be separated by space characters. Options for each of the hosts must be placed in parentheses directly after the host identifier, without any spaces separating the host and the first parenthesis. Valid host types are gss/krb5
, gss/krb5i
, and gss/krb5p
.
A line for an exported file system has the following structure:
<export> <host1>(<options>) <hostN>(<options>)...
In this structure, replace <export> with the directory being exported, replace <host1> with the host or network to which the export is being shared, and replace <options> with the options for that host or network. Additional hosts can be specified in a space separated list.
The following methods can be used to specify host names:
- single host — Where one particular host is specified with a fully qualified domain name, hostname, or IP address.
- wildcards — Where a
*
or?
character is used to take into account a grouping of fully qualified domain names that match a particular string of letters. Wildcards should not be used with IP addresses; however, it is possible for them to work accidentally if reverse DNS lookups fail.Be careful when using wildcards with fully qualified domain names, as they tend to be more exact than expected. For example, the use of*.example.com
as a wildcard allows sales.example.com to access an exported file system, but not bob.sales.example.com. To match both possibilities both*.example.com
and*.*.example.com
must be specified. - IP networks — Allows the matching of hosts based on their IP addresses within a larger network. For example,
192.168.0.0/28
allows the first 16 IP addresses, from 192.168.0.0 to 192.168.0.15, to access the exported file system, but not 192.168.0.16 and higher. - netgroups — Permits an NIS netgroup name, written as
@<group-name>
, to be used. This effectively puts the NIS server in charge of access control for this exported file system, where users can be added and removed from an NIS group without affecting/etc/exports
.
In its simplest form, the
/etc/exports
file only specifies the exported directory and the hosts permitted to access it, as in the following example:
/exported/directory bob.example.com
In the example,
bob.example.com
can mount /exported/directory/
. Because no options are specified in this example, the following default NFS options take effect:
ro
— Mounts of the exported file system are read-only. Remote hosts are not able to make changes to the data shared on the file system. To allow hosts to make changes to the file system, the read/write (rw
) option must be specified.wdelay
— Causes the NFS server to delay writing to the disk if it suspects another write request is imminent. This can improve performance by reducing the number of times the disk must be accessed by separate write commands, reducing write overhead. Theno_wdelay
option turns off this feature, but is only available when using thesync
option.root_squash
— Prevents root users connected remotely from having root privileges and assigns them the user ID for the usernfsnobody
. This effectively "squashes" the power of the remote root user to the lowest local user, preventing unauthorized alteration of files on the remote server. Alternatively, theno_root_squash
option turns off root squashing. To squash every remote user, including root, use theall_squash
option. To specify the user and group IDs to use with remote users from a particular host, use theanonuid
andanongid
options, respectively. In this case, a special user account can be created for remote NFS users to share and specify(anonuid=<uid-value>,anongid=<gid-value>)
, where<uid-value>
is the user ID number and<gid-value>
is the group ID number.
Important
By default, access control lists (ACLs) are supported by NFS under Red Hat Enterprise Linux. To disable this feature, specify the
no_acl
option when exporting the file system.
Each default for every exported file system must be explicitly overridden. For example, if the
rw
option is not specified, then the exported file system is shared as read-only. The following is a sample line from /etc/exports
which overrides two default options:
/another/exported/directory 192.168.0.3(rw,sync)
In this example
192.168.0.3
can mount /another/exported/directory/
read/write and all transfers to disk are committed to the disk before the write request by the client is completed.
Additionally, other options are available where no default value is specified. These include the ability to disable sub-tree checking, allow access from insecure ports, and allow insecure file locks (necessary for certain early NFS client implementations). Refer to the
exports
man page for details on these lesser used options.
Warning
The format of the
/etc/exports
file is very precise, particularly in regards to use of the space character. Remember to always separate exported file systems from hosts and hosts from one another with a space character. However, there should be no other space characters in the file except on comment lines.
For example, the following two lines do not mean the same thing:
/home bob.example.com(rw) /home bob.example.com (rw)
The first line allows only users from
bob.example.com
read/write access to the /home
directory. The second line allows users from bob.example.com
to mount the directory as read-only (the default), while the rest of the world can mount it read/write.
21.7.1. The exportfs
Command
Every file system being exported to remote users via NFS, as well as the access level for those file systems, are listed in the
/etc/exports
file. When the nfs
service starts, the /usr/sbin/exportfs
command launches and reads this file, passes control to rpc.mountd
(if NFSv2 or NFSv3) for the actual mounting process, then to rpc.nfsd
where the file systems are then available to remote users.
When issued manually, the
/usr/sbin/exportfs
command allows the root user to selectively export or unexport directories without restarting the NFS service. When given the proper options, the /usr/sbin/exportfs
command writes the exported file systems to /var/lib/nfs/xtab
. Since rpc.mountd
refers to the xtab
file when deciding access privileges to a file system, changes to the list of exported file systems take effect immediately.
The following is a list of commonly used options available for
/usr/sbin/exportfs
:
-r
— Causes all directories listed in/etc/exports
to be exported by constructing a new export list in/etc/lib/nfs/xtab
. This option effectively refreshes the export list with any changes that have been made to/etc/exports
.-a
— Causes all directories to be exported or unexported, depending on what other options are passed to/usr/sbin/exportfs
. If no other options are specified,/usr/sbin/exportfs
exports all file systems specified in/etc/exports
.-o file-systems
— Specifies directories to be exported that are not listed in/etc/exports
. Replace file-systems with additional file systems to be exported. These file systems must be formatted in the same way they are specified in/etc/exports
. Refer to Section 21.7, “The/etc/exports
Configuration File” for more information on/etc/exports
syntax. This option is often used to test an exported file system before adding it permanently to the list of file systems to be exported.-i
— Ignores/etc/exports
; only options given from the command line are used to define exported file systems.-u
— Unexports all shared directories. The command/usr/sbin/exportfs -ua
suspends NFS file sharing while keeping all NFS daemons up. To re-enable NFS sharing, typeexportfs -r
.-v
— Verbose operation, where the file systems being exported or unexported are displayed in greater detail when theexportfs
command is executed.
If no options are passed to the
/usr/sbin/exportfs
command, it displays a list of currently exported file systems.
For more information about the
/usr/sbin/exportfs
command, refer to the exportfs
man page.
21.7.1.1. Using exportfs
with NFSv4
The
exportfs
command is used in maintaining the NFS table of exported file systems. When typed in a terminal with no arguments, the exportfs
command shows all the exported directories.
Since NFSv4 no longer utilizes the
MOUNT
protocol, which was used with the NFSv2 and NFSv3 protocols, the mounting of file systems has changed.
An NFSv4 client now has the ability to see all of the exports served by the NFSv4 server as a single file system, called the NFSv4 pseudo-file system. On Red Hat Enterprise Linux, the pseudo-file system is identified as a single, real file system, identified at export with the
fsid=0
option.
For example, the following commands could be executed on an NFSv4 server:
mkdir /exports
mkdir /exports/opt
mkdir /exports/etc
mount --bind /usr/local/opt /exports/opt
mount --bind /usr/local/etc /exports/etc
exportfs -o fsid=0,insecure,no_subtree_check gss/krb5p:/exports
exportfs -o rw,nohide,insecure,no_subtree_check gss/krb5p:/exports/opt
exportfs -o rw,nohide,insecure,no_subtree_check gss/krb5p:/exports/etc
In this example, clients are provided with multiple file systems to mount, by using the
--bind
option which creates unbreakable links.
Because of the pseudo-file systems feature, NFS version 2, 3 and 4 export configurations are not always compatible. For example, given the following directory tree:
/home /home/sam /home/john /home/joe
and the export:
/home *(rw,fsid=0,sync)
Using NFS version 2,3 and 4 the following would work:
mount server:/home /mnt/home
ls /mnt/home/joe
Using v4 the following would work:
mount -t nfs4 server:/ /mnt/home
ls /mnt/home/joe
The difference being "
server:/home
" and "server:/
". To make the exports configurations compatible for all version, one needs to export (read only) the root filesystem with an fsid=0
. The fsid=0
signals the NFS server that this export is the root.
/ *(ro,fsid=0) /home *(rw,sync,nohide)
Now with these exports, both "
mount server:/home /mnt/home
" and "mount -t nfs server:/home /mnt/home
" will work as expected.