5. 附录 I: Mount 协议
5.0 附录 I: Mount 协议
从 NFS version 2 协议到 NFS version 3 协议的变化, 要求 MOUNT 协议也作出一些修改. 为满足 NFS version 3 协议的需求, 已定义一个新的 MOUNT 协议版本. 这个新协议满足 NFS version 3 协议的要求, 并处理若干其他当前市场需求.
5.1 RPC 信息
5.1.1 认证
MOUNT 服务在 NULL 过程里使用 AUTH_NONE. 所有其他过程使用 AUTH_UNIX、AUTH_SHORT、AUTH_DES 或 AUTH_KERB. 将来可能支持其他认证类型.
5.1.2 常量
这些是调用 MOUNT 服务所需的 RPC 常量, 以十进制给出.
PROGRAM 100005
VERSION 3
5.1.3 传输地址
MOUNT 服务通常支持 TCP 和 UDP 协议. 应查询 rpcbind 守护进程以获得正确的传输地址.
5.1.4 大小
const MNTPATHLEN = 1024; /* Maximum bytes in a path name */
const MNTNAMLEN = 255; /* Maximum bytes in a name */
const FHSIZE3 = 64; /* Maximum bytes in a V3 file handle */
5.1.5 基本数据类型
typedef opaque fhandle3<FHSIZE3>;
typedef string dirpath<MNTPATHLEN>;
typedef string name<MNTNAMLEN>;
enum mountstat3 {
MNT3_OK = 0, /* no error */
MNT3ERR_PERM = 1, /* Not owner */
MNT3ERR_NOENT = 2, /* No such file or directory */
MNT3ERR_IO = 5, /* I/O error */
MNT3ERR_ACCES = 13, /* Permission denied */
MNT3ERR_NOTDIR = 20, /* Not a directory */
MNT3ERR_INVAL = 22, /* Invalid argument */
MNT3ERR_NAMETOOLONG = 63, /* Filename too long */
MNT3ERR_NOTSUPP = 10004, /* Operation not supported */
MNT3ERR_SERVERFAULT = 10006 /* A failure on the server */
};
5.2 服务器过程
以下各节定义 MOUNT version 3 协议服务器提供的 RPC 过程. RPC 过程号与名称和版本一起列在页面顶部. SYNOPSIS 给出过程名称、参数名称列表、结果名称列表, 随后是 XDR 参数声明和结果声明. SYNOPSIS 中的信息使用 [RFC1014] 定义的 RPC Data Description Language 指定. DESCRIPTION 节说明该过程预期执行的操作, 以及如何使用其参数和结果. ERRORS 节列出特定失败类型返回的错误. IMPLEMENTATION 字段描述该过程预期如何工作以及客户端应如何使用它.
program MOUNT_PROGRAM {
version MOUNT_V3 {
void MOUNTPROC3_NULL(void) = 0;
mountres3 MOUNTPROC3_MNT(dirpath) = 1;
mountlist MOUNTPROC3_DUMP(void) = 2;
void MOUNTPROC3_UMNT(dirpath) = 3;
void MOUNTPROC3_UMNTALL(void) = 4;
exports MOUNTPROC3_EXPORT(void) = 5;
} = 3;
} = 100005;
5.2.0 过程 0: Null - 不执行任何操作
SYNOPSIS
void MOUNTPROC3_NULL(void) = 0;
DESCRIPTION
NULL 过程不执行任何工作. 它用于允许测试和计时服务器响应.
IMPLEMENTATION
该过程必须完全不做任何工作, 这样才能用于测量处理服务请求的开销. 按照惯例, NULL 过程不应要求任何认证. 在更安全的实现中, 如果响应 NULL 过程调用会向未认证客户端确认某个资源存在, 服务器也可以选择忽略这一惯例.
ERRORS
由于 NULL 过程不接受 MOUNT 协议参数, 也不返回 MOUNT 协议响应, 因此它不能返回 MOUNT 协议错误. 但是, 某些服务器实现可能基于安全和认证要求返回 RPC 错误.
5.2.1 过程 1: MNT - 添加挂载条目
SYNOPSIS
mountres3 MOUNTPROC3_MNT(dirpath) = 1;
struct mountres3_ok {
fhandle3 fhandle;
int auth_flavors<>;
};
union mountres3 switch (mountstat3 fhs_status) {
case MNT_OK:
mountres3_ok mountinfo;
default:
void;
};
DESCRIPTION
MNT 过程将服务器上的路径名映射为文件句柄. 路径名是一个 ASCII 字符串, 描述服务器上的目录. 如果调用成功 (MNT3_OK), 服务器返回一个 NFS version 3 协议文件句柄, 以及一个 RPC 认证风味向量, 这些认证风味支持客户端使用该文件句柄 (或由它派生出的任何文件句柄). 认证风味定义在 [RFC1057] 第 7.2 节和第 9 节.
IMPLEMENTATION
如果 mountres3.fhs_status 为 MNT3_OK, 则 mountres3.mountinfo 包含目录的文件句柄和可接受认证风味列表. 此文件句柄只能用于 NFS version 3 协议. 此过程还会使服务器在其挂载列表中添加一个新条目, 记录该客户端已挂载该目录. 要求使用 AUTH_UNIX 或更强认证.
ERRORS
MNT3ERR_NOENT
MNT3ERR_IO
MNT3ERR_ACCES
MNT3ERR_NOTDIR
MNT3ERR_NAMETOOLONG
5.2.2 过程 2: DUMP - 返回挂载条目
SYNOPSIS
mountlist MOUNTPROC3_DUMP(void) = 2;
typedef struct mountbody *mountlist;
struct mountbody {
name ml_hostname;
dirpath ml_directory;
mountlist ml_next;
};
DESCRIPTION
DUMP 过程返回远程挂载文件系统列表. mountlist 为每个客户端主机名和目录对包含一个条目.
IMPLEMENTATION
此列表源自服务器维护的客户端列表, 这些客户端曾用 MNT 过程请求文件句柄. 只有当客户端调用 UMNT 或 UMNTALL 过程时, 条目才会从列表中移除. 如果客户端崩溃, 且未对所有先前挂载的文件系统发出 UMNT 调用, 或未发出 UMNTALL 来移除服务器上与它相关的所有条目, 条目可能会变得陈旧.
ERRORS
此过程不会返回 MOUNT 协议错误. 但是, 认证或其他 RPC 失败可能导致返回 RPC 错误.
5.2.3 过程 3: UMNT - 移除挂载条目
SYNOPSIS
void MOUNTPROC3_UMNT(dirpath) = 3;
DESCRIPTION
UMNT 过程移除该客户端先前通过 MNT 调用所涉及目录的挂载列表条目. 要求使用 AUTH_UNIX 或更强认证.
IMPLEMENTATION
通常, 服务器实现会维护一个已挂载文件系统的客户端列表. 过去, 该列表用于通知客户端服务器即将关闭.
ERRORS
此过程不会返回 MOUNT 协议错误. 但是, 认证或其他 RPC 失败可能导致返回 RPC 错误.
5.2.4 过程 4: UMNTALL - 移除所有挂载条目
SYNOPSIS
void MOUNTPROC3_UMNTALL(void) = 4;
DESCRIPTION
UMNTALL 过程移除此客户端先前由 MNT 调用记录的所有挂载条目. 要求使用 AUTH_UNIX 或更强认证.
IMPLEMENTATION
客户端在系统关闭后恢复时应使用此过程. 如果客户端在关闭前未能成功卸载其所有文件系统, 或者客户端因软件或硬件问题崩溃, 可能仍有服务器保留该客户端的挂载条目. 这是一种让客户端一次性通知所有服务器自己没有任何已挂载文件系统的简单方法. 但是, 由于此过程通常使用广播 RPC 实现, 因此用途有限.
ERRORS
此过程不会返回 MOUNT 协议错误. 但是, 认证或其他 RPC 失败可能导致返回 RPC 错误.
5.2.5 过程 5: EXPORT - 返回导出列表
SYNOPSIS
exports MOUNTPROC3_EXPORT(void) = 5;
typedef struct groupnode *groups;
struct groupnode {
name gr_name;
groups gr_next;
};
typedef struct exportnode *exports;
struct exportnode {
dirpath ex_dir;
groups ex_groups;
exports ex_next;
};
DESCRIPTION
EXPORT 过程返回所有已导出文件系统的列表, 以及允许挂载每个文件系统的客户端. 组列表中的名称是实现特定的, 客户端不能直接解释. 这些名称可以表示主机或主机组.
IMPLEMENTATION
此过程通常返回共享或导出文件系统列表的内容. 这些文件系统可供 NFS version 3 协议客户端使用.
ERRORS
此过程不会返回 MOUNT 协议错误. 但是, 认证或其他 RPC 失败可能导致返回 RPC 错误.