第 14 章. 网络文件系统

目录
14.1. 准备 NFS
14.2. 挂载 NFS 卷
14.3. NFS 守护进程
14.4. exports 文件
14.5. 基于内核的 NFSv2 服务器支持
14.6. 基于内核的 NFSv3 服务器支持

网络文件系统 (NFS) 可能是使用 RPC 最突出的网络服务。 它允许您以与访问本地文件完全相同的方式访问远程主机上的文件。 客户端的内核支持和用户空间守护进程以及服务器端的 NFS 服务器使这成为可能。 这种文件访问对于客户端是完全透明的,并且可以在各种服务器和主机架构上工作。

NFS 提供了许多有用的功能

在客户端和服务器上设置基本 NFS 操作并不难;本章将告诉您如何操作。

Linux NFS 主要是 Rick Sladkey 的工作成果,他编写了 NFS 内核代码和 NFS 服务器的很大一部分。[1] 后者源自 Mark Shand 最初编写的 unfsd 用户空间 NFS 服务器,以及 Donald Becker 编写的 hnfs Harris NFS 服务器。

让我们看看 NFS 是如何工作的。 首先,客户端尝试像挂载物理设备一样,将来自远程主机的目录挂载到本地目录上。 但是,用于指定远程目录的语法有所不同。 例如,要挂载/home从主机 vlager/usersvale 上,管理员在 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 卷。