高级特性 - 🔐 7.2 Reservation Acquire 命令 —— 中文深入解析 (第343页)
我们继续深入分析 NVMe Base Specification 2.0b 第7章的内容,这一节主要聚焦在 7.2 Reservation Acquire 命令。这个命令是 NVMe 中用于协调多主机访问某个命名空间的重要机制,广泛应用于共享存储、多主控制器环境(如 HA 方案、虚拟化、分布式存储)中。
🔐 7.2 Reservation Acquire 命令 —— 中文深入解析
📌 作用概览
Reservation Acquire(保留获取)命令 主要用于: 1. 获取(Acquire)命名空间的保留权(Reservation)。 2. 争抢(Preempt)当前的保留权(如主动踢掉别人)。 3. 中止(Abort)现有保留权。
这类机制有助于协调多主机共享存储资源时的互斥与优先级控制。
🧩 命令格式组成
✅ 数据缓冲区位置(Data Pointer)
字段:127:00 - Data Pointer (DPTR)
说明:数据缓冲区的位置,可由 PRP 或 SGL 指定。用于传输 Reservation Acquire Data Structure。
✅ Command Dword 10 结构(图 392)
| Bits | 字段 | 含义 |
|---|---|---|
| 31:16 | Reserved | 保留 |
| 15:08 | RTYPE (Reservation Type) | 要获取的保留类型,定义见图 394 |
| 07:04 | Reserved | 保留 |
| 03 | IEKEY (Ignore Existing Key) | 如果为 1,则应直接报错;设置为 0 时需校验当前密钥(CRKEY) |
| 02:00 | RACQA (Reservation Acquire Action) | 要执行的操作:获取、抢占或中止 |
RACQA 具体定义如下:
| 值 (RACQA) | 操作 | 说明 |
|---|---|---|
000b |
Acquire | 获取保留权 |
001b |
Preempt | 抢占并删除 PRKEY 对应的注册者 |
010b |
Preempt and Abort | 抢占并强制中止当前命令 |
011b-111b |
Reserved | 保留值,不能使用 |
📦 Reservation Acquire Data Structure(图 393)
| Byte范围 | 字段名称 | 含义 |
|---|---|---|
| 07:00 | CRKEY (Current Reservation Key) | 表示当前主机使用的 Reservation Key |
| 15:08 | PRKEY (Preempt Reservation Key) | 用于 Preempt 操作时指定目标 key |
🚨 注意: - 若是普通 Acquire 操作,只需设置 CRKEY - 若为 Preempt 或 Preempt and Abort,则需同时提供 PRKEY 以说明踢掉谁
🧠 使用流程示例详解
🎯 场景 1:主机尝试获取保留权
- 设置 RACQA = 000b (Acquire)
- 设置 RTYPE = 02h (Write Exclusive, 举例)
- 设置 CRKEY = 0xABCD1234
- IEKEY = 0(表示检查当前 Reservation Key)
控制器校验当前是否已有 reservation,如果没有或 key 匹配,则赋予保留权。
⚔️ 场景 2:主机尝试踢掉已有保留者(Preempt)
- 设置 RACQA = 001b (Preempt)
- 设置 PRKEY = 0x12345678(目标保留者 key)
- 设置 CRKEY = 0x87654321(自己要获取的 key)
控制器会删除 PRKEY 注册者的注册项,同时赋予当前主机保留权。
⛔ 场景 3:设置错误 IEKEY
如果主机将 IEKEY 设置为 1,则规范要求控制器必须直接返回 Invalid Field In Command 错误。这是为了避免误操作不检查保留密钥就篡改保留权。
🔐 Reservation 类型(图 394,后续定义)
在图 394 中将会列出 保留类型 Reservation Type (RTYPE),如: - Write Exclusive - Exclusive Access - Write Exclusive – Registrants Only - Exclusive Access – Registrants Only - Write Exclusive – All Registrants - Exclusive Access – All Registrants
不同类型的保留策略对读/写/注册者行为定义了清晰的互斥控制策略。我们稍后可继续深入学习这些类型含义。
✅ 小结:Reservation Acquire 总结回顾
| 要素 | 说明 |
|---|---|
| 🎯 用途 | 获取、抢占、或中止命名空间的 Reservation 权 |
| 💡 核心字段 | CRKEY(当前密钥)、PRKEY(抢占目标)、RTYPE(类型)、RACQA(动作) |
| 🚫 限制 | IEKEY 不能为 1,否则命令报错 |
| 📌 典型应用 | 虚拟化、高可用集群、分布式锁机制等场景 |
是否继续分析图 394 中的 Reservation Type 详细定义?或者继续往下看 Reservation Register(7.3)命令的注册流程和机制?我可以按你的节奏逐段逐图带你掌握。