Skip to content

RFC 7530 - Network File System (NFS) Version 4 Protocol

第一部分:介绍

NFSv4 的特性:

  • 安全,包括 Kerberos 等。
  • NULLCOMPOUND 过程,后者能够将多个逻辑文件系统操作打包到一个 RPC 调用中,比如 LOOKUPOPENREAD。需要注意:COMPOUND 不提供原子性。
  • 文件和目录名使用 UTF-8 编码。
  • filehandle 的类型在 persistent 之外添加了 volatile,提供的文件可能在声明周期内失效。
  • ACL 作为 recommended 的文件属性。
  • 新增 OPENCLOSE 操作。
  • 支持字节范围的文件锁,且不再需要 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。如果文件对象消失,则客户端无法恢复。

第五部分:属性

属性可以通过 GETATTRSETATTR 操作获取和设置。

与 NFSv4 之前的版本不同,NFSv4 客户端可以查询服务器支持哪些属性,并构造相应的查询。属性被分为三种:REQUIREDRECOMMENDED 和 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:

    lease_time
    
  • 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:

    type, change, size, named_attr, fsid, rdattr_error, filehandle,
    acl, archive, fileid, hidden, maxlink, mimetype, mode,
    numlinks, owner, owner_group, rawdev, space_used, system,
    time_access, time_backup, time_create, time_metadata,
    time_modify, and mounted_on_fileid
    

NFSv4 具体文件属性的说明见 RFC 原文。

值得注意的是,RECOMMENDED 属性 ownerowner_group 是字符串,而不是数字。这是为了避免在不同系统上的 UID 和 GID 不一致的问题。在协议中传递时,必须转换为 identifier@dns_domain 的形式。当然,转换会有不少问题和考虑,RFC 中有详细说明。

第六部分:ACL

Todo

第七、八部分:单、多 NFS 服务器命名空间

Todo

第九部分:文件锁与共享预约

Todo

第十部分:客户端缓存

Todo

第十四到十八部分:NFSv4 请求、过程、操作及回调