contents
下一节: 准备 NFS 上一节: 网络管理员指南 前一节: 使用传统的 NIS

网络文件系统

NFS,即网络文件系统,可能是使用 RPC 最突出的网络服务。它允许以与用户访问任何本地文件完全相同的方式访问远程主机上的文件。这通过客户端(使用远程文件系统)的内核功能和服务器端(提供文件数据)的 NFS 服务器的结合来实现。这种文件访问对于客户端来说是完全透明的,并且可以跨各种服务器和主机架构工作。

NFS 提供了许多优点

NFS 在很大程度上是 Rick Sladkey 的工作成果,gif 他编写了 NFS 内核代码和 NFS 服务器的大部分代码。后者源自 Mark Shand 最初编写的 unfsd 用户空间 NFS 服务器,以及 Donald Becker 编写的 hnfs Harris NFS 服务器。

现在让我们看看 NFS 是如何工作的:客户端可以请求从远程主机挂载目录到本地目录,就像它可以挂载物理设备一样。但是,用于指定远程目录的语法是不同的。例如,要将主机 vlager 上的 /home 挂载到 vale 上的 /users,管理员将在 vale 上发出以下命令:gif

然后 mount 将尝试通过 RPC 连接到 vlager 上的 mountd 挂载守护进程。服务器将检查是否允许 vale 挂载所讨论的目录,如果允许,则返回一个文件句柄。此文件句柄将用于所有后续对 /users 下文件的请求。

当有人通过 NFS 访问文件时,内核会向服务器机器上的 nfsd(NFS 守护进程)发出 RPC 调用。此调用将文件句柄、要访问的文件的名称以及用户的用户 ID 和组 ID 作为参数。这些参数用于确定对指定文件的访问权限。为了防止未经授权的用户读取或修改文件,用户 ID 和组 ID 在两台主机上必须相同。

在大多数实现中,客户端和服务器的 NFS 功能都作为内核级守护进程实现,这些守护进程在系统启动时从用户空间启动。这些是服务器主机上的 NFS 守护进程 (nfsd) 和客户端主机上运行的块 I/O 守护进程 (biod)。为了提高吞吐量,biod 使用预读和写后执行异步 I/O;此外,通常同时运行多个 nfsd 守护进程。

的 NFS 实现略有不同,因为客户端代码紧密集成在内核的虚拟文件系统 (VFS) 层中,不需要通过 biod 进行额外的控制。另一方面,服务器代码完全在用户空间中运行,因此由于这会涉及同步问题,几乎不可能同时运行多个服务器副本。NFS 目前也缺乏预读和写后,但 Rick Sladkey 计划在将来添加此功能。gif

NFS 代码的最大问题是,版本 1.0 的内核无法分配大于 4K 的内存块;因此,网络代码无法处理大于大约 3500 字节的数据报,这在减去标头大小等之后。这意味着与默认使用大型 UDP 数据报的系统(例如 SunOS 上的 8K)上运行的 NFS 守护进程的传输需要人为地缩小尺寸。这在某些情况下会严重损害性能。gif 此限制在后期的 -1.1 内核中已消失,并且客户端代码已修改为利用这一点。




contents
下一节: 准备 NFS 上一节: 网络管理员指南 前一节: 使用传统的 NIS

Andrew Anderson
1996 年 3 月 7 日星期四 23:22:06 EST