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** 导出到三个名为 *alpha*\ 、\ *bravo* 和 *charlie* 的主机: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session /cdrom -ro alpha bravo charlie ``-ro`` 参数使文件系统为只读,防止客户端对导出的文件系统进行任何更改。此示例假定主机名位于 DNS 或 **/etc/hosts** 中。如果网络没有 DNS 服务器,请参考 `hosts(5) `__\ 。 下一个示例按 IP 地址将 **/home** 导出到三个客户端。这对于没有 DNS 或 **/etc/hosts** 条目的网络非常有用。\ ``-alldirs`` 标志允许子目录成为挂载点。换句话说,它不会自动挂载子目录,但会允许客户端按需挂载所需的目录。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session /usr/home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4 下面这个例子导出 **/a**\ ,这样来自不同领域的两个客户可以访问该文件系统。\ ``-maproot=roo`` 允许远程系统的 ``root`` 以 ``root`` 身份在导出的文件系统上写数据。如果没有指定 ``-maproot=root``\ ,客户端的 ``root`` 用户将被映射到服务器的 ``nobody`` 账户上,并将受到为 ``nobody`` 定义的访问限制。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session /a -maproot=root host.example.com box.example.org 每个文件系统一次只能指定一个客户机。例如,如果 **/usr** 是单个文件系统,则这些条目无效,因为这两个条目指定相同的主机: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # Invalid when /usr is one file system /usr/src client /usr/ports client 这种情况的正确格式是使用一个条目: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session /usr/src /usr/ports client 以下是有效导出列表的示例,其中 **/usr** 和 **/export** 是本地文件系统: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # 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**\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session rpcbind_enable="YES" nfs_server_enable="YES" mountd_enable="YES" 现在可以通过运行以下命令启动服务器: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service nfsd start 每当 NFS 服务器启动时,mountd 也会自动启动。但是,mountd 仅在启动时读取 **/etc/export**\ 。要使后续的 **/etc/export** 编辑立即生效,请强制重载以重新读取它: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service mountd reload 请参考 `nfsv4(4) `__ 以了解对 NFS 第 4 版配置的说明。 32.3.2. 配置客户端 ------------------ 要启用 NFS 客户端,请在每个客户端的 **/etc/rc.conf** 中设置此选项: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session nfs_client_enable="YES" 然后,在每个 NFS 客户端上运行以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service nfsclient start 现在客户端拥有挂载远程文件系统所需的一切。在这些示例中,服务器的名称为 ``server``\ ,客户端的名称为 ``client``\ 。要将 ``server`` 上的 **/home** 目录挂载到 ``client`` 的挂载点 **/mnt** : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # mount server:/home /mnt 现在,\ **/home** 中的文件和目录将在 ``client`` 的 \**/mnt*\* 目录中可用。 要在每次客户端引导时挂载远程文件系统,请将其添加到 **/etc/fstab**\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session server:/home /mnt nfs rw 0 0 请参考 `fstab(5) `__ 获取所有可用选项的说明。 32.3.3. 锁定 ------------ 某些应用程序需要文件锁定才能正常运行。要启用锁定,请将以下行添加到客户端和服务器上的 **/etc/rc.conf** 中: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session rpc_lockd_enable="YES" rpc_statd_enable="YES" 然后启动应用程序: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # 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 服务器挂载的导出文件系统: .. code:: shell-session % 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**\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session autofs_enable="YES" `autofs(5) `__ 可以通过运行来启动: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service automount start # service automountd start # service autounmountd start `autofs(5) `__ 映射格式与其他操作系统相同。来自其他来源的有关此格式的信息可能很有用,例如 `Mac OS X 文档 `__\ 。 有关详细信息,请参阅 `automount(8) `__ 、 `automountd(8) `__\ 、\ `autounmountd(8) `__ 和 `auto_master(5) `__ 手册页。