网络文件系统 (NFS) 可能是使用 RPC 最突出的网络服务。 它允许您以与访问本地文件完全相同的方式访问远程主机上的文件。 客户端的内核支持和用户空间守护进程以及服务器端的 NFS 服务器使这成为可能。 这种文件访问对于客户端是完全透明的,并且可以在各种服务器和主机架构上工作。
NFS 提供了许多有用的功能
所有用户访问的数据可以保存在中央主机上,客户端在启动时挂载该目录。 例如,您可以将所有用户帐户保存在一台主机上,并让网络上的所有主机挂载/home来自该主机。 如果 NFS 与 NIS 一起安装,用户可以登录到任何系统,仍然可以处理一组文件。
占用大量磁盘空间的数据可以保存在一台主机上。 例如,与 LaTeX 和 METAFONT 相关的所有文件和程序都可以保存在一个地方并进行维护。
管理数据可以保存在一台主机上。 无需使用 rcp 在 20 台不同的机器上安装相同的愚蠢文件。
在客户端和服务器上设置基本 NFS 操作并不难;本章将告诉您如何操作。
Linux NFS 主要是 Rick Sladkey 的工作成果,他编写了 NFS 内核代码和 NFS 服务器的很大一部分。[1] 后者源自 Mark Shand 最初编写的 unfsd 用户空间 NFS 服务器,以及 Donald Becker 编写的 hnfs Harris NFS 服务器。
让我们看看 NFS 是如何工作的。 首先,客户端尝试像挂载物理设备一样,将来自远程主机的目录挂载到本地目录上。 但是,用于指定远程目录的语法有所不同。 例如,要挂载/home从主机 vlager 到/users在 vale 上,管理员在 vale 上发出以下命令:[2]
# mount -t nfs vlager:/home /users |
mount 将尝试通过 RPC 连接到 vlager 上的 rpc.mountd 挂载守护进程。 服务器将检查是否允许 vale 挂载相关目录,如果允许,则返回一个文件句柄。 此文件句柄将用于对/users.
当有人通过 NFS 访问文件时,内核会对服务器机器上的 rpc.nfsd(NFS 守护进程)发出 RPC 调用。 此调用采用文件句柄、要访问的文件的名称以及用户的用户 ID 和组 ID 作为参数。 这些用于确定对指定文件的访问权限。 为了防止未经授权的用户读取或修改文件,用户 ID 和组 ID 在两台主机上必须相同。
在大多数 Unix 实现中,客户端和服务器的 NFS 功能都实现为内核级别的守护进程,这些守护进程在系统启动时从用户空间启动。 这些是服务器主机上的 NFS 守护进程 (rpc.nfsd ) 和客户端主机上的 块 I/O 守护进程 (biod )。 为了提高吞吐量,biod 使用预读和后写执行异步 I/O; 此外,通常同时运行多个 rpc.nfsd 守护进程。
Linux 的当前 NFS 实现与经典的 NFS 略有不同,因为服务器代码完全在用户空间中运行,因此同时运行多个副本更加复杂。 当前的 rpc.nfsd 实现提供了一项实验性功能,允许对多个服务器提供有限的支持。 Olaf Kirch 开发了 2.2 版本 Linux 内核中基于内核的 NFS 服务器支持。 它的性能明显优于现有的用户空间实现。 我们将在本章后面介绍它。
[1] | 可以通过 jrs@world.std.com 联系到 Rick。 |
[2] | 实际上,您可以省略–t nfs参数,因为 mount 从冒号中看到这指定了一个 NFS 卷。 |