RFC 7530 - Network File System (NFS) Version 4 Protocol¶
第一部分:介绍¶
NFSv4 的特性:
- 安全,包括 Kerberos 等。
NULL
和COMPOUND
过程,后者能够将多个逻辑文件系统操作打包到一个 RPC 调用中,比如LOOKUP
、OPEN
和READ
。需要注意:COMPOUND
不提供原子性。- 文件和目录名使用 UTF-8 编码。
- filehandle 的类型在 persistent 之外添加了 volatile,提供的文件可能在声明周期内失效。
- ACL 作为 recommended 的文件属性。
- 新增
OPEN
和CLOSE
操作。 - 支持字节范围的文件锁,且不再需要 RPC 调用。基于租借的锁机制,客户端需要定期续约,否则状态会被释放。
- 客户端缓存:
- 文件属性和目录信息定时向服务器查询。
- 文件数据在打开时向服务器确认有效性。
- 文件 open 时,服务器可以向客户端提供 read/write delegation,提供期间保证没有其他客户端执行相关操作。这样客户端就可以在本地执行 read/write 操作,不需要与服务器即时交互。服务器可以回收 delegation。
第四部分:Filehandles¶
File handle 包含服务端区分单一文件的信息,对客户端不透明(逐字节比较)。服务器尽力维持一一映射。相同的 filehandle 必定指向相同文件,注意不同的 filehandle 可能指向同一个文件。
NFS 操作基于 filehandle。在 NFSv4 以前,通过 MOUNT
协议获取第一个 filehandle,该协议在安全和防火墙方面存在问题。NFSv4 中弃用了该方式,定义了两个特殊的 filehandle 作为 NFS 客户端的起点:
- Root filehandle:
PUTROOTFH
使服务器将当前 filehandle 设置为服务端文件树的根。
- Public filehandle:
- 没有限制绑定到的文件,由管理员确定。
PUTPUBFH
使用 public filehandle。
File handle 的类型由 fh_expire_type
文件属性表示:
- Persistent:即使服务器重启仍然指向对应的文件系统对象。
- 对象可能消失,返回
NFS4ERR_STALE
。
- 对象可能消失,返回
- Volatile
- 如果服务端能确定文件对象消失,返回
NFS4ERR_STALE
。 - 其他情况:
NFS4ERR_FHEXPIRED
。 - 对于这种类型的 filehandle,客户端需要处理过期后恢复。客户端可以存储路径等通向文件系统对象的信息,以从根重新获取 filehandle。如果文件对象消失,则客户端无法恢复。
- 如果服务端能确定文件对象消失,返回
第五部分:属性¶
属性可以通过 GETATTR
和 SETATTR
操作获取和设置。
与 NFSv4 之前的版本不同,NFSv4 客户端可以查询服务器支持哪些属性,并构造相应的查询。属性被分为三种:REQUIRED
、RECOMMENDED
和 named。前两者使用向量中的位表示,而 named 属性需要通过下面的方法查询:
+----------+-----------+---------------------------------+
| LOOKUP | "foo" | ; look up file |
| GETATTR | attrbits | |
| OPENATTR | | ; access foo's named attributes |
| LOOKUP | "x11icon" | ; look up specific attribute |
| READ | 0,4096 | ; read stream of bytes |
+----------+-----------+---------------------------------+
一般来说,named 属性是应用所考虑的,NFS Client 不需要考虑。使用 named 属性较为复杂,见 RFC 原文。
下面列出了按属性相同的范围分组的属性:
-
The per-server attribute is:
-
The per-file system attributes are:
supported_attrs, fh_expire_type, link_support, symlink_support, unique_handles, aclsupport, cansettime, case_insensitive, case_preserving, chown_restricted, files_avail, files_free, files_total, fs_locations, homogeneous, maxfilesize, maxname, maxread, maxwrite, no_trunc, space_avail, space_free, space_total, and time_delta
-
The per-file system object attributes are:
NFSv4 具体文件属性的说明见 RFC 原文。
值得注意的是,RECOMMENDED
属性 owner
和 owner_group
是字符串,而不是数字。这是为了避免在不同系统上的 UID 和 GID 不一致的问题。在协议中传递时,必须转换为 identifier@dns_domain
的形式。当然,转换会有不少问题和考虑,RFC 中有详细说明。
第六部分:ACL¶
Todo
第七、八部分:单、多 NFS 服务器命名空间¶
Todo
第九部分:文件锁与共享预约¶
Todo
第十部分:客户端缓存¶
Todo