32.3. 网络文件系统(NFS)

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

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

  • 将在每个客户端上重复的数据保存在一个位置,并由网络上的客户端访问。

  • 多个客户端可能都需要访问目录 /usr/ports/distfiles。共享该目录允许快速访问源文件,而无需将它们下载到每个客户端。

  • 在大型网络上,配置存储所有用户主目录的中央 NFS 服务器通常更方便。用户可以登录到网络上任何位置的客户端,并可以访问其主目录。

  • NFS 导出的管理得到简化。例如,只有一个文件系统必须设置安全或备份策略。

  • 可移动媒体存储设备可由网络上的其他计算机使用。这减少了整个网络中的设备数量,并提供一个集中的位置来管理其安全性。从集中安装设备在多台计算机上安装软件通常更方便。

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

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

守护进程

说明

nfsd

NFS 守护程序,用于处理来自 NFS 客户端的请求。

mountd

NFS 挂载守护程序,它执行从 nfsd 收到的请求。

rpcbind

此守护程序允许 NFS 客户端发现 NFS 服务器正在使用的端口。

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

32.3.1. 配置服务器

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

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

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

/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=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) 以了解对 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) 获取所有可用选项的说明。

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)

32.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 release 中 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 导出。

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

在此示例中,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) 会截获请求并尝试解析主机名 foobar。如果成功,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 文档

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