【ganesha】share reservation原理

share reservation原理

背景

在 NFS v4 协议中,每个 OPEN 操作除了指定读写权限外,还可以指定 share reservation(共享保留),告诉服务器:这个客户端打算 如何访问文件(读/写/读写);以及它 希望其他客户端是否被允许访问。这样做的目的是:避免多个客户端同时操作同一文件时出现 冲突(conflict);提供一种类似 Windows 文件共享模式(share modes) 的机制。

Share Reservation 的两个维度

1. Access(访问模式)

  • READ → 需要读权限
  • WRITE → 需要写权限
  • BOTH → 需要读写权限

2. Deny(拒绝模式)

  • DENY_NONE → 不拒绝别人访问(最宽松)
  • DENY_READ → 拒绝别人读
  • DENY_WRITE → 拒绝别人写
  • DENY_BOTH → 拒绝别人读写(最严格)

所以,当客户端 OPEN 文件时,会带上 (access, deny) 组合,这就是 share reservation。

 

举个例子

  • 客户端 A 执行 OPEN(file, access=WRITE, deny=WRITE) → A 想写文件,并且不允许其他客户端也写。
  • 客户端 B 再执行 OPEN(file, access=WRITE, deny=NONE) → 冲突!因为 A 已经拒绝别人写。
  • 客户端 C 执行 OPEN(file, access=READ, deny=NONE) → 允许,因为 A 只拒绝别人写,但没拒绝读。

 

普通 DENY_WRITE (advisory)
──────────────────────────
客户端A:  OPEN file, deny=WRITE
↓
Ganesha: 记录 share reservation
↓
客户端B:  通过 NFS 再次 OPEN file (写方式)
   └──> Ganesha 拒绝 (返回错误)
↓
客户端B: 直接通过底层FS (POSIX/CephFS) OPEN file (写方式)
   └──> 成功 (因为底层FS不感知NFS share deny)


强制 DENY_WRITE_MAND (mandatory)
───────────────────────────────
客户端A:  OPEN file, deny=WRITE_MAND
↓
Ganesha: 记录强制 share reservation
↓
客户端B: 通过 NFS 再次 OPEN file (写方式)
   └──> Ganesha 拒绝 (返回错误)
↓
客户端B: 直接通过底层FS (POSIX/CephFS) OPEN file (写方式)
   └──> 失败 (因为FS/协议层也强制阻止写入)

 

posted @ 2025-08-17 22:04  苏格拉底的落泪  阅读(13)  评论(0)    收藏  举报