30.3.网络文件系统(NFS)

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

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

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

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

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

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

在客户端上运行 nfsiod(8) 可以提高性能,但不是必需的。

30.3.1. 配置服务器

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

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

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

  1. /cdrom -ro alpha bravo charlie

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

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

  1. /usr/home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4

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

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

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

  1. # Invalid when /usr is one file system
  2. /usr/src client
  3. /usr/ports client

这种情况的正确格式是使用一个条目:

  1. /usr/src /usr/ports client

以下是有效导出列表的示例,其中 /usr/export 是本地文件系统:

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

要在引导时启用 NFS 服务器所需的进程,请将以下选项添加到 /etc/rc.conf

  1. rpcbind_enable="YES"
  2. nfs_server_enable="YES"
  3. mountd_enable="YES"

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

  1. # service nfsd start

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

  1. # service mountd reload

30.3.2. 配置客户端

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

  1. nfs_client_enable="YES"

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

  1. # service nfsclient start

现在客户端拥有挂载远程文件系统所需的一切。在这些示例中,服务器的名称为 server,客户端的名称为 client。要将 server 上的 /home 目录挂载到 client/mnt 挂载点:

  1. # mount server:/home /mnt

现在,/home 中的文件和目录将在 client 的 **/mnt** 目录中可用。

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

  1. server:/home /mnt nfs rw 0 0

请参考 fstab(5) 获取所有可用选项的描述。

30.3.3. 锁定

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

  1. rpc_lockd_enable="YES"
  2. rpc_statd_enable="YES"

然后启动应用程序:

  1. # service lockd start
  2. # service statd start

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

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

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

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

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

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

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

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

示例 2.使用 autofs(5) 挂载导出

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

  1. % showmount -e foobar
  2. Exports list on foobar:
  3. /usr 10.10.10.0
  4. /a 10.10.10.0
  5. % cd /net/foobar/usr

showmount 的输出显示 /usr 是一个出口。当改变目录到 /host/foobar/usr 时,automountd(8) 会截获请求并尝试解析主机名 foobar。如果成功,automountd(8) 会自动挂载源导出。

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

  1. autofs_enable="YES"

autofs(5) 可以通过运行来启动:

  1. # service automount start
  2. # service automountd start
  3. # service autounmountd start

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

有关详细信息,请参阅 automount(8)automountd(8) autounmountd(8)auto_master(5) 手册页。