NFSv4.1 服务器实现

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

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

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

nfsd 中的 NFSv4 次版本 1 (NFSv4.1) 实现基于 RFC 5661。

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

下表摘自 NFSv4.1 文档,列出了在次版本 1 中必须实现 (REQ) 的操作、可选 (OPT) 的操作以及需要不实现 (MNI) 的 NFSv4.0 操作。第一列指示 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 节,

布局 (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,这应该是面向未来的。

反向通道上的 GSS

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

DELEGPURGE

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

EXCHANGE_ID

实现 ID 被忽略

CREATE_SESSION

反向通道属性被忽略

SEQUENCE

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

非标准复合限制

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

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