jt-pve-storage-dellemc
Dell EMC Storage Plugins for Proxmox VE Dell EMC 儲存伺服器的 Proxmox VE 儲存外掛
One package, one shared host-side layer, and one PVE storage type per Dell EMC product family: PowerStore over iSCSI or Fibre Channel, PowerVault ME4/ME5, and PowerFlex over NVMe/TCP or SDC. Direct volume provisioning — one VM disk is one array volume — so array snapshots, thin clones, compression and replication all act on a single VM disk as their natural unit. 一個套件、一組共用的主機端底層,Dell EMC 每個產品系列各自對應一個 PVE storage type:PowerStore(iSCSI 或 Fibre Channel)、PowerVault ME4/ME5,以及 PowerFlex(NVMe/TCP 或 SDC)。採用直接配置 volume 的模型 —— 一顆 VM 磁碟就是一個儲存伺服器 volume —— 讓儲存伺服器端的快照、精簡複製、壓縮與複寫都以「一顆 VM 磁碟」為自然單位運作。
Disclaimer & Risk 免責聲明與風險
- On every family except PowerVault-over-FC, the array-facing behaviour is unverified: REST endpoints and field names, the SCSI vendor and product strings that decide which devices the plugin touches, and the WWN to WWID conversion. The verification tables below name each item. 除了走 FC 的 PowerVault 之外,各系列面向儲存伺服器的行為都尚未驗證:REST 端點與欄位名稱、決定外掛會碰哪些裝置的 SCSI vendor/product 字串、以及 WWN 轉 WWID 的換算。下方的驗證表逐項列出。
- A storage plugin runs as root, creates and deletes volumes on the array, and manipulates block devices on every node. A defect can destroy virtual machine data, take a storage offline, or leave a node in a state that only a reboot clears. 儲存外掛以 root 權限執行,會在儲存伺服器上建立與刪除 volume,並在每台節點上操作區塊裝置。缺陷可能毀掉虛擬機資料、讓儲存離線,或讓節點進入只能重開機才能恢復的狀態。
- Multipath and SCSI state is shared across the whole node, so the damage is not necessarily limited to this plugin's own storage. multipath 與 SCSI 狀態是全節點共用的,因此受害範圍不一定只限於本外掛自己的儲存。
- Provided under the MIT license, AS IS and without warranty of any kind. In no event shall the author be liable for any claim or damages, including data loss or business interruption. 以 MIT 授權提供,依現狀(AS IS)提供且不附帶任何形式的保固。在任何情況下,作者均不對任何主張或損害負責,包括資料遺失與營運中斷。
- Use a non-production cluster and a non-production array, and keep independent backups. A storage snapshot is not a backup. 請使用非正式環境的叢集與儲存伺服器,並保留獨立備份。儲存快照不是備份。
- An independent community project. Not affiliated with, endorsed by, or supported by Dell Technologies. "Dell", "Dell EMC", "PowerStore", "PowerVault", "PowerFlex", "Unity", "PowerMax" and "PowerScale" are trademarks of their respective owners. 本專案為獨立的社群專案,與 Dell Technologies 無隸屬關係,亦未經其背書或提供支援。「Dell」、「Dell EMC」、「PowerStore」、「PowerVault」、「PowerFlex」、「Unity」、「PowerMax」、「PowerScale」為各自所有權人之商標。
1.0.0 is the on-hardware test pass, not more code. What has and has not been verified is tracked in docs/TESTING.md. 1.0.0 的門檻是實機測試通過,而不是再寫更多程式。哪些已驗證、哪些還沒,記錄在 docs/TESTING_zh-TW.md。
Product Families 產品系列
Dell EMC's product lines differ too much to share one PVE storage type, so each family gets its own. They share the host-side layer, so adding a family is a plugin file and an API client rather than a restructuring. Dell EMC 各產品線的差異太大,無法共用同一個 PVE storage type,因此每個系列各自對應一個。它們共用主機端底層,所以新增一個系列只需要一個 plugin 檔加一個 API 客戶端,不必重構。
| Family系列 | Storage typeStorage type | Data path資料路徑 | Status狀態 |
|---|---|---|---|
| PowerStore | dellpowerstore |
iSCSI / FC (dm-multipath) | Implemented已實作 |
| PowerVault ME4 / ME5 | dellpowervault |
iSCSI / FC (dm-multipath) | Verified on an ME4024 over FC已在 ME4024 以 FC 驗證 |
| PowerFlex | dellpowerflex |
NVMe/TCP or SDC | Implemented已實作 |
| PowerMax | dellpowermax |
FC / iSCSI, NVMe/FC, NVMe/TCP | Planned規劃中 |
| PowerScale | dellpowerscale |
NFS | Not scheduled未排入 |
| Unity XT | dellunity |
FC / iSCSI | Code complete, no hardware run程式碼完成,尚無實機執行 |
| ObjectScale, PowerProtect | — | — | Out of scope不列入範圍 |
Why not one plugin with a type option: PVE asks a plugin for its content types and disk formats before any configuration is parsed, so one type cannot describe families that differ in what they can hold. The type string is also a permanent contract — changing it later invalidates every existing storage.cfg. 為什麼不做成單一 plugin 加型號參數:PVE 會在解析任何設定之前就向 plugin 詢問支援的 content type 與磁碟格式,因此單一 type 無法描述「能放的東西不同」的系列。而且 type 字串一旦公開就不能再改 —— 日後修改會讓所有既有的 storage.cfg 失效。
Features 功能特性
dell-config-backup 0 to turn it off on PowerStore too.
儲存快照只還原磁碟,設定放在 /etc/pve。因此在 PowerStore 上,每次快照都會另外把 VM 設定寫進一個 1 MB 的 volume,即使 /etc/pve 已不存在,也能用 pve-dell-config-get 讀回來。PowerVault ME 系列不提供此功能,因為它的 volume 數量上限太少,無法為每個快照再多花一個 volume;在 PowerStore 上也可以用 dell-config-backup 0 關閉。
Which Proxmox VE operations work 支援的 Proxmox VE 操作
The right-hand column says where each row has actually been driven. “Code” means it is implemented and covered by tests, and no array has run it — which is most of this table, and the reason this is beta software. 最右欄寫的是每一列實際跑過的地方。「僅程式」表示已實作、有測試涵蓋,但沒有任何儲存伺服器跑過 — 本表大多數列都是如此,這也是本軟體仍為 beta 的原因。
| Operation操作 | VM虛擬機 | Container容器 | Driven on實際跑過 |
|---|---|---|---|
| Create and remove a disk建立、移除磁碟 | ✓ | ✓ | ME4024, FCME4024,FC |
| Boot a guest from an array volume客體從儲存伺服器磁碟區開機 | ✓ | ✓ | ME4024, FCME4024,FC |
| Grow a disk擴充磁碟
The array grows the volume, then this node’s paths and multipath map are refreshed until they report the new size. Other nodes catch up when they next activate the volume.先由儲存伺服器擴充磁碟區,接著重新整理本節點的路徑與 multipath map,直到它們回報新的大小。其他節點會在下次啟用該磁碟區時跟上。
|
✓ | ✓ | ME4024, FC (VM stopped)ME4024,FC(VM 已停) |
| Shrink a disk縮小磁碟 | refused拒絕 | refused拒絕 | ME4024, FCME4024,FC |
| Snapshot, list, delete快照建立、列出、刪除 | ✓ | ✓ | ME4024, FCME4024,FC |
| Rollback快照倒回
Refused while a newer snapshot exists, because the array would discard it. A container’s filesystem is frozen first; a backup snapshot is taken and kept until the rollback succeeds.有更新的快照存在時會拒絕,因為儲存伺服器會把它丟掉。容器的檔案系統會先凍結;倒回前會先取一份備份快照,直到倒回成功才移除。
|
✓ | ✓ | ME4024, FC (container)ME4024,FC(容器) |
| Template and linked clone範本與連結複製
A linked clone is a thin clone on the array. Deleting a template while a clone still reads from it is refused by the array, and reported as such.連結複製在儲存伺服器上是一個精簡複製。複製還在讀取時刪除範本,儲存伺服器會拒絕,外掛也照實回報。
|
✓ | ✓ | Code僅程式 |
| Clone from a snapshot從快照複製 | ✓ | ✓ | Code僅程式 |
Backup and restore (vzdump snapshot mode)備份與還原(vzdump snapshot 模式)
The backup reads through a temporary clone of the snapshot, which is removed afterwards.備份是透過該快照的一個臨時複製去讀取,結束後移除。
|
✓ | ✓ | ME4024, FCME4024,FC |
| Live migration線上遷移
The volume stays mapped: unmapping on migration is what breaks it. The target maps the volume itself if it does not already have it.磁碟區保持對應狀態:遷移時解除對應正是會弄壞它的做法。目標節點若尚未擁有該對應,會自行建立。
|
✓ | offline離線 | Code僅程式 |
| Move a disk to another storage把磁碟移到其他儲存 | ✓ | ✓ | Code僅程式 |
pvesm export / import, cluster-to-cluster migrationpvesm export/import、叢集對叢集移轉 |
✓ | ✓ | Code僅程式 |
| EFI disk, TPM state, cloud-initEFI 磁碟、TPM 狀態、cloud-init | ✓ | — | Code僅程式 |
| Node reboot, storage returns on its own節點重開機後儲存自動回來 | ✓ | ✓ | ME4024, FCME4024,FC |
| Rename a snapshot重新命名快照
Refused with a message that says why: a snapshot name is part of the array object’s name here.會拒絕並說明原因:在這裡,快照名稱是儲存伺服器物件名稱的一部分。
|
refused拒絕 | refused拒絕 | Code僅程式 |
Why this plugin has to be verified on hardware 為什麼這個外掛需要實機驗證
Dell publishes documentation for all four families, and it is not enough. The documentation site refuses the pages that carry the collection-query syntax; a printed column heading is not a property name; and two firmware generations of the same array document the same command with its arguments in a different order. So every array-facing fact here was cross-checked against Dell’s own client code — python-powerstore, python-powerflex, gounity, the ansible collections — and where those disagreed with the prose, the code won.
Dell 四個系列都有公開文件,而那並不足夠。文件網站會拒絕提供帶有集合查詢語法的頁面;指令印出的欄位標題不等於屬性名稱;同一台儲存伺服器的兩個韌體世代,還會把同一個指令的參數順序記載成不同的樣子。所以這裡每一項面向儲存伺服器的認知,都與 Dell 自己的客戶端程式碼交叉比對過 — python-powerstore、python-powerflex、gounity、ansible collections — 兩者不一致時,以程式碼為準。
It still is not enough. The first run on a real ME4024 found three defects in a row, each hidden by the one before it, and none of them reachable by reading. The first run on a real PowerStore found four more, starting with a WWPN written without colons. That is what this table is for: a row that says “Code” means nobody has been able to be wrong about it yet. 而這樣仍然不夠。在真正的 ME4024 上第一次執行,一口氣找出三個缺陷,每一個都被前一個遮住,而且沒有一個是用讀的能找到的。在真正的 PowerStore 上第一次執行,又找出四個,第一個是沒有冒號的 WWPN。上面那張表就是為此存在的:標示「僅程式」的那一列,代表還沒有人有機會在它上面犯錯。
Where nothing could be established, this plugin refuses the operation rather than guessing at it. A refusal that names what it could not establish is recoverable; a guess that deletes the wrong volume is not. 凡是無法確立的地方,這個外掛會拒絕該操作,而不是用猜的。一個說得出「什麼無法確立」的拒絕是可以挽回的;一個刪錯磁碟區的猜測不是。
How to help this project 如何協助這個專案
What this project needs is not code. It is time on other people’s arrays: one PowerVault ME4024 over Fibre Channel has run it, and one PowerStore is running it now. PowerFlex and Unity XT have never been connected to anything. 這個專案缺的不是程式,是在別人儲存伺服器上的時間:目前有一台走 Fibre Channel 的 PowerVault ME4024 跑過,另有一台 PowerStore 正在跑。PowerFlex 與 Unity XT 從來沒有連上過任何東西。
-
Run it against a non-production array.
docs/FIRST_RUN.mdis nine steps and stops before anything is created if the array does not answer as expected. 拿一台非正式環境的儲存伺服器跑跑看。docs/FIRST_RUN.md有九個步驟,而且只要儲存伺服器的回應不如預期,它會在建立任何東西之前停下來。 - Report what broke. The useful details are the model and firmware, the protocol, what you were doing, and the error exactly as it appeared — including the array’s own message, which is usually the part that names the real cause. 回報壞在哪裡。有用的細節是機型與韌體、使用的協定、當時在做什麼,以及錯誤訊息原本的樣子 — 包含儲存伺服器自己那一段,通常真正的原因就寫在那裡。
-
Three things only an array can answer, and they take minutes:
sg_inq /dev/sdXon a mapped volume, whether the WWID this plugin reports matchesmultipath -ll, and whether aqm rollbackleaves the expected snapshot on the array. 有三件事只有儲存伺服器答得出來,而且幾分鐘就好:對已對應的磁碟區跑sg_inq /dev/sdX、外掛回報的 WWID 是否與multipath -ll一致,以及qm rollback之後儲存伺服器上是否留下預期的快照。
Issues and reports: github.com/jasoncheng7115/jt-pve-storage-dellemc/issues 問題回報:github.com/jasoncheng7115/jt-pve-storage-dellemc/issues
Requirements 系統需求
Proxmox VE
| PVE VersionPVE 版本 | Storage API | Compatibility相容性 |
|---|---|---|
| PVE 9.1+ | 13–15, negotiated13–15,自動協商 | Supported — the ME4024 run was on PVE 9.2.5 (APIVER 15)支援 — ME4024 的實測就在 PVE 9.2.5(APIVER 15)上 |
| PVE 9.0 | 12 | Untested未測試 |
| PVE 8.x | 10–11 | Not supported不支援 |
Arrays 儲存伺服器
| Family系列 | Version版本 | Management interface管理介面 |
|---|---|---|
| PowerStore | PowerStore OS 3.0+ (4.x targeted) | REST API v3 |
| PowerVault ME | ME4 / ME5 | CLI over HTTPSHTTPS 上的 CLI |
| PowerFlex | 3.x / 4.x (NVMe/TCP needs 4.0+)(NVMe/TCP 需 4.0 以上) | REST API |
| Unity XT | Unity OE 5.x targeted以 Unity OE 5.x 為目標 | Unisphere REST APIUnisphere REST API |
Node packages 節點套件
| Package套件 | Purpose用途 |
|---|---|
libwww-perl, libjson-perl, liburi-perl |
REST clientREST 客戶端 |
open-iscsi |
iSCSI initiator (SAN families)iSCSI initiator(SAN 系列) |
multipath-tools |
dm-multipath (SAN families)dm-multipath(SAN 系列) |
sg3-utils, psmisc |
SCSI inquiry, in-use detectionSCSI 查詢、使用中偵測 |
nvme-cli |
PowerFlex over NVMe/TCPPowerFlex 走 NVMe/TCP 時需要 |
Installation 安裝
Every
release
carries a prebuilt .deb and a SHA256SUMS beside it. This is the package to install; it is the same build that was tested for that release.
每個
release
都附有預先建置的 .deb 與 SHA256SUMS。請安裝這一份 —— 它就是該版本測試時所用的建置。
# always the newest build; this URL never has to be edited curl -LO https://github.com/jasoncheng7115/jt-pve-storage-dellemc/releases/latest/download/jt-pve-storage-dellemc_all.deb curl -LO https://github.com/jasoncheng7115/jt-pve-storage-dellemc/releases/latest/download/SHA256SUMS sha256sum -c SHA256SUMS --ignore-missing # must say OK before installing # which version did that fetch? dpkg-deb -f jt-pve-storage-dellemc_all.deb Version
Check the sum before installing: this package writes to /etc/multipath/conf.d and talks to your array.
安裝前先核對雜湊值:這個套件會寫入 /etc/multipath/conf.d,也會與你的儲存伺服器通訊。
The version is inside the package, not in that file name, so the command above never goes stale. Each release also carries a versioned copy — ..._0.7.66.beta1-1_all.deb, spelled with a dot because GitHub will not serve an asset name containing ~ — and that is the name to quote in a bug report. SHA256SUMS lists both, which is why the check above passes --ignore-missing.
版本在套件裡面,不在那個檔名上,所以上面那道指令永遠不會過期。每一版同時也附一份帶版號的副本 — ..._0.7.66.beta1-1_all.deb,版本用點分隔是因為 GitHub 不會提供檔名含 ~ 的附件 — 回報問題時請引用那個檔名。SHA256SUMS 兩份都列,這就是上面要加 --ignore-missing 的原因。
apt install ./jt-pve-storage-dellemc_all.deb
Use apt install ./file.deb rather than dpkg -i: dpkg does not install dependencies, and the missing binaries only surface much later as failures inside the plugin.
請用 apt install ./file.deb 而不是 dpkg -i:dpkg 不會安裝相依套件,缺少的執行檔要到很後面才會以外掛內部的錯誤浮現。
systemctl restart pvestatd
A reload does not reliably replace Perl modules that are already loaded. Run this on every node. reload 無法可靠地替換已載入記憶體的 Perl 模組。請在每台節點上執行。
Building from source 從原始碼建置
Only needed to work on the plugin, or to run the test suite against your own PVE version. For installing it, use the release package above — that is the build the release was tested with. 只有在要修改這個外掛、或想針對你自己的 PVE 版本跑測試套件時才需要。單純安裝請用上面的發行版套件 — 那才是該版本測試時所用的建置。
git clone https://github.com/jasoncheng7115/jt-pve-storage-dellemc.git cd jt-pve-storage-dellemc make test # syntax checks, unit tests, safety guard make deb
Upgrading 升級
Volumes created by an older version keep working, and nothing needs doing. Every name the plugin creates begins with a prefix, which is pve unless a storage sets dell-name-prefix — and that is the literal the plugin used before the option existed. A storage that has never set it produces byte-identical names after an upgrade, so every volume already on the array stays recognised.
由舊版建立的磁碟區會繼續正常運作,而且什麼都不用做。外掛建立的每一個名稱都以一個前置字串開頭,除非該 storage 設定了 dell-name-prefix,否則就是 pve — 而那正是這個選項存在之前外掛寫死的那個字串。從未設定過它的 storage,升級後會產生逐位元組相同的名稱,因此儲存伺服器上既有的每一個磁碟區都仍然被認得。
| Object created by an older version由舊版建立的物件 | Still recognised是否仍被認得 |
|---|---|
pve-ps1-100-disk0 | yes, as a VM disk是,視為 VM 磁碟 |
pve-ps1-100-efidisk0, -tpmstate0, -cloudinit | yes是 |
pve-ps1-100-vmconf-before | yes, as a config backup是,視為設定備份 |
pve-ps1-100-disk0.pve-snap-before | yes, as a snapshot是,視為快照 |
pve-ps1-100-disk0.pve-base | yes, as a template marker是,視為範本標記 |
Nothing acts on old volumes unattended. The orphan reaper touches only the node’s own devices and never deletes an array volume; the temporary-clone reaper works from a state file this plugin wrote, which old volumes are not in; and per-VM volume groups are off by default and never add existing volumes retroactively. 沒有任何路徑會在無人值守的情況下動到舊磁碟區。孤兒回收器只處理節點自己的裝置,從不刪除儲存伺服器上的磁碟區;暫時複製回收器依據的是外掛自己寫下的狀態檔,而舊磁碟區不在其中;每 VM 一個 volume group 預設關閉,也不會把既有磁碟區追溯加入群組。
Two things that do change, and both are fixes有兩件事確實會改變,而兩者都是修正
-
A multipath map may be built on first use. Older versions could accept a single
/dev/sdXand leave the guest with no failover. From 0.8.28 the WWID is claimed and the map is waited for, somultipath -aappearing in the journal for an existing volume is expected. 第一次使用時可能會建立 multipath map。舊版可能接受單一的/dev/sdX,讓客體沒有任何路徑備援。從 0.8.28 起會認領 WWID 並等待 map 出現,因此在日誌中看到對既有磁碟區執行multipath -a,是預期的。 - Adding an existing storage warns that volumes already exist under its prefix. That is the cross-cluster check; for a storage you are re-adding it is expected, and the message says so. 加入既有 storage 時會警告該前綴下已經有磁碟區。那是跨叢集檢查;對於你自己重新加入的 storage,這是預期的,訊息裡也寫明了這種讀法。
dell-name-prefix on a storage that already has volumes. It would leave the plugin unable to find any of them. pvesm set refuses it for that reason: the prefix can only be chosen when the storage is created.
不要對已經有磁碟區的 storage 設定 dell-name-prefix。那會讓外掛再也找不到它們。pvesm set 正是因此會拒絕:前置字串只能在建立 storage 時決定。
Quick Start 快速入門
PowerStore
pvesm add dellpowerstore ps1 \ --dell-portal 192.168.1.50 \ --dell-username pveadmin \ --dell-password 'SecurePassword' \ --dell-protocol iscsi \ --content images,rootdir \ --shared 1
PowerVault ME4 / ME5
pvesm add dellpowervault me5 \ --dell-portal 192.168.1.60,192.168.1.61 \ --dell-username manage \ --dell-password 'SecurePassword' \ --pvault-pool A \ --content images,rootdir \ --shared 1
dell-portal cannot be edited afterwards, and during an incident it is too late. Verify the pair on the array with show network-parameters.
為什麼要填兩個位址? ME 沒有虛擬管理 IP:控制器 A 與 B 各自持有位址,故障控制器的位址會跟著它一起消失。請在建立時就把兩個都列入 — dell-portal 事後不能修改,事故當下才想改就來不及了。可在儲存伺服器上以 show network-parameters 確認這兩個位址。
PowerFlex
pvesm add dellpowerflex pflex1 \ --dell-portal 192.168.1.70 \ --dell-username admin \ --dell-password 'SecurePassword' \ --dell-protocol nvme \ --pflex-storage-pool pool1 \ --content images,rootdir \ --shared 1
Unity XT
pvesm add dellunity u480 \ --dell-portal 192.168.1.80 \ --dell-username admin \ --dell-password 'SecurePassword' \ --dell-protocol fc \ --unity-pool pool_1 \ --content images,rootdir \ --shared 1
--unity-pool is required on an array with more than one pool. This family has never run against an array — see the verification section below.
Unity 的管理 IP 會跟著主 SP 走,填一個位址即可。儲存伺服器有多個儲存池時 --unity-pool 為必填。這個系列從未在儲存伺服器上執行過 —— 請見下方驗證狀態。
Verify 驗證
pvesm status journalctl -t pvestatd | grep dellpowerstore
Configuration 設定選項
Options shared by every family use the dell- prefix and are declared once; family options use their own prefix. PVE registers storage properties in one shared schema, so a name may only have one definition across all plugins. 所有系列共用的選項使用 dell- 前置字串且只宣告一次;各系列專屬選項使用自己的前置字串。PVE 的 storage property 註冊在同一份共用 schema,同一個名稱在所有外掛之間只能有一種定義。
Common options 共通選項
| Option選項 | Default預設 | Description說明 |
|---|---|---|
dell-portal | — | Management address(es), comma-separated. Required, cannot be changed later. PowerVault ME has one fixed IP per controller and no floating address — unlike a NetApp cluster LIF or a Pure vir0, nothing moves to the surviving controller — so list both controllers up front; the plugin fails over between them. The data path needs none of this: dm-multipath handles controller failover on its own 管理位址(可逗號分隔多個)。必填,且建立後不可變更。PowerVault ME 每個控制器各有固定 IP、沒有浮動位址 — 不像 NetApp 的 cluster LIF 或 Pure 的 vir0,故障時不會有位址漂移到存活的控制器 — 所以請一開始就把兩個控制器都列入,外掛會在其間自動容錯。資料路徑完全不需要這些:dm-multipath 自己處理控制器容錯 |
dell-username | — | API user. RequiredAPI 帳號。必填 |
dell-password | — | API password. RequiredAPI 密碼。必填 |
dell-protocol | iscsi |
iscsi or fc on the SAN families; sdc or nvme on PowerFlex SAN 系列為 iscsi 或 fc;PowerFlex 為 sdc 或 nvme |
dell-host-mode | per-node |
One host object per node, or one for the cluster 每節點一個 host 物件,或整個叢集共用一個 |
dell-status-timeout | 5 |
Health-path timeout. PVE polls storages sequentially, so a slow array delays every storage after it 健康路徑逾時。PVE 依序輪詢儲存,因此慢的儲存伺服器會拖累排在後面的每一個儲存 |
dell-device-timeout | 60 |
Seconds to wait for a volume's device 等待 volume 裝置出現的秒數 |
dell-rescan-interval | 300 |
Rate limit for the periodic SAN rescan. A new portal login always rescans immediately 週期性 SAN 掃描的頻率限制。登入新 portal 時一律立即掃描 |
Family options 系列專屬選項
| Family系列 | Options選項 |
|---|---|
| PowerStore | pstore-appliance, pstore-volume-group, pstore-performance-policy, pstore-protection-policy, pstore-lun-id-base |
| PowerVault ME | pvault-pool, pvault-volume-group, pvault-tier-affinity, pvault-lun-id-base |
| PowerFlex | pflex-storage-pool (required)(必填), pflex-protection-domain, pflex-thick |
| Unity XT | unity-pool, unity-thin |
Full reference: docs/CONFIGURATION.md. 完整說明:docs/CONFIGURATION_zh-TW.md。
Host objects the array already has 儲存伺服器上原本就有的 host 物件
An array usually has a host object for each node before this plugin ever runs — built by whoever zoned the fabric — holding that node’s WWPNs or IQN under a name of its own. An initiator belongs to one host object, so the plugin cannot register the same ports a second time under its own name. 在這個外掛跑起來之前,儲存伺服器上通常每台節點都已經有一個 host 物件 — 由當初做 fabric 分區的人建立 — 以它自己的命名持有該節點的 WWPN 或 IQN。一個 initiator 只能屬於一個 host 物件,所以外掛沒辦法用自己的名稱把同樣的埠再註冊一次。
On PowerStore it does not try. When there is no host under pve-<cluster>-<node>, it asks the array which host holds this node’s initiators and uses that one, recording the name in /var/lib/pve-storage-dellemc/<storeid>-host. Nothing is renamed, nothing is removed, and no initiator is moved.
在 PowerStore 上它不會去試。當 pve-<叢集>-<節點> 底下沒有 host 時,它會問儲存伺服器「本節點的 initiator 在哪個 host 上」,改用那一個,並把名稱記在 /var/lib/pve-storage-dellemc/<storeid>-host。不改名、不刪除,也不搬動任何 initiator。
It adopts only a host whose initiators are a subset of this node’s. One that also carries another host’s ports is refused, by name: a volume mapped there would be visible to whatever those belong to. Ports split across two host objects are refused as well — a node is one host object, and merging them is the operator’s call. 它只會採用 initiator 是本節點子集的 host。若那個 host 同時持有別台的埠,就會被拒絕並指名是哪一個:對應到它的磁碟區會被那些東西看見。本節點的埠散在兩個 host 物件上也一樣拒絕 — 一個節點就是一個 host 物件,要合併是操作者的決定。
System Architecture 系統架構
DellPowerStorePlugin / DellPowerVaultPlugin # SAN families | v DellEMC::Common::BlockBase # activation, allocation, device | # discovery, snapshots, clones, | # multipath drop-in, orphan reaper +-- Common::REST # retries, timeouts, sessions +-- Common::ISCSI # initiator, portals, rescan +-- Common::FC # HBA discovery, WWN handling +-- Common::Multipath # SCSI lifecycle, dm-multipath +-- Common::Naming # PVE names <-> array objects +-- Common::WwidState # WWID tracking, reap guards +-- Common::Health # outage and capacity reporting +-- Common::Schema # the shared dell-* options DellPowerFlexPlugin # no SCSI LUN, no multipath +-- PowerFlex::Host # SDC or NVMe/TCP device access
Why the plugin is careful about the host 為什麼外掛在主機端如此謹慎
| Failure mode故障模式 | What the plugin does about it外掛的因應 |
|---|---|
| Uninterruptible sleep (D state)不可中斷睡眠(D state) | Reading an unresponsive device puts a process into a state no signal clears. Every sysfs access runs in a forked, timeout-bounded child; every command under an alarm. 讀取沒有回應的裝置會讓行程進入任何訊號都無法清除的狀態。所有 sysfs 存取都在有逾時限制的子行程中進行,所有外部指令都有 alarm 保護。 |
| Blast radius影響範圍 | The system-wide multipath flush is never issued, and neither is an FC LIP. Destructive operations are vendor-gated and act on one object at a time. 絕不執行全系統的 multipath flush,也不發 FC LIP。具破壞性的操作都有 vendor 過濾,且一次只處理一個物件。 |
| The sequential poll依序輪詢 | PVE polls storages one after another, so a slow array starves its neighbours. The health path uses a short timeout and a single attempt; expensive periodic work is rate-limited and detached. PVE 一個接一個輪詢儲存,慢的儲存伺服器會餓死鄰居。健康路徑採短逾時且只嘗試一次;昂貴的週期性工作有頻率限制並丟到背景執行。 |
PowerFlex: SDC vs NVMe/TCP PowerFlex:SDC 與 NVMe/TCP
PowerFlex volumes do not arrive as SCSI LUNs. There are two ways a node can see them, and the choice outlives this plugin. PowerFlex 的 volume 不是以 SCSI LUN 出現。節點有兩種方式看到它們,而這個選擇的影響會比這個外掛活得更久。
| SDC | NVMe/TCP | |
|---|---|---|
| Host component主機端元件 | Dell's scini kernel moduleDell 的 scini kernel module |
in-kernel nvme_tcpkernel 內建的 nvme_tcp |
| PowerFlex versionPowerFlex 版本 | 3.x / 4.x | 4.0+ (needs SDT)4.0 以上(需要 SDT) |
| Devices裝置 | /dev/disk/by-id/emc-vol-* |
/dev/nvme*n* |
| Survives a kernel upgradekernel 升級後仍可用 | only if the module rebuilds只有模組成功重建時 | yes是 |
| Installed by this plugin由本外掛安裝 | no否 | nothing to install無需安裝 |
- Dell ships the packages and documents the procedure. KB 000462918 covers installing the SDC on “Debian and Ubuntu operating systems, including Proxmox Virtual Environment”, names Debian 12 / Proxmox VE 8.x directly, and the SDC tarball contains a
Debian13_SDCvariant — Debian 13 is what Proxmox VE 9 is built on. PowerFlex 5.1.x documentation is published. Dell 有提供套件,也有寫操作步驟。KB 000462918 說明如何在「Debian 與 Ubuntu 作業系統,包含 Proxmox Virtual Environment」上安裝 SDC,並直接點名 Debian 12/Proxmox VE 8.x;SDC 的 tarball 裡也包含Debian13_SDC變體 —— Debian 13 正是 Proxmox VE 9 的基底。PowerFlex 5.1.x 的文件也已發布。 - Proxmox VE is not in the official OS support matrix. KB 000272738 lists Ubuntu LTS, RHEL, Oracle Linux, SLES, CentOS and AIX. Debian is not there, and neither is Proxmox VE, at any PowerFlex version. 但 Proxmox VE 並不在官方的作業系統支援矩陣裡。KB 000272738 列出的是 Ubuntu LTS、RHEL、Oracle Linux、SLES、CentOS 與 AIX。Debian 不在其中,Proxmox VE 也不在,任何 PowerFlex 版本皆然。
- So the SDC here is something Dell publishes instructions for, not something its support matrix commits to. What that means for a support case is a question for your Dell account team. Separately: Dell ships no prebuilt
scinifor the Proxmox kernel, so it is compiled on the node and a kernel upgrade can leave that node with no storage until it rebuilds. That is whydell-protocol nvmeis the default. 也就是說,在這裡使用 SDC 是 Dell 有發布安裝說明的事,但不是它的支援矩陣所承諾的事。這對一張支援案件單代表什麼,是要問您的 Dell 業務窗口的問題。另外一件事:Dell 未為 Proxmox kernel 提供預編譯的scini,必須在節點上編譯,因此一次 kernel 升級就可能讓該節點在模組重建之前沒有儲存。這就是dell-protocol nvme是預設值的原因。 - Checked 2026-07-27. Both KBs change; read them rather than trusting this page. 查證日期 2026-07-27。兩份 KB 都會變動,請以它們為準,不要相信這一頁。
Official Dell references Dell 官方資料
Bookmark these; they are the authority on what is supported, and they change. 請加入書籤;支援範圍以它們為準,而且內容會變動。
| What內容 | Link連結 |
|---|---|
| SDC on Proxmox VE在 Proxmox VE 上設定 SDC | KB 000466868 |
| Support matrix (OS and kernels)支援矩陣(OS 與 kernel) | E-Lab Navigator: PowerFlex_OS.pdf |
| Is my kernel supported?我的 kernel 有支援嗎? | KB 000332118 |
| On-demand driver compilation驅動程式隨選編譯 | KB 000224134 |
| Prebuilt .ko files by OS and version依 OS 與版本分類的預編譯 .ko | mft.dell.com |
| NVMe/TCP overviewNVMe/TCP 概觀 | PowerFlex 4.5.x Technical Overview |
Dell notes that the E-Lab matrix does not always list every kernel a distribution has released, and gives a prefix rule: a kernel is supported if its version prefix matches a listed one — 4.18.0-553 covers 4.18.0-553.51.1.el8_10.x86_64. Details and the commands to check a node are in docs/POWERFLEX_SDC.md.
Dell 也說明 E-Lab 矩陣不一定涵蓋各發行版釋出的每一個 kernel,並給了一條前置字串規則:版本前置字串相符即視為支援 —— 4.18.0-553 涵蓋 4.18.0-553.51.1.el8_10.x86_64。細節與節點檢查指令請見 docs/POWERFLEX_SDC_zh-TW.md。
Multipath Safety Multipath 安全規則
| Rule規則 | Why原因 |
|---|---|
Never run the system-wide multipath flush (capital F). Flush one map: multipath -f /dev/mapper/<wwid>
絕不執行全系統的 multipath flush(大寫 F)。只清單一 map:multipath -f /dev/mapper/<wwid> |
It removes every unused map on the node, including other vendors' storage that happens to be idle. The build fails if that form appears anywhere in this repository. 它會清掉節點上所有未使用的 map,包含當下剛好閒置的其他廠商儲存。只要該指令出現在本專案任何檔案中,建置就會失敗。 |
Use systemctl restart multipathd, never reload
用 systemctl restart multipathd,不要用 reload |
Reload only re-reads the file; restart is what reapplies device-mapper state. reload 只會重讀檔案,restart 才會重新套用 device-mapper 狀態。 |
Avoid no_path_retry queue and dev_loss_tmo infinity
避免 no_path_retry queue 與 dev_loss_tmo infinity |
With every path down, queued I/O that can never complete puts processes into uninterruptible sleep and the node has to be power-cycled. Use 30 / 5 / 60. 所有路徑失效時,永遠無法完成的排隊 I/O 會讓行程進入不可中斷睡眠,該節點只能斷電重開。請用 30 / 5 / 60。 |
| The plugin never rewrites a multipath file it did not create 外掛不會改寫非它建立的 multipath 設定檔 | Its own drop-in carries a version marker; a file without one is treated as operator-owned and left untouched. 它自己的 drop-in 帶有版本標記;沒有標記的檔案視為管理者自有,完全不動。 |
Supported Features 功能支援表
| Feature功能 | PowerStore | PowerVault ME | PowerFlex | Unity XT |
|---|---|---|---|---|
| VM disks and container root filesystemsVM 磁碟與容器根檔案系統 | ✓ | |||
| Snapshots快照 | ✓ | |||
| Snapshot rollback快照還原 | ✓ — to the most recent snapshot; rolling back past newer ones is refused unless dell-rollback-any-snapshot 1✓ —— 僅限最新的快照;除非設定 dell-rollback-any-snapshot 1,否則會拒絕跨過較新快照的還原 | |||
| Templates and linked clones範本與連結複製 | ✓ | |||
| Online grow線上擴充 | ✓ | |||
| Shrink縮小 | Refused on all families — it would truncate the guest filesystem所有系列都拒絕 —— 會截斷客體的檔案系統 | |||
| Live migration線上遷移 | ✓ | |||
| VM config backup volumeVM 設定備份卷 | ✓ (optional)✓(可關閉) | — (volume ceiling too low)—(volume 上限太少) | — | — (off until a hardware run)—(實機測試前先關閉) |
| Multipath I/O多路徑 I/O | dm-multipath | dm-multipath | SDC or NVMe ANASDC 或 NVMe ANA | dm-multipath |
| Orphan device reaping殘留裝置清理 | ✓ | ✓ | — | ✓ |
| Full clone via the array儲存伺服器端完整複製 | Not possible: PVE implements it as a qemu-img block copy and never calls the plugin無法做到:PVE 以 qemu-img 逐區塊複製實作,完全不呼叫外掛 | |||
Verification Status 驗證狀態
3,411 unit tests run without an array or a device. What they cannot tell you is whether the endpoints exist, whether the field names are right, or whether a device ever appears — only an array can, and exactly one has. 3,411 個單元測試不需要儲存伺服器或實體裝置即可執行。它們無法告訴你的是:端點是否存在、欄位名稱是否正確、裝置到底會不會出現 — 那隻有儲存伺服器能回答,而目前只有一台回答過。
What has run on hardware 哪些在實機上跑過
| Family產品系列 | Data path資料路徑 | Hardware實機 | On what在什麼上面 |
|---|---|---|---|
| PowerVault ME4 / ME5 | Fibre Channel | full first-run pass完整首次執行通過 | ME4024, firmware GT280R011-01, since 0.7.65ME4024,韌體 GT280R011-01,自 0.7.65 起 |
| PowerVault ME4 / ME5 | iSCSI | not verified未驗證 | the array above ran FC; this path shares the CLI client but not the data path上面那台走的是 FC;這條路徑共用 CLI 用戶端,但資料路徑不同 |
| PowerStore | iSCSI, FCiSCSI、FC | partly verified部分驗證 | create, map, device discovery, snapshot creation and guests running off it are confirmed on a customer's array. Snapshot deletion, rollback and migration between nodes are not. That array is on Fibre Channel, so iSCSI on PowerStore remains entirely unrun建立、對應、裝置探索、快照建立,以及客體實際跑在上面,都已在客戶的儲存伺服器上確認。快照刪除、倒回與節點間遷移則沒有。那台走的是 Fibre Channel,所以 PowerStore 上的 iSCSI 完全沒有跑過 |
| PowerFlex | NVMe/TCP, SDCNVMe/TCP、SDC | not verified未驗證 | never run against an array從未在任何儲存伺服器上執行過 |
| Unity XT | FC, iSCSIFC、iSCSI | not verified未驗證 | never run against an array; a customer's Unity 480 (FC) is the intended first. The transport has been driven over real HTTP against an API emulator, which proves shapes, not storage從未在任何儲存伺服器上執行過;預定的第一台是客戶的 Unity 480(FC)。傳輸層已對 API 模擬器以真實 HTTP 驗證 —— 那證明的是結構,不是儲存行為 |
The ME4024 run covered the whole of the first-run test: capacity agreeing with the array's own GUI, several allocations with LUNs in sequence, dm-multipath with two paths, dd read and write verified by checksum, snapshot, rollback, snapshot delete, template, a linked clone in seconds, the array correctly refusing to delete a template with a live clone, and unmap, delete and local device cleanup. It also found three defects that reading Dell's documentation had not — each hidden behind the one before it.
那次 ME4024 的測試涵蓋了整套首次執行測試:容量與儲存伺服器自己的 GUI 一致、連續數次配置且 LUN 依序遞增、dm-multipath 兩條路徑、以雜湊驗證的 dd 讀寫、快照、倒回、刪除快照、範本、秒級完成的連結複製、儲存伺服器正確拒絕刪除仍有存活複製的範本,以及解除對應、刪除與本機裝置清理。它同時找出三個讀 Dell 文件找不出來的缺陷 — 而且一個藏在另一個後面。
Where the rest came from 其餘的依據是什麼
| Area項目 | Source來源 | Hardware實機 |
|---|---|---|
| PowerVault CLI grammar, field names, mapping modelPowerVault CLI 語法、欄位名稱、對應模型 | ME5 CLI Reference Guide, then corrected by the arrayME5 CLI Reference Guide,之後由儲存伺服器修正 | verified已驗證 |
| WWN to WWID, SCSI vendor / product stringsWWN 轉 WWID、SCSI vendor/product 字串 | inferred推斷 | verified on ME4 only僅在 ME4 上驗證 |
| Fibre Channel pathFibre Channel 路徑 | — | verified on ME4 only僅在 ME4 上驗證 |
| PowerStore REST endpoints and fieldsPowerStore REST 端點與欄位 | PowerStore 4.x documentation and Dell's own SDK, audited key-for-key 2026-08-06: all eight request bodies matchPowerStore 4.x 文件與 Dell 自己的 SDK,2026-08-06 逐鍵稽核:八組請求內容全數相符 | not verified未驗證 |
| PowerFlex login, volume, mapping, snapshot APIPowerFlex 登入、磁碟區、對應、快照 API | Dell's own python-powerflex, audited key-for-key; the 3.x rollback form alone remains documentation-onlyDell 自己的 python-powerflex,已逐鍵稽核;僅 3.x 的倒回寫法仍只有文件依據 |
not verified未驗證 |
| Unity URIs, request bodies, field listsUnity 的 URI、請求內容、欄位清單 | Dell's own gounity client and the Unisphere Programmer's Guide; multipath settings follow the kernel's own DGC entryDell 自己的 gounity 客戶端與 Unisphere Programmer's Guide;multipath 設定跟隨核心自己的 DGC 條目 |
not verified未驗證 |
The full matrix, including what came from official documentation and what did not, is in docs/TESTING.md. 完整矩陣(包含哪些來自官方文件、哪些不是)請見 docs/TESTING_zh-TW.md。
Before the first run against an array, work through docs/FIRST_RUN.md: the order to do it in, what to check after each step, and what each failure most likely means. 第一次接上儲存伺服器之前,請照著 docs/FIRST_RUN_zh-TW.md 走一遍:該用什麼順序做、每一步之後要看什麼,以及每種失敗最可能代表什麼。
Troubleshooting 疑難排解
Every message carries a [type:storeid] prefix, so one storage can be grepped out of a busy journal. 每一則訊息都帶有 [type:storeid] 前置字串,可以從繁忙的 journal 中過濾出單一儲存。
journalctl -t pvestatd -t pvedaemon | grep dellpowerstore
| Symptom症狀 | Most likely cause最可能的原因 |
|---|---|
Parameter verification failed (400) |
The package is not installed on that node. Install it everywhere. 該節點沒有安裝套件。請在每台節點安裝。 |
Storage shows inactive儲存顯示 inactive |
Credentials, the management network, or a slow array. If other storages went inactive at the same time, suspect this one was slow — PVE polls sequentially. 帳密、管理網路,或儲存伺服器太慢。若其他儲存同時變 inactive,請懷疑是這個儲存慢 —— PVE 是依序輪詢的。 |
| New disks stop appearing新磁碟掃不到 | On PowerStore, the REST-side LUN id sequence climbing past what the host scans. The plugin assigns LUN ids itself to avoid it. 在 PowerStore 上,是 REST 端的 LUN ID 序列爬過主機掃描範圍。外掛改為自行配發 LUN ID 以迴避。 |
| Cannot delete: device still in use無法刪除:裝置仍在使用中 | Usually host LVM having auto-activated a volume group that lives inside a guest disk. Deactivate it and add an LVM global_filter. 通常是主機端 LVM 自動啟用了客體磁碟內部的 volume group。請停用它並設定 LVM global_filter。 |
| Processes stuck in D state行程卡在 D state | Queued I/O to a device with no working path. Check for no_path_retry queue, then restart multipathd. 對沒有可用路徑的裝置持續排隊 I/O。請檢查 no_path_retry queue,然後 restart multipathd。 |
Full guide: docs/TROUBLESHOOTING.md. 完整指南:docs/TROUBLESHOOTING_zh-TW.md。
Changelog 變更紀錄
陣列 — 463 occurrences across every Chinese document, and a test that keeps it that way.
中文一律以「儲存伺服器」稱呼 array,不再使用 陣列 — 全部中文文件共 463 處,並由測試維持。
Full changelog: CHANGELOG.md. 完整變更紀錄:CHANGELOG_zh-TW.md。
Acknowledgments 致謝
The host-side layer — device discovery, multipath handling, the anti-hang rules and the orphan reaper — is carried over from two related projects, where those lessons were paid for in production: 主機端底層 —— 裝置探索、multipath 處理、防止卡死的規則與 orphan 清理 —— 承接自兩個相關專案,那些教訓是在正式環境付出代價換來的:
In the absence of hardware, this plugin was written against Dell's published documentation: the PowerStore REST guide, the PowerVault ME5 CLI Reference Guide, and the PowerFlex REST and SDC material. 在沒有實機的情況下,本外掛是依據 Dell 公開的文件撰寫的:PowerStore REST 指南、PowerVault ME5 CLI Reference Guide,以及 PowerFlex 的 REST 與 SDC 資料。