32.3. 网络文件系统(NFS)

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

NFS 有许多实际用途。一些较常见的用途包括:

  • 将在每个客户端上重复的数据保存在一个位置,并由网络上的客户端访问。
  • 多个客户端可能都需要访问目录 /usr/ports/distfiles。共享该目录允许快速访问源文件,而无需将它们下载到每个客户端。
  • 在大型网络上,配置存储所有用户主目录的中央 NFS 服务器通常更方便。用户可以登录到网络上任何位置的客户端,并可以访问其主目录。
  • NFS 导出的管理得到简化。例如,只有一个文件系统必须设置安全或备份策略。
  • 可移动媒体存储设备可由网络上的其他计算机使用。这减少了整个网络中的设备数量,并提供一个集中的位置来管理其安全性。从集中安装设备在多台计算机上安装软件通常更方便。

NFS 由一台服务器和一个或多个客户端组成。客户端远程访问存储在服务器计算机上的数据。为了使其正常运行,必须配置和运行一些进程。

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

守护进程说明
nfsdNFS 守护程序,用于处理来自 NFS 客户端的请求。
mountdNFS 挂载守护程序,它执行从 nfsd 收到的请求。
rpcbind此守护程序允许 NFS 客户端发现 NFS 服务器正在使用的端口。

在客户端上运行 nfsiod(8)open in new window 可以提高性能,但非必需。

32.3.1. 配置服务器

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

以下 /etc/export 条目演示了如何导出文件系统。可以修改这些示例以匹配读取器网络上的文件系统和客户端名称。在此文件中可以使用许多选项,但此处仅提及少数几个选项。有关选项的完整列表见 exports(5)open in new window

此示例演示如何将 /cdrom 导出到三个名为 alphabravocharlie 的主机:

/cdrom -ro alpha bravo charlie

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

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

/usr/home  -alldirs  10.0.0.2 10.0.0.3 10.0.0.4

下面这个例子导出 /a,这样来自不同领域的两个客户可以访问该文件系统。-maproot=roo 允许远程系统的 rootroot 身份在导出的文件系统上写数据。如果没有指定 -maproot=root,客户端的 root 用户将被映射到服务器的 nobody 账户上,并将受到为 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/export 是本地文件系统:

# 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"

现在可以通过运行以下命令启动服务器:

# service nfsd start

每当 NFS 服务器启动时,mountd 也会自动启动。但是,mountd 仅在启动时读取 /etc/export。要使后续的 /etc/export 编辑立即生效,请强制重载以重新读取它:

# service mountd reload

请参考 nfsv4(4)open in new window 以了解对 NFS 第 4 版配置的说明。

32.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 中的文件和目录将在 client 的 **/mnt** 目录中可用。

要在每次客户端引导时挂载远程文件系统,请将其添加到 /etc/fstab

server:/home	/mnt	nfs	rw	0	0

请参考 fstab(5)open in new window 获取所有可用选项的说明。

32.3.3. 锁定

某些应用程序需要文件锁定才能正常运行。要启用锁定,请将以下行添加到客户端和服务器上的 /etc/rc.conf 中:

rpc_lockd_enable="YES"
rpc_statd_enable="YES"

然后启动应用程序:

# service lockd start
# service statd start

如果服务器上不需要锁定,则可以将 NFS 客户端配置为通过在运行挂载时包含 -L 来在本地锁定。有关详细信息,请参阅 mount_nfs(8)open in new window

32.3.4. 使用 autofs(5)open in new window 自动挂载

注意

自动挂载工具 autofs(5)open in new window 从 FreeBSD 10.1-RELEASE 开始受支持。要在旧版本的 FreeBSD 中使用自动挂载器功能,请改用 amd(8)open in new window。本章仅介绍自动挂载器 autofs(5)open in new window

autofs(5)open in new window 工具是多个组件的通用名称,每当访问远程和本地文件系统中的文件或目录时,这些组件一起允许自动挂载远程和本地文件系统。它由内核组件 autofs(5)open in new window 和几个用户空间应用程序组成:automount(8)open in new windowautomountd(8)open in new windowautounupd(8)open in new window。它作为旧的 FreeBSD release 中 amd(8)open in new window 的替代方案。amd 仍然用于向后兼容目的,因为两者使用不同的映射格式;autofs 使用的自动加载器与其他 SVR4 自动加载器相同,例如 Solaris、MacOS X 和 Linux 中的自动加载器。

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

每当进程尝试访问 autofs(5)open in new window 挂载点内的文件时,内核都会通知守护程序 automountd(8)open in new window 并暂停触发进程。守护程序 automountd(8)open in new window 将处理内核请求,通过找到正确的映射并据此挂载文件系统,然后向内核发出释放被阻止进程的信号。守护程序 autounmountd(8)open in new window 会在一段时间后自动卸载自动挂载的文件系统,除非它们仍在使用中。

autofs 主配置文件是 /etc/auto_master。它将单个映射分配给顶级挂载。有关 auto_master 和映射语法的说明,请参阅 auto_master(5)open in new window

/net 上有一个特殊的自动挂载器映射。当一个文件在这个目录中被访问时,autofs(5)open in new window 会查找相应的远程挂载并自动挂载它。例如,尝试访问 /net/foobar/usr 中的文件会告诉 automountd(8)open in new window 从主机 foobar 挂载的 /usr 导出。

例 45.使用 autofs(5)open in new window 挂载导出

在此示例中,showmount -e 显示可以从 foobar NFS 服务器挂载的导出文件系统:

% 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)open in new window 会截获请求并尝试解析主机名 foobar。如果成功,automountd(8)open in new window 会自动挂载源导出。

要在引导时启用 autofs(5)open in new window,请将以下行添加到 /etc/rc.conf

autofs_enable="YES"

autofs(5)open in new window 可以通过运行来启动:

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

autofs(5)open in new window 映射格式与其他操作系统相同。来自其他来源的有关此格式的信息可能很有用,例如 Mac OS X 文档open in new window

有关详细信息,请参阅 automount(8)open in new windowautomountd(8)open in new window autounmountd(8)open in new windowauto_master(5)open in new window 手册页。