29.3. 网络文件系统(NFS)

Reorganized and enhanced by Tom Rhodes.
Written by Bill Swingle.

FreeBSD 支持网络文件系统 (NFS),它允许服务器通过网络与客户端共享目录和文件。使用NFS,用户和程序可以访问远程系统上的文件,就像它们存储在本地一样。

以下是NFS最显而易见的好处:

NFS 至少包括两个主要的部分: 一台服务器, 以及至少一台客户机, 客户机远程地访问保存在服务器上的数据。 要让这一切运转起来, 需要配置并运行几个程序。

这些守护进程必须在服务器上运行:

服务描述
nfsdNFS,为来自NFS客户端的 请求服务。
mountdNFS挂载服务,处理nfsd(8)递交过来的请求。
rpcbind此服务允许 NFS 客户程序查询正在被 NFS 服务使用的端口。

客户端同样运行一些进程,比如 nfsiodnfsiod处理来自NFS的请求。 这是可选的,而且可以提高性能,对于普通和正确的操作来说并不是必须的。

29.3.1. 设定服务器

/etc/exports中指定了NFS服务器需要共享的文件系统。此文件中的每一行指定要共享的文件系统、客户端访问权限以及所有访问选项。向此文件添加条目时,每个导出的文件系统、其属性和允许的主机必须出现在一行上。如果条目中未列出任何客户端,则网络上的任何客户端都可以装载该文件系统。

下面的/etc/exports条目演示了如何导出文件系统。这些例子可以根据读者网络上的文件系统和客户端名称进行修改。这个文件中可以使用的选项有很多,但这里只提到几个。有关选项的完整列表,请参阅exports(5)

此示例演示如何将/cdrom导出到名为alpha, bravo, 和 charlie的三个主机上:

/cdrom -ro alpha bravo charlie

-ro标志使文件系统为只读,以防止客户端对导出的文件系统进行任何更改。此示例假定主机名位于DNS中或/etc/hosts中。如果网络没有DNS服务器,请参阅hosts(5).

下一个示例通过IP地址将/home导出到三个客户端。这对于没有DNS/etc/hosts条目的网络很有用。-alldirs标志允许子目录成为挂载点。换句话说,它不会自动挂载子目录,而是允许客户端根据需要挂载所需的目录。

/usr/home  -alldirs  10.0.0.2 10.0.0.3 10.0.0.4

下面这个例子导出了/a,这样来自不同域的客户端就可以访问该文件系统。-maproot=root允许远程系统上的rootroot的形式在导出的文件系统中写入数据。如果没有指定-maproot=root,客户机的用户将被映射到服务器的root账户上,并受限于为nobody定义的访问限制。

/a  -maproot=root  host.example.com box.example.org

每个文件系统只能指定一次客户端。例如,如果/usr是单个文件系统,则这些条目将无效,因为两个条目都指定相同的主机:

# Invalid when /usr is one file system
/usr/src   client
/usr/ports client

解决这一问题的正确的格式是:

/usr/src /usr/ports  client

下面是一个有效的导出列表的例子,其中/usr/exports是本地文件系统:

# Export src and ports to client01 and client02, but only
# client01 has root privileges on it
/usr/src /usr/ports -maproot=root    client01
/usr/src /usr/ports               client02
# The client machines have root and can mount anywhere
# on /exports. Anyone in the world can mount /exports/obj read-only
/exports -alldirs -maproot=root      client01 client02
/exports/obj -ro

要在系统启动时启用NFS服务器所需的进程,请在/etc/rc.conf中添加这些选项:

rpcbind_enable="YES"
nfs_server_enable="YES"
mountd_enable="YES"

使用以下命令启动 nfs 服务端:

# service nfsd start

NFS 服务启动时, mountd 也会自动启动。然而,mountd 仅在启动时读取 /etc/exports 。为了使后续的 /etc/exports 编辑内容立即生效,需要强制 mountd 重新读取:

# service mountd reload

29.3.2. 设定客户端

要启用NFS客户端,在每个客户端的/etc/rc.conf中设置此选项:

nfs_client_enable="YES"

然后,在每个NFS客户端上运行此命令:

# service nfsclient start

客户端现在已经可以挂载远程文件系统了。在这些例子中,服务器的名称是 server,客户端的名称是 client。将 server 上的/home 挂载到 client 上的 /mnt 挂载点:

# mount server:/home /mnt

这条命令会把服务端的 /home 目录挂载到客户端的 /mnt 上。 如果配置正确,您应该可以进入客户端的 /mnt 目录并且看到所有服务端的文件。

如果您打算让系统每次在重启动的时候都自动挂载远端的文件系统,把那个文件系统加到 /etc/fstab 文件里头去。下面是例子:

server:/home	/mnt	nfs	rw	0	0

有关所有可用选项的说明,请参阅fstab(5)

29.3.3. 锁

某些应用程序 (例如 mutt) 需要文件上锁支持才能正常运行。 要启用它, 需要在服务器和客户机的 /etc/rc.conf 中加入这些行:

rpc_lockd_enable="YES"
rpc_statd_enable="YES"

然后使用下述命令启动该程序:

# service lockd start
# service statd start

如果并不需要真的在 NFS 客户机和 NFS 服务器间确保上锁的语义, 可以让 NFS 客户机在本地上锁, 方法是使用 mount_nfs(8) 时指定 -L 参数。 请参见 mount_nfs(8) 联机手册以了解更多细节。

29.3.4. 使用autofs(5)自动挂载

注意:

从 FreeBSD 10.1-RELEASE 起,系统支持 autofs(5) 自动挂载组件。若需在老版本的 FreeBSD 上使用自动挂载功能,请使用 amd(8)。本章节只介绍 autofs(5)

autofs(5)设施是几个组件的通用名称,它们共同允许在访问远程和本地文件系统中的文件或目录时自动挂载。它由内核组件autofs(5)和一些用户空间应用程序组成。automount(8)automountd(8)autounmountd(8)。它可以作为以前 FreeBSD 版本中 amd(8)的替代。Amd 仍然是为了向后兼容的目的而提供的, 因为两者使用了不同的映射格式; autofs 使用的映射格式与其他 SVR4 自动挂载器, 例如 Solaris、MacOS X 和 Linux 中的自动挂载器是一样的。

autofs(5)虚拟文件系统通过automount(8)安装在指定的装载点上,通常在引导期间调用。

每当一个进程试图访问autofs(5)挂载点内的文件时,内核就会通知automountd(8)守护进程,并暂停触发进程。automountd(8)守护进程将通过找到合适的映射并根据映射来处理内核请求,然后向内核发出信号,释放被阻止的进程。automountd(8)守护进程在一段时间后会自动解除自动挂载的文件系统,除非这些文件系统还在使用。

autofs 的主配置文件位于 /etc/auto_masterauto_master的语法规则在 auto_master(5)有介绍。

/net上挂载了一个特殊的自动加载器地图。当在此目录下访问文件时,autofs(5)会查找相应的远程挂载点,并自动挂载。比如说。试图访问/net/foobar/usr中的文件,会告诉automountd(8)从主机上挂载/usr导出的文件foobar

例 29.2. 使用autofs(5)挂载Export

您可以通过使用 showmount -e 命令来查看 NFS 服务器上导出的文件系统。 例如, 要查看foobar 上导出的文件系统, 可以用:

% showmount -e foobar
Exports list on foobar:
/usr                               10.10.10.0
/a                                 10.10.10.0
% cd /net/foobar/usr

showmount的输出显示/usr为导出路径。当将目录更改为/host/foobar/usr时,automountd(8)会拦截该请求,并尝试解析hostnamefoobar。如果成功,automountd(8)会自动挂载源导出。

要在启动时启用 autofs(5),请在 /etc/rc.conf中添加此行:

autofs_enable="YES"

然后 autofs(5) 可以使用以下命令启动:

# service automount start
# service automountd start
# service autounmountd start

autofs(5)映射格式与其他操作系统相同。有关其他来源的此格式的信息可能很有用,如Mac OS X document

更多信息请参阅automount(8), automountd(8), autounmountd(8), 和 auto_master(5)

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.