错误处理与诊断 - 第423页
NVME2.0协议解读 1 min read

错误处理与诊断 - 第423页

Blog Author

我们来深入分析 NVMe 2.0b 规范中的第 8.19 节「Reservations」多主机访问管理机制,特别聚焦在以下方面:


✅ 一、基本概念:Reservation 的意义与场景

Reservation(保留) 是 NVMe 提供的一种机制,允许多个主机协调对同一个 namespace 的访问权限。它类似于传统存储协议(如 SCSI PR)的“持久预留(Persistent Reservation)”机制,在多主机共享访问存储设备的系统中极为关键。

📌 举例说明:

假设有 3 台主机(A/B/C)共享访问同一个 NVMe namespace(NSID 1),为防止同时写入引发数据冲突,需要某种协调机制——这就是 Reservation 的用途。


🧠 二、系统模型:多控制器、多主机关联图解(Figure 471)

        +---------------------------+
        |      NVM Subsystem       |
        |                           |
        |   +-------------------+   |
        |   |  Controller 1     |<------- Host A(Host ID = A)
        |   |  NSID 1           |   |
        |   +-------------------+   |
        |   +-------------------+   |
        |   |  Controller 2     |<------- Host A(Host ID = A)
        |   |  NSID 1           |   |
        |   +-------------------+   |
        |   +-------------------+   |
        |   |  Controller 3     |<------- Host B(Host ID = B)
        |   |  NSID 1           |   |
        |   +-------------------+   |
        |   +-------------------+   |
        |   |  Controller 4     |<------- Host C(Host ID = C)
        |   |  NSID 1           |   |
        |   +-------------------+   |
        +---------------------------+

🔍 关键规则解析:

  • 每个 Controller 只对应一个 Host
  • 同一 Host 可拥有多个 Controller(如 Host A 绑定 Controller 1 和 2)
  • Host Identifier (Host ID) 是唯一标识,用于标记归属
  • Namespace 是共享的资源单元(如 NSID 1)

🔐 三、Reservation 权限建立过程

  1. Host 使用 Set Features 命令注册 Host Identifier
  2. 对应字段:Feature Identifier 0x81(Host Identifier)
  3. 用途:告诉控制器“我是谁”,用于判断后续 Reservation 权限

  4. 确认控制器/namespace 支持 Reservation

  5. Controller 端:
    • Identify Controller 数据结构中的 ONCS.bit[5]=1 表示支持 Reservation 命令集
  6. Namespace 端:

    • Identify Namespace 数据结构中的 RESCAP 字段 ≠ 0 表示支持 Reservation 类型
  7. 若不支持:

  8. 执行如 Reservation Register/Register 等命令将会被 Abort,返回 Invalid Command Opcode

🧰 四、支持 Reservation 的控制器行为要求:

如果某 Controller 声明支持 Reservation,那么它必须支持以下内容:

项目 描述
✅ Reservation Report 命令 查询 namespace 当前保留状态
✅ Reservation Register 命令 注册、修改、删除注册键
✅ Reservation Acquire 命令 申请保留权
✅ Reservation Release 命令 释放保留权
✅ Reservation Notification Log Page 报告相关事件状态
✅ Reservation Log Page Available 异步事件 当保留状态发生变更时触发异步通知
✅ Reservation Notification Mask Feature 主机配置是否启用相关通知(Feature Identifier 0x82

⚠️ 五、命令支持矩阵

命令 功能 控制器要求
Reservation Register 注册一个 key(标识 host)用于参与保留 必须支持
Reservation Acquire 发起保留(写独占等模式) 必须支持
Reservation Release 放弃已有的保留权 必须支持
Reservation Report 查询某 namespace 的保留状态 必须支持

🧩 六、保留类型(由 Host 决定)

Reservation 的类型由主机在 Reservation Acquire 命令中指定,常见类型包括:

类型 含义
Write Exclusive 只有拥有保留的主机能写,所有主机都能读
Exclusive Access 只有拥有保留的主机能读写
Write Exclusive – Registrants Only 只有注册者能读,只有一个拥有保留者能写
Exclusive Access – Registrants Only 只有注册者中的保留者能读写
Write Exclusive – All Registrants 所有注册者都能写,非注册者只能读
Exclusive Access – All Registrants 只有注册者能读写

📌 七、总结流程图(概览)

graph TD
A[主机启动] --> B[注册 Host Identifier (FID=81h)]
B --> C[查询是否支持 Reservation]
C -->|支持| D[使用 Reservation Register 注册 Key]
D --> E[Reservation Acquire 获得保留权]
E --> F[进行读写操作]
F --> G[Reservation Release 释放保留权]

🧠 八、小结

  • Reservation 提供 主机间的互斥访问控制机制,特别适用于共享存储架构。
  • 建立在 Host Identifier 机制之上,所有命令操作都基于此标识进行授权判断。
  • 命令支持依赖 ONCS(控制器)与 RESCAP(命名空间)字段值
  • 命令类型与操作权利设计非常细致,适配多种共享场景。

如果你想:

  • 继续阅读第 8.19.1 小节,了解各 Reservation 命令的执行流程;
  • 想看实际命令结构字段的格式定义;
  • 或者对比分析 SCSI Persistent Reservation vs NVMe Reservation;

随时告诉我,我可以继续协助你进行中文分段解读与原理梳理。你想继续深入哪一块?