14.2. 挂载 NFS 卷

挂载 NFS 卷与挂载常规文件系统非常相似。使用以下语法调用 mount 命令:[1]
# mount -t nfs nfs_volume local_dir options 

nfs_volume指定为remote_host:remote_dir。由于此表示法是 NFS 文件系统特有的,因此您可以省略–t nfs选项。

在挂载 NFS 卷时,您可以为 mount 命令指定许多其他选项。这些选项可以跟在–o开关之后,在命令行上,或者在/etc/fstab文件中该卷的条目的选项字段中给出。在这两种情况下,多个选项都用逗号分隔,并且不得包含任何空格字符。在命令行上指定的选项始终覆盖在fstab文件中给出的选项。

这是一个来自/etc/fstab
# volume              mount point       type  options
news:/var/spool/news  /var/spool/news   nfs   timeo=14,intr

然后可以使用此命令挂载此卷
# mount news:/var/spool/news

在没有fstab条目的情况下,NFS mount 调用看起来会非常难看。例如,假设您从名为 moonshot 的机器挂载用户的主目录,该机器使用 4 K 的默认块大小进行读/写操作。您可以通过发出以下命令将块大小增加到 8 K 以获得更好的性能
# mount moonshot:/home /home -o rsize=8192,wsize=8192

所有有效选项的完整列表在nfs(5)手册页中进行了描述。以下是您可能想要使用的一部分选项列表

rsize=nwsize=n

这些分别指定 NFS 客户端在读取和写入请求时使用的数据报大小。默认值取决于内核版本,但通常为 1,024 字节。

timeo=n

这设置了 NFS 客户端等待请求完成的时间(以十分之一秒为单位)。默认值为 7(0.7 秒)。超时后会发生什么取决于您是否使用 hardsoft 选项。

hard

显式地将此卷标记为硬挂载。默认情况下启用此选项。当发生严重超时时,此选项使服务器向控制台报告消息并无限期地继续尝试。

soft

软挂载(相对于硬挂载)驱动程序。当发生严重超时时,此选项会导致向尝试文件操作的进程报告 I/O 错误。

intr

允许信号中断 NFS 调用。当服务器没有响应时,可用于中止操作。

除了 rsizewsize 之外,所有这些选项都适用于服务器暂时不可访问时客户端的行为。它们以以下方式协同工作:每当客户端向 NFS 服务器发送请求时,它都希望操作在给定的时间间隔(在 timeout 选项中指定)后完成。如果在此时间内未收到确认,则会发生所谓的次要超时,并且会重试该操作,超时时间间隔加倍。在达到 60 秒的最大超时时间后,会发生主要超时

默认情况下,主要超时会导致客户端在控制台上打印一条消息,然后重新开始,这次的初始超时时间间隔是前一次级联的两倍。这种情况可能会永远持续下去。顽固地重试操作直到服务器再次可用的卷称为硬挂载。相反的类型,称为软挂载,每当发生主要超时时,都会为调用进程生成 I/O 错误。由于缓冲区缓存引入的后写,此错误条件不会在进程下次调用write函数时才传播到进程本身,因此程序永远不能确定对软挂载卷的写入操作是否完全成功。

您是硬挂载还是软挂载卷部分取决于个人喜好,但也取决于您要从卷访问的信息类型。例如,如果您通过 NFS 挂载 X 程序,您肯定不希望您的 X 会话崩溃,仅仅因为有人同时启动了七个 Doom 副本或暂时拔掉了以太网插头而导致网络瘫痪。通过硬挂载包含这些程序的目录,您可以确保您的计算机等待直到能够重新建立与 NFS 服务器的联系。另一方面,非关键数据(例如 NFS 挂载的新闻分区或 FTP 存档)也可以软挂载,因此如果远程计算机暂时无法访问或关闭,则不会挂起您的会话。如果您的网络连接到服务器不稳定或通过负载过高的路由器,您可以增加使用 timeo 选项的初始超时时间或硬挂载卷。默认情况下,NFS 卷是硬挂载的。

硬挂载存在一个问题,因为默认情况下,文件操作是不可中断的。因此,例如,如果进程尝试写入远程服务器,而该服务器无法访问,则用户的应用程序会挂起,并且用户无法执行任何操作来中止该操作。如果在硬挂载的同时使用 intr 选项,则进程接收到的任何信号都会中断 NFS 调用,以便用户仍然可以中止挂起的文件访问并恢复工作(尽管无法保存文件)。

通常,rpc.mountd 守护程序以某种方式跟踪哪些目录已由哪些主机挂载。可以使用 showmount 程序显示此信息,该程序也包含在 NFS 服务器软件包中
# showmount -e moonshot
Export list for localhost:
/home <anon clnt>

# showmount -d moonshot
Directories on localhost:
/home

# showmount -a moonshot
All mount points on localhost:
localhost:/home

注释

[1]

不说文件系统,因为这些不是真正的文件系统。