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 的主机:
/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
允许远程系统的 root
以 root
身份在导出的文件系统上写数据。如果没有指定 -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) 工具是多个组件的通用名称,每当访问远程和本地文件系统中的文件或目录时,这些组件一起允许自动挂载远程和本地文件系统。它由内核组件 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) 手册页。