NFSv4.1 服务器实现

可以使用 /proc/fs/nfsd/versions 控制文件来控制服务器对 minorversion 1 的支持。读取此文件返回的字符串输出将包含 “+4.1” 或 “-4.1” 相应的值。

当前,默认启用服务器对 minorversion 1 的支持。可以通过将字符串 “-4.1” 写入 /proc/fs/nfsd/versions 控制文件来在运行时禁用它。请注意,要写入此控制文件,必须关闭 nfsd 服务。你可以使用 rpc.nfsd 来完成此操作;请参阅 rpc.nfsd(8)。

(警告:较旧的服务器会将 “+4.1” 和 “-4.1” 分别解释为 “+4” 和 “-4”。因此,旨在在新旧内核上运行的代码必须打开或关闭 4.1 的支持,然后再打开或关闭版本 4 的支持;rpc.nfsd 可以正确地执行此操作。)

nfsd 中 NFSv4 minorversion 1 (NFSv4.1) 的实现基于 RFC 5661。

在 NFSv4.1 的许多新功能中,当前实现侧重于强制实现的 NFSv4.1 会话,提供“完全一次”语义,以及更好地控制和限制为每个客户端分配的资源。

下表取自 NFSv4.1 文档,列出了在 minor version 1 中强制实现 (REQ)、可选 (OPT) 和要求不实现的 NFSv4.0 操作 (MNI)。第一列指示 Linux 服务器实现尚不支持的操作。

已标识的可选功能及其缩写如下

  • pNFS 并行 NFS

  • FDELG 文件委托

  • DDELG 目录委托

以下缩写指示 Linux 服务器的实现状态。

  • I 已实现的 NFSv4.1 操作。

  • NS 不支持。

  • NS* 未实现的可选功能。

操作

实现状态

操作

REQ、REC、OPT 或 NMI

功能(REQ、REC 或 OPT)

定义

ACCESS

REQ

第 18.1 节

I

BACKCHANNEL_CTL

REQ

第 18.33 节

I

BIND_CONN_TO_SESSION

REQ

第 18.34 节

CLOSE

REQ

第 18.2 节

COMMIT

REQ

第 18.3 节

CREATE

REQ

第 18.4 节

I

CREATE_SESSION

REQ

第 18.36 节

NS*

DELEGPURGE

OPT

FDELG (REQ)

第 18.5 节

DELEGRETURN

OPT

FDELG,

第 18.6 节

DDELG, pNFS

(REQ)

I

DESTROY_CLIENTID

REQ

第 18.50 节

I

DESTROY_SESSION

REQ

第 18.37 节

I

EXCHANGE_ID

REQ

第 18.35 节

I

FREE_STATEID

REQ

第 18.38 节

GETATTR

REQ

第 18.7 节

I

GETDEVICEINFO

OPT

pNFS (REQ)

第 18.40 节

NS*

GETDEVICELIST

OPT

pNFS (OPT)

第 18.41 节

GETFH

REQ

第 18.8 节

NS*

GET_DIR_DELEGATION

OPT

DDELG (REQ)

第 18.39 节

I

LAYOUTCOMMIT

OPT

pNFS (REQ)

第 18.42 节

I

LAYOUTGET

OPT

pNFS (REQ)

第 18.43 节

I

LAYOUTRETURN

OPT

pNFS (REQ)

第 18.44 节

LINK

OPT

第 18.9 节

LOCK

REQ

第 18.10 节

LOCKT

REQ

第 18.11 节

LOCKU

REQ

第 18.12 节

LOOKUP

REQ

第 18.13 节

LOOKUPP

REQ

第 18.14 节

NVERIFY

REQ

第 18.15 节

OPEN

REQ

第 18.16 节

NS*

OPENATTR

OPT

第 18.17 节

OPEN_CONFIRM

MNI

不适用

OPEN_DOWNGRADE

REQ

第 18.18 节

PUTFH

REQ

第 18.19 节

PUTPUBFH

REQ

第 18.20 节

PUTROOTFH

REQ

第 18.21 节

READ

REQ

第 18.22 节

READDIR

REQ

第 18.23 节

READLINK

OPT

第 18.24 节

RECLAIM_COMPLETE

REQ

第 18.51 节

RELEASE_LOCKOWNER

MNI

不适用

REMOVE

REQ

第 18.25 节

RENAME

REQ

第 18.26 节

RENEW

MNI

不适用

RESTOREFH

REQ

第 18.27 节

SAVEFH

REQ

第 18.28 节

SECINFO

REQ

第 18.29 节

I

SECINFO_NO_NAME

REC

pNFS 文件

第 18.45 节,

layout (REQ)

第 13.12 节

I

SEQUENCE

REQ

第 18.46 节

SETATTR

REQ

第 18.30 节

SETCLIENTID

MNI

不适用

SETCLIENTID_CONFIRM

MNI

不适用

NS

SET_SSV

REQ

第 18.47 节

I

TEST_STATEID

REQ

第 18.48 节

VERIFY

REQ

第 18.31 节

NS*

WANT_DELEGATION

OPT

FDELG (OPT)

第 18.49 节

WRITE

REQ

第 18.32 节

回调操作

实现状态

操作

REQ、REC、OPT 或 NMI

功能(REQ、REC 或 OPT)

定义

CB_GETATTR

OPT

FDELG (REQ)

第 20.1 节

I

CB_LAYOUTRECALL

OPT

pNFS (REQ)

第 20.3 节

NS*

CB_NOTIFY

OPT

DDELG (REQ)

第 20.4 节

NS*

CB_NOTIFY_DEVICEID

OPT

pNFS (OPT)

第 20.12 节

NS*

CB_NOTIFY_LOCK

OPT

第 20.11 节

NS*

CB_PUSH_DELEG

OPT

FDELG (OPT)

第 20.5 节

CB_RECALL

OPT

FDELG,

第 20.2 节

DDELG, pNFS

(REQ)

NS*

CB_RECALL_ANY

OPT

FDELG,

第 20.6 节

DDELG, pNFS

(REQ)

NS

CB_RECALL_SLOT

REQ

第 20.8 节

NS*

CB_RECALLABLE_OBJ_AVAIL

OPT

DDELG, pNFS

第 20.7 节

(REQ)

I

CB_SEQUENCE

OPT

FDELG,

第 20.9 节

DDELG, pNFS

(REQ)

NS*

CB_WANTS_CANCELLED

OPT

FDELG,

第 20.10 节

DDELG, pNFS

(REQ)

实现说明:

SSV

规范声称这是强制性的,但实际上我们不知道任何实现,所以我们暂时忽略它。 服务器在 EXCHANGE_ID 上返回 NFS4ERR_ENCR_ALG_UNSUPP,这应该是面向未来的。

在 backchannel 上的 GSS

同样,理论上是必需的,但没有被广泛实现(特别是,当前的 Linux 客户端没有请求它)。我们在 CREATE_SESSION 上返回 NFS4ERR_ENCR_ALG_UNSUPP。

DELEGPURGE

仅对于支持 CLAIM_DELEGATE_PREV 和/或 CLAIM_DELEG_PREV_FH 的服务器是强制性的(这允许客户端保留在客户端重新启动后仍然存在的委托)。因此,我们现在不需要实现它。

EXCHANGE_ID

实现 id 被忽略

CREATE_SESSION

backchannel 属性被忽略

SEQUENCE

不支持动态槽表重新协商(可选)

非标准复合限制

不支持需要 ca_maxrequestsize 请求和 ca_maxresponsesize 回复的会话前向通道 RPC 复合,因此我们可能无法兑现在 CREATE_SESSION 前向通道协商中做出的承诺。

另请参阅 http://wiki.linux-nfs.org/wiki/index.php/Server_4.0_and_4.1_issues