NVMe Base 2.4:Namespace Management:容量、建立與附加
00.01.Namespace Management 管理主機可使用的儲存空間。建立 namespace 決定容量與格式;附加 namespace 才把它連到指定控制器。因此,存在一份儲存空間,與主機能經由某個控制器使用它,是兩個不同狀態。
- namespace
- namespace,主機透過 controller 存取的一份已格式化非揮發性容量。
這篇的主軸
規劃要建立的儲存空間
01-01先分清容量、格式與配置粒度:需要多少可定址空間、每個區塊多大,以及控制器建議如何配置。
從建立走到可存取
02-01Create 建立 namespace 並回傳識別碼;Attach 讓指定控制器能存取它。用這個流程理解兩種命令各自完成什麼。
分清移除連接與刪除資料空間
03-01Detach 移除控制器的存取關係,Delete 刪除 namespace;還原預設配置又有不同的前提與結果。
讓主機得知配置變動
04-01建立、附加或刪除後,其他控制器與主機看到的資訊可能改變;透過通知及重新識別更新認識。
把主軸連起來
00.02.先理解容量與識別碼,再準備建立資料;Create 成功後取得 NSID,接著以 Attachment 建立存取關係。需要調整配置時,分別考慮 Detach、Delete 或還原預設配置,並處理受影響控制器收到的變更通知。
- NSID
- Namespace Identifier,controller 用來指向 namespace 的數值 handle;identifier 不等於 namespace 物件本身。
01 容量數值與配置粒度
01.01.先分清各種容量數值的單位,再比較必要的容量關係與建議配置粒度。前者決定是否符合規格要求,後者用來減少配置空間的浪費。
- NCAP
- Namespace Capacity,任一時點最多可配置給 namespace 的 logical blocks。
- NSZE
- Namespace Size,namespace 的總 logical block 數,LBA 範圍為 0 到 NSZE−1。
- NUSE
- Namespace Utilization,目前已配置給 namespace 的 logical blocks。
01.02.Namespace Size(NSZE)是 LBA 0 到 n−1 的總 logical blocks;Namespace Capacity(NCAP)是任一時點最多可配置的 blocks;Namespace Utilization(NUSE)是目前已配置 blocks。永遠遵守 NSZE ≥ NCAP ≥ NUSE。
來源:NVM Command Set 1.3 §2.1.1
來源:NVME-NVM-CS-1.3, Rev. 1.3, §2.1.1, 文件頁 13-14, PDF 頁 13-14
| 容量欄位 | 使用的單位 | 這個數值描述什麼 |
|---|---|---|
| NSZE | logical blocks | LBA 0..NSZE−1 |
| NCAP | logical blocks | 最大可配置容量 |
| NUSE | logical blocks | THINP=1 時需追蹤 |
| NSG/NCG | bytes | 建議配置粒度;未符合這項建議,不能單獨成為拒絕命令的理由 |
- THINP
- Thin Provisioning,NSFEAT 中決定 NCAP 是否可小於 NSZE,以及 controller 是否必須追蹤 NUSE 的 bit。
- NCG
- Namespace Capacity Granularity,以 bytes 表示 controller 偏好的 NCAP allocation granularity。
- NSG
- Namespace Size Granularity,以 bytes 表示 controller 偏好的 NSZE allocation granularity。
02 建立 Namespace 所需的資料
02.01.Base Figure 448 定義 4096-byte envelope,NVM Command Set Figure 134 只定義前 768 bytes 中的 NVM 欄位與 Placement Handle List。Host 先以 SEL/CSI 決定 operation 與 command set,再填 NSZE、NCAP、format、protection、sharing 與 group IDs。Reserved areas 要清零,Protection Information 與 FDP 又各有獨立 功能支援條件。
- Protection Information
- 資料保護資訊,縮寫 PI;包含 Guard 與 tags,用來檢查資料及其關聯資訊。
- Host
- 主機;執行作業系統並送出 NVMe 命令的一端。
- CSI
- I/O Command Set Identifier;選擇 I/O 命令集,NVM Command Set 使用 00h。
- FDP
- Flexible Data Placement,把資料放置提示與媒體回收管理連結的能力。
- NVM
- Non-Volatile Memory,斷電後仍能保存資料的記憶體。
- SEL
- Select;Namespace Management 的 create/delete/restore selector,與 Get Features 的 SEL 不同。
02.02.Create 使用 NSID=0、SEL=0h 與 CSI=00h(NVM Command Set)。DPTR 指向 4096-byte data structure:bytes 0:511 是 I/O Command Set specific、512:1023 reserved、1024:4095 vendor specific。reserved bytes 由 host 清為 0。
- DPTR
- Data Pointer,SQE 中指出 command data buffer 的欄位。
- I/O
- Input/Output,對 namespace 執行資料輸入與輸出的操作類別。
來源:Base 2.4 §5.2.25
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.25, 文件頁 446-448, PDF 頁 472-474
| 資料區域與解讀格式 | 該區域的用途 | 欄位有效的條件 |
|---|---|---|
| Base 0:511 | SIOCS | NVM-specific create data |
| Base 512:1023 | Reserved | host 清 0 |
| Base 1024:4095 | Vendor Specific | 沒有來源定義就不猜 |
| NVM 512:767 | Placement Handle List | 只在 FDP enable 時驗證 |
- SIOCS
- Specified I/O Command Set,Base create buffer bytes 0:511 中放置所選 I/O Command Set specific fields 的區域。
03 建立、連接與使用 Namespace
03.01.Create、Attach、Detach、Delete 分別改變兩個狀態維度:namespace 是否 allocated,以及某 controller 是否 attached。Create CQE.DW0 回 NSID 後,object 已 allocated 但所有 controller 都未 attached;Attach 的 Controller List 才建立 access。Detach 不刪容量,Delete 才使 NSID unallocated。
- controller
- controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
- CQE
- Completion Queue Entry,CQ 中的一筆完成結果資料結構。
- 建立 namespace,取得 NSID。
- 將 namespace 附加至指定 controller。
- 由該 controller 的 Identify 結果確認 namespace 與格式。
- I/O 命令使用 NSID 指定要存取的 namespace。
03.02.完整 Namespace Management capability 由 Namespace Management command 與 Namespace Attachment command 組成。支援時 controller 必須支援兩者、設 OACS.NMS=1、支援 Attached Namespace Attribute Changed event;Allocated event 為 should,Namespace Granularity 與 Restore Default 為 may。
- OACS.NMS
- Optional Admin Command Support 的 Namespace Management Supported bit;設為 1 才宣告完整 Manage 加 Attach capability。
來源:Base 2.4 §8.1.17
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.17, 文件頁 660, PDF 頁 686
| 管理動作 | 改變哪個物件或關係 | 操作後仍保留什麼 |
|---|---|---|
| Create | object/capacity | 不自動 attach |
| Attach | access relationship | Controller List 可含多個 CNTLID |
| Detach | 對指定控制器的可存取狀態 | namespace 仍 allocated |
| Delete | subsystem inventory | NSID 變 unallocated |
04 刪除與恢復預設配置
04.01.Delete all 與 Restore Default 是兩個不同 operation。NSID=FFFFFFFFh 的 Delete All 在零個 namespaces 時也成功;Restore Default 則要求 RDNCS capability、SEL=2h,以及 subsystem 中已不存在任何 namespace。成功前 controller 套用 current active firmware image defaults 並設 DNCS=1。
- RDNCS
- Restore Default Namespace Configuration Supported,宣告 Restore Default operation 是否支援的 capability bit。
- DNCS
- Default Namespace Configuration Status,表示目前 namespace configuration 是否等於 active firmware image defaults 的 status bit。
04.02.Delete 的 NSID 指定已建立 namespace;FFFFFFFFh 表示 delete all,即使目前零個 namespaces 也成功。delete 會使 namespace 從 subsystem 消失並具有 detach side effect;host 應先 detach 所有 controllers,讓 event 與 outstanding-I/O 行為更可控。
來源:Base 2.4 §5.2.25, 8.1.17.1
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.25, 8.1.17.1, 文件頁 446, 448, 662, PDF 頁 472, 474, 688
| 刪除或恢復動作 | 命令如何選對象 | 完成後如何確認配置 |
|---|---|---|
| Delete one | NSID=target | 成功後 object 消失 |
| Delete all | NSID=FFFFFFFFh | zero namespace 仍成功 |
| Restore | SEL=2h、NSID ignored | 剩餘 namespace→Sequence Error |
| Post-condition | DNCS=1 | 仍要重新 Identify actual defaults |
05 Namespace 變更通知與重新辨識
05.01.Attached 與 Allocated Namespace Attribute Changed notices 對應不同 inventory。Create 通常改 Allocated list;Attach/Detach 改 Active list;Delete 可能同時改兩者。event code 不是新清單本身,因此 host 收到 AEN 後要依 CNS 重新 Identify。Delete reporting 還要分辨 processing controller 與其他 controllers。
- AEN
- Asynchronous Event Notification,controller 透過已提交 Asynchronous Event Request 回報事件的通知。
- CNS
- Controller or Namespace Structure;Identify 命令用來選擇回傳資料結構的欄位。
05.02.create 改變 Allocated Namespace ID list;attach/detach 改變 Active Namespace ID list;delete 可能同時改變兩者。啟用對應 notice 時,host 收到 asynchronous event 後應重新 Identify,而不是只用 event code 猜新 inventory。§8.1.17.2 對處理 delete 的 controller 與其他 controllers 規定不同 event reporting。
來源:Base 2.4 §8.1.17.1-8.1.17.2
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.17.1-8.1.17.2, 文件頁 662-663, PDF 頁 688-689
| 通知或清單 | 描述哪種配置變化 | 應重新查詢什麼 |
|---|---|---|
| CNS 02h | Active Namespace ID list | Attached notice |
| CNS 10h | Allocated Namespace ID list | Allocated notice |
| Create | Allocated change | 新 NSID 尚未 active |
| Delete | Allocated+可能 Active | processing controller 規則不同 |
接著打開 Spec 看什麼
06.01.以下按概念列出閱讀位置。報告時先用上面的流程說明問題,再打開對應章節看欄位與完整條件。中文教學 HTML 另有本篇全部圖表的逐圖重點、案例與細節。
| 要說明的觀念 | Spec 閱讀位置 |
|---|---|
| 容量數值與配置粒度 | NVM 1.3 §2.1.1 · Base 2.4 §8.1.17 · NVM 1.3 §5.8 |
| 建立 Namespace 所需的資料 | Base 2.4 §5.2.25 · NVM 1.3 §4.1.6.4 · NVM 1.3 §4.1.6.2 · NVM 1.3 §4.1.6.3 · Base 2.4 §8.1.17 |
| 建立、連接與使用 Namespace | Base 2.4 §8.1.17 · Base 2.4 §5.2.24 · Base 2.4 §5.2.25, 8.1.17.1 |
| 刪除與恢復預設配置 | Base 2.4 §5.2.25, 8.1.17.1 · Base 2.4 §5.2.25.1 · Base 2.4 §8.1.17.1-8.1.17.2 |
| Namespace 變更通知與重新辨識 | Base 2.4 §8.1.17 · Base 2.4 §8.1.17.1-8.1.17.2 · Base 2.4 §5.2.25, 8.1.17.1 · Base 2.4 §5.2.24-5.2.25 |
學完後想一想
1. Namespace Create 成功並回傳 NSID,為何還不能直接假設某 controller 可以對它做 I/O?
07.01.Create 建立 namespace;Attachment 決定哪些 controllers 可以存取。還要確認 attachment 與 Identify 所回報的可見性、格式及可用狀態。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.25, 8.1.17.1, 文件頁 446-448, 662, PDF 頁 472-474, 688
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.24, 文件頁 444-445, PDF 頁 470-471
2. Namespace granularity hint 與實際媒體配置的 rounding,為何不能混為一談?
07.02.Hint 協助 host 選擇合適的 size 或 capacity;rounding 描述實際配置可能耗用的資源。Hint 不是任意加上的命令合法性限制,容量規劃也不能只看 host 要求的數值。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.17, 文件頁 661, PDF 頁 687
來源:NVME-NVM-CS-1.3, Rev. 1.3, §5.8, 文件頁 165, PDF 頁 165
3. Restore Default Namespace 是否表示恢復已刪除 namespace 的原有資料?
07.03.它處理預設 namespace 配置,不是資料復原命令。Namespace 的建立、刪除與預設配置流程,不能被當成保留或找回舊資料的保證。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.25.1, 文件頁 447-448, PDF 頁 473-474
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.25, 8.1.17.1, 文件頁 446, 448, 662, PDF 頁 472, 474, 688


Comments