The backend catalogue a supervisor can install from — software-defined, arrays and NFS — which one a workload wants and why, where install and day-2 state live, and the triage order for a Pending PVC.
Celum installs and operates storage per supervisor from a catalogue of backends, grouped into three families on the onboarding wizard’s Storage step. Each reports day-2 state through the platform’s component-status model, and each ends the same way: one or more StorageClasses that every downstream consumer — tenant clusters, VMs, the Image Library, monitoring — provisions against.
Family
What it is
Examples
Software-defined
Storage built from disks the supervisor’s own nodes see — local NVMe, SAN LUNs, or both
LINSTOR (with or without DRBD replication), Rook-Ceph, TopoLVM, Longhorn
Arrays
A vendor CSI driver carving volumes on an external array
Picking a family narrows the list; picking a backend renders that backend’s own parameters, including a disk picker where it consumes raw devices. Serving storage now, above the family tabs, lists what is already installed and the classes it provisions — the answer to “is there working storage here” without reading any panel below it.They are not exclusive. A supervisor commonly runs one software-defined backend as its default and adds NFS for bulk file storage.
Some catalogue rows are marked preview: their coordinates are verified — provisioner, chart, pinned version — but nothing has installed them through this platform yet, so the install refuses with that reason rather than pretending. Install one by hand once, confirm it, and the row stops being preview.
The families narrow it; the workload decides it. The figures behind these steps come from one benchmark recipe run in VMs and pods on two supervisors and on vSphere — see Storage performance for the tables and their caveats.
1
Local disks in the nodes — a software-defined backend
The default path. Replicated block storage with snapshots and fast CSI clones, no external dependency. This is what the Image Library’s ~seconds golden-image cloning and VM live migration are built on.LINSTOR and Rook-Ceph both do this, and Ceph offers self-healing, scrubbing and redundancy that does not depend on an array — a real trade, not a ranking.Replication needs enterprise NVMe with power-loss protection. A replicated write is acknowledged only once it is on stable storage on every copy. On enterprise drives that measured on par with a Fibre Channel array inside VMs; on consumer drives the same benchmark wrote at about 1/50 of that, with a 30 ms write p99.
2
An array behind the nodes — give it to a software-defined backend as a shared LUN
Rather than a volume-per-PVC vendor driver, the shipped pattern is one large LUN masked to every node, consumed by the software-defined backend. The array’s API stays out of the runtime path, so provisioning is a local operation rather than a REST call, and a path failure is absorbed by multipath.
3
Synchronous-commit workloads — enterprise drives or the array
This is the decision people get backwards. A consumer NVMe without power-loss protection must land every flushed write in flash before acknowledging it, so etcd, database commit logs and anything that fsyncs and waits must never sit on replicated consumer drives. On enterprise drives with power-loss protection, replicated local storage is a full alternative: inside a VM its write p99 measured lower than the array’s. In a pod, where the path is shorter, the array’s cache takes writes faster.
4
Read-heavy datasets — either class
Replicated local storage serves reads from the local copy, so reads do not pay for replication. Inside VMs the local class read somewhat faster than the array, in pods somewhat slower — close enough that capacity and placement, not read speed, should decide. Image stores, caches and read-mostly datasets can go on either.
5
Array-native data services required — a vendor driver
When a volume must be a first-class array object (one LDEV per PVC, array-side thin provisioning and snapshots), install the vendor’s driver from the Arrays family. Expect array-API latency in the provisioning path and, on Fibre Channel, a hard multipath prerequisite on the nodes.
6
Existing NAS, file semantics — NFS
Simplest to stand up: server + export path, one StorageClass, a built-in test-PVC smoke check. Filesystem-mode only — fine for shared data, the slow path for VM images.
Leave the default StorageClass unset unless you mean it. With this spread between classes, a claim that names no class is a placement decision nobody made — and the platform gates the choice to exactly one class per backend for the same reason.
Install and reconfigure happen on the wizard’s Storage step — one panel over the whole catalogue, with a chart release panel and the selected backend’s own forms. Re-opening the step hydrates those forms from the live release on the supervisor, so a re-apply expresses deltas rather than re-entering a configuration the cluster already holds.
The snapshot controller arrives with the first backend, whichever it is, because every row in the catalogue declares snapshot support and a snapshot class written before its CRDs exist fails in a way that reads as a broken backend. See PVCs & snapshots.
Day-2 status is the same status model as every other component: exists / ready / revision / conditions with the chart controller’s reason and message. The supervisor’s Storage tab renders a panel per installed backend — LINSTOR’s network, replication and listeners, NFS’s route to the server, Ceph’s cluster health — plus a reachability check that sends real packets from the host and pod networks.
Disk inventory — every node’s block devices with model, size, transport (nvme / sata / fc / usb) and a lifecycle state — feeds the Rook disk picker and the Infrastructure page’s SAN LUN panel, where FC LUNs group by WWID with their multipath path counts.
The disk inventory comes from Omni, and its absence looks like an absence of disks. With Omni disabled or unreachable the endpoint answers 200 with an empty machine list and a source of omni-disabled or omni-error. On screen that is an empty disk table — indistinguishable from a supervisor whose nodes have nothing free — and Rook cannot be installed through the wizard at all. The source field is the only thing that separates the two, so read it before concluding there are no disks.
Classes & profiles list every StorageClass and its CDI StorageProfile — the clone strategy and access-mode/volume-mode combinations that decide VM cloning speed and live-migration eligibility.
PVCs & snapshots browse actual claims and volume snapshots per namespace.
The in-product assistant, Celum AI, answers storage questions from these same APIs — “which class should this VM use?” or “why is Ceph degraded?” reads the identical status, class, profile, disk, and PVC data the panels render.
A Pending claim is the universal storage symptom. Work top-down:
1
Read the claim's events
The test-PVC diagnostic provisions a throwaway claim against any class and returns the PVC events on failure — the provisioner’s own error, without kubectl.
2
Does the class exist, and is its provisioner running?
Check the backend’s status panel. A deleted NFS driver leaves orphan StorageClasses that look valid but can never bind; a Ceph cluster can be healthy while the CSI provisioner is absent.
3
Can the class satisfy what was requested?
ReadWriteMany on a class whose profile only claims ReadWriteOnce, or Block mode on file-backed storage, pends forever. The profiles table shows what each class actually supports.
4
Is the backend itself healthy?
Ceph health warnings (OSDs down, degraded PGs), an unreachable NFS server, or a misconfigured FC port list all surface in the respective status — see the per-backend pages for their failure signatures.
Result: either a bound claim, or one specific cause. The order matters because each step rules out a whole class: a claim that binds under the test PVC moves the question to the workload, and a class the profile cannot satisfy will never bind however healthy the backend is.The full checklist with per-cause signatures lives in PVCs & snapshots.
All storage backend operations map to the storage action family, scoped to krn:celum:supervisor:<supervisor>:storage:*:
Task
Action
Read backend status, classes, profiles, the Storage tab and the last reachability check
storage:GetStatus
Read the disk inventory
storage:Discover
Install a backend, wipe disks, recover a stuck rollback
storage:InstallDriver
Create or update an NFS StorageClass
storage:ApplyStorageClass
Delete an orphan NFS StorageClass
storage:DeleteStorageClass
Run a test PVC, run the reachability check
storage:Test
“Recover a stuck rollback” does not roll anything back. It detects a HelmRelease caught in a Flux rollback loop and forces it forward. It is idempotent and safe to press on a healthy cluster, where it reports matched: false and does nothing — but it will never take a backend back off. Removing a storage backend is a manual operation.
Ceph cluster health reads use ceph:GetStatus on krn:celum:supervisor:<supervisor>:ceph:*. The snapshot controller and the namespace-scoped PVC/snapshot listings have their own families — see the per-page tables.
What a supervisor’s storage is doing right now — per backend — and a check that sends packets to prove it.
LINSTOR
Replicated local disks and a shared array LUN from one backend — which class a workload wants, and why.
Storage performance
One benchmark across replicated NVMe, a Fibre Channel array and vSAN — in VMs and pods — and why consumer drives are excluded from replication.
Rook-Ceph
Local-disk and SAN-LUN installs, the disk picker and wipe flow, Ceph health, and rollback recovery.
NFS & Fibre Channel
The external backends — NFS driver and storage classes, and Fibre Channel array LUNs under LINSTOR or Ceph.
Classes & profiles
StorageClasses, CDI StorageProfiles, and which class to give VMs and golden images.
PVCs & snapshots
The per-namespace claim browser, volume snapshots, the snapshot controller, and the Pending checklist.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Celum","description":"Operator documentation for Celum — the multi-supervisor Kubernetes management platform.","colors":{"primary":"#4F46E5"},"logo":{"light":"https://mintcdn.com/celum-e0119be0/NF4EBzT06mCbloJe/images/icon-64.png?fit=max\u0026auto=format\u0026n=NF4EBzT06mCbloJe\u0026q=85\u0026s=5cc0f1352d4722abcd86fa910254326e","dark":"https://mintcdn.com/celum-e0119be0/NF4EBzT06mCbloJe/images/icon-64.png?fit=max\u0026auto=format\u0026n=NF4EBzT06mCbloJe\u0026q=85\u0026s=5cc0f1352d4722abcd86fa910254326e"},"favicon":{"light":"https://mintcdn.com/celum-e0119be0/ACqXS6nCknlRGpPb/favicon.svg?fit=max\u0026auto=format\u0026n=ACqXS6nCknlRGpPb\u0026q=85\u0026s=4b83e2c8a80a7dfa346ea4703904d309","dark":"https://mintcdn.com/celum-e0119be0/ACqXS6nCknlRGpPb/favicon.svg?fit=max\u0026auto=format\u0026n=ACqXS6nCknlRGpPb\u0026q=85\u0026s=4b83e2c8a80a7dfa346ea4703904d309"},"navbar":{"links":[]},"icons":{"library":"fontawesome"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"celum-e0119be0","hasAudioNarration":false,"actualSubdomain":"celum-e0119be0","customDomains":["docs.celum.io"],"gitSource":{"type":"github","owner":"celum-dev","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aecba45759a071fd76fb012","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"default","tag":"API Reference","count":678},{"language":"default","tag":"networking","count":112},{"language":"default","tag":"security","count":91},{"language":"default","tag":"capi","count":83},{"language":"default","tag":"Documentation","count":79},{"language":"default","tag":"platform-settings","count":66},{"language":"default","tag":"vms","count":62},{"language":"default","tag":"storage","count":36},{"language":"default","tag":"projects","count":35},{"language":"default","tag":"iam","count":34}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"svg[id^=\"mermaid\"] .node rect,svg[id^=\"mermaid\"] .node polygon,svg[id^=\"mermaid\"] .node path{fill:rgb(var(--background-light))!important;stroke:rgb(var(--gray-200))!important;stroke-width:1px!important;rx:7.2px;ry:7.2px}svg[id^=\"mermaid\"] .cluster rect{fill:rgb(var(--gray-50))!important;stroke:rgb(var(--gray-200))!important;rx:10.08px;ry:10.08px}svg[id^=\"mermaid\"] .nodeLabel,svg[id^=\"mermaid\"] .edgeLabel,svg[id^=\"mermaid\"] span,svg[id^=\"mermaid\"] p{color:rgb(var(--gray-800))!important;font-size:13px!important}svg[id^=\"mermaid\"] .cluster-label,svg[id^=\"mermaid\"] .cluster span{color:rgb(var(--gray-500))!important;font-size:11px!important;letter-spacing:0.04em;text-transform:uppercase}svg[id^=\"mermaid\"] .edgePath path,svg[id^=\"mermaid\"] path.flowchart-link{stroke:rgb(var(--gray-400))!important;stroke-width:1.25px!important}svg[id^=\"mermaid\"] marker path,svg[id^=\"mermaid\"] .marker{fill:rgb(var(--gray-400))!important;stroke:rgb(var(--gray-400))!important}svg[id^=\"mermaid\"] .edgeLabel rect,svg[id^=\"mermaid\"] .edgeLabel foreignObject div{background:rgb(var(--background-light))!important;fill:rgb(var(--background-light))!important}.dark svg[id^=\"mermaid\"] .node rect,.dark svg[id^=\"mermaid\"] .node polygon,.dark svg[id^=\"mermaid\"] .node path{fill:rgb(var(--gray-900))!important;stroke:rgb(var(--gray-700))!important}.dark svg[id^=\"mermaid\"] .cluster rect{fill:rgb(var(--gray-950))!important;stroke:rgb(var(--gray-800))!important}.dark svg[id^=\"mermaid\"] .nodeLabel,.dark svg[id^=\"mermaid\"] .edgeLabel,.dark svg[id^=\"mermaid\"] span,.dark svg[id^=\"mermaid\"] p{color:rgb(var(--gray-100))!important}.dark svg[id^=\"mermaid\"] .cluster-label,.dark svg[id^=\"mermaid\"] .cluster span{color:rgb(var(--gray-400))!important}.dark svg[id^=\"mermaid\"] .edgePath path,.dark svg[id^=\"mermaid\"] path.flowchart-link{stroke:rgb(var(--gray-500))!important}.dark svg[id^=\"mermaid\"] marker path,.dark svg[id^=\"mermaid\"] .marker{fill:rgb(var(--gray-500))!important;stroke:rgb(var(--gray-500))!important}.dark svg[id^=\"mermaid\"] .edgeLabel rect,.dark svg[id^=\"mermaid\"] .edgeLabel foreignObject div{background:rgb(var(--gray-950))!important;fill:rgb(var(--gray-950))!important}"}],"page":{"pagePath":"storage/overview","slug":"/storage/overview","pageMetadata":{"title":"Storage overview","description":"The backend catalogue a supervisor can install from — software-defined, arrays and NFS — which one a workload wants and why, where install and day-2 state live, and the triage order for a Pending PVC.","icon":"hard-drive","href":"/storage/overview"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"The backend catalogue a supervisor can install from — software-defined, arrays and NFS — which one a workload wants and why, where install and day-2 state live, and the triage order for a Pending PVC.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Card,CardGroup,Heading,Mermaid,Note,Step,Steps,Table,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Celum installs and operates storage per supervisor from a `,_jsx(_components.strong,{children:`catalogue of backends`}),`, grouped into three families on the onboarding wizard’s `,_jsx(_components.strong,{children:`Storage`}),` step. Each reports day-2 state through the platform’s `,_jsx(_components.a,{href:`/platform-health/overview`,children:`component-status model`}),`, and each ends the same way: one or more `,_jsx(_components.strong,{children:`StorageClasses`}),` that every downstream consumer — tenant clusters, VMs, the Image Library, monitoring — provisions against.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Family`}),_jsx(_components.th,{children:`What it is`}),_jsx(_components.th,{children:`Examples`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Software-defined`})}),_jsx(_components.td,{children:`Storage built from disks the supervisor’s own nodes see — local NVMe, SAN LUNs, or both`}),_jsx(_components.td,{children:`LINSTOR (with or without DRBD replication), Rook-Ceph, TopoLVM, Longhorn`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Arrays`})}),_jsx(_components.td,{children:`A vendor CSI driver carving volumes on an external array`}),_jsx(_components.td,{children:`HPE Alletra, Dell PowerStore/PowerFlex/Unity, NetApp Trident`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`NFS`})}),_jsx(_components.td,{children:`A CSI NFS driver pointed at an external export`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`csi-driver-nfs`}),`, democratic-csi against TrueNAS`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Picking a family narrows the list; picking a backend renders that backend’s own parameters, including a disk picker where it consumes raw devices. `,_jsx(_components.strong,{children:`Serving storage now`}),`, above the family tabs, lists what is already installed and the classes it provisions — the answer to “is there working storage here” without reading any panel below it.`]}),`\n`,_jsx(_components.p,{children:`They are not exclusive. A supervisor commonly runs one software-defined backend as its default and adds NFS for bulk file storage.`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Some catalogue rows are marked `,_jsx(_components.strong,{children:`preview`}),`: their coordinates are verified — provisioner, chart, pinned version — but nothing has installed them through this platform yet, so the install refuses with that reason rather than pretending. Install one by hand once, confirm it, and the row stops being preview.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`choosing-a-backend`,children:`Choosing a backend`}),`\n`,_jsxs(_components.p,{children:[`The families narrow it; the workload decides it. The figures behind these steps come from one benchmark recipe run in VMs and pods on two supervisors and on vSphere — see `,_jsx(_components.a,{href:`/storage/performance`,children:`Storage performance`}),` for the tables and their caveats.`]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Local disks in the nodes — a software-defined backend`,children:[_jsx(_components.p,{children:`The default path. Replicated block storage with snapshots and fast CSI clones, no external dependency. This is what the Image Library’s ~seconds golden-image cloning and VM live migration are built on.`}),_jsx(_components.p,{children:`LINSTOR and Rook-Ceph both do this, and Ceph offers self-healing, scrubbing and redundancy that does not depend on an array — a real trade, not a ranking.`}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Replication needs enterprise NVMe with power-loss protection.`}),` A replicated write is acknowledged only once it is on stable storage on every copy. On enterprise drives that measured on par with a Fibre Channel array inside VMs; on consumer drives the same benchmark wrote at about 1/50 of that, with a 30 ms write p99.`]})]}),_jsx(Step,{title:`An array behind the nodes — give it to a software-defined backend as a shared LUN`,children:_jsx(_components.p,{children:`Rather than a volume-per-PVC vendor driver, the shipped pattern is one large LUN masked to every node, consumed by the software-defined backend. The array’s API stays out of the runtime path, so provisioning is a local operation rather than a REST call, and a path failure is absorbed by multipath.`})}),_jsx(Step,{title:`Synchronous-commit workloads — enterprise drives or the array`,children:_jsx(_components.p,{children:`This is the decision people get backwards. A consumer NVMe without power-loss protection must land every flushed write in flash before acknowledging it, so etcd, database commit logs and anything that fsyncs and waits must never sit on replicated consumer drives. On enterprise drives with power-loss protection, replicated local storage is a full alternative: inside a VM its write p99 measured lower than the array’s. In a pod, where the path is shorter, the array’s cache takes writes faster.`})}),_jsx(Step,{title:`Read-heavy datasets — either class`,children:_jsx(_components.p,{children:`Replicated local storage serves reads from the local copy, so reads do not pay for replication. Inside VMs the local class read somewhat faster than the array, in pods somewhat slower — close enough that capacity and placement, not read speed, should decide. Image stores, caches and read-mostly datasets can go on either.`})}),_jsx(Step,{title:`Array-native data services required — a vendor driver`,children:_jsxs(_components.p,{children:[`When a volume must be a first-class array object (one LDEV per PVC, array-side thin provisioning and snapshots), install the vendor’s driver from the `,_jsx(_components.strong,{children:`Arrays`}),` family. Expect array-API latency in the provisioning path and, on Fibre Channel, a hard multipath prerequisite on the nodes.`]})}),_jsx(Step,{title:`Existing NAS, file semantics — NFS`,children:_jsx(_components.p,{children:`Simplest to stand up: server + export path, one StorageClass, a built-in test-PVC smoke check. Filesystem-mode only — fine for shared data, the slow path for VM images.`})})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Leave the default StorageClass unset unless you mean it.`}),` With this spread between classes, a claim that names no class is a placement decision nobody made — and the platform gates the choice to exactly one class per backend for the same reason.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`what-lives-where`,children:`What lives where`}),`\n`,_jsx(Mermaid,{chart:`flowchart LR\n W[Onboarding wizard\u003cbr/>Storage step] -->|install + configure| B[Backend catalogue\u003cbr/>SDS · Arrays · NFS]\n B -->|HelmRelease conditions| S[Status endpoints\u003cbr/>day-2 panels]\n B --> SN[Snapshot controller\u003cbr/>+ VolumeSnapshotClasses]\n B --> SC[StorageClasses +\u003cbr/>CDI StorageProfiles]\n SC --> C[VM disks · Image Library ·\u003cbr/>tenant clusters · monitoring PVCs]`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Install and reconfigure`}),` happen on the wizard’s Storage step — one panel over the whole catalogue, with a `,_jsx(_components.a,{href:`/platform-health/overview#where-statuses-surface`,children:`chart release panel`}),` and the selected backend’s own forms. Re-opening the step hydrates those forms from the live release on the supervisor, so a re-apply expresses deltas rather than re-entering a configuration the cluster already holds.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`The snapshot controller arrives with the first backend`}),`, whichever it is, because every row in the catalogue declares snapshot support and a snapshot class written before its CRDs exist fails in a way that reads as a broken backend. See `,_jsx(_components.a,{href:`/storage/pvcs-and-snapshots#the-snapshot-controller`,children:`PVCs \u0026 snapshots`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Day-2 status`}),` is the same status model as every other component: `,_jsx(_components.code,{children:`exists`}),` / `,_jsx(_components.code,{children:`ready`}),` / `,_jsx(_components.code,{children:`revision`}),` / conditions with the chart controller’s reason and message. The supervisor’s `,_jsx(_components.a,{href:`/storage/storage-tab`,children:`Storage tab`}),` renders a panel per installed backend — LINSTOR’s network, replication and listeners, NFS’s route to the server, Ceph’s cluster health — plus a reachability check that sends real packets from the host and pod networks.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Disk inventory`}),` — every node’s block devices with model, size, transport (`,_jsx(_components.code,{children:`nvme`}),` / `,_jsx(_components.code,{children:`sata`}),` / `,_jsx(_components.code,{children:`fc`}),` / `,_jsx(_components.code,{children:`usb`}),`) and a lifecycle state — feeds the Rook disk picker and the Infrastructure page’s `,_jsx(_components.a,{href:`/platform-health/infrastructure`,children:`SAN LUN panel`}),`, where FC LUNs group by WWID with their multipath path counts.`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The disk inventory comes from Omni, and its absence looks like an absence of disks.`}),` With Omni disabled or unreachable the endpoint answers `,_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`200`}),` with an empty machine list`]}),` and a `,_jsx(_components.code,{children:`source`}),` of `,_jsx(_components.code,{children:`omni-disabled`}),` or `,_jsx(_components.code,{children:`omni-error`}),`. On screen that is an empty disk table — indistinguishable from a supervisor whose nodes have nothing free — and Rook cannot be installed through the wizard at all. The `,_jsx(_components.code,{children:`source`}),` field is the only thing that separates the two, so read it before concluding there are no disks.`]})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/storage/classes-and-profiles`,children:_jsx(_components.strong,{children:`Classes \u0026 profiles`})}),` list every StorageClass and its CDI StorageProfile — the clone strategy and access-mode/volume-mode combinations that decide VM cloning speed and live-migration eligibility.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/storage/pvcs-and-snapshots`,children:_jsx(_components.strong,{children:`PVCs \u0026 snapshots`})}),` browse actual claims and volume snapshots per namespace.`]}),`\n`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`The in-product assistant, `,_jsx(_components.strong,{children:`Celum AI`}),`, answers storage questions from these same APIs — “which class should this VM use?” or “why is Ceph degraded?” reads the identical status, class, profile, disk, and PVC data the panels render.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`pvc-pending-—-the-triage-order`,children:`PVC Pending — the triage order`}),`\n`,_jsx(_components.p,{children:`A Pending claim is the universal storage symptom. Work top-down:`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Read the claim's events`,children:_jsxs(_components.p,{children:[`The `,_jsx(_components.a,{href:`/storage/classes-and-profiles#the-test-pvc-diagnostic`,children:`test-PVC diagnostic`}),` provisions a throwaway claim against any class and returns the PVC events on failure — the provisioner’s own error, without `,_jsx(_components.code,{children:`kubectl`}),`.`]})}),_jsx(Step,{title:`Does the class exist, and is its provisioner running?`,children:_jsxs(_components.p,{children:[`Check the backend’s status panel. A deleted NFS driver leaves `,_jsx(_components.strong,{children:`orphan`}),` StorageClasses that look valid but can never bind; a Ceph cluster can be healthy while the CSI provisioner is absent.`]})}),_jsx(Step,{title:`Can the class satisfy what was requested?`,children:_jsxs(_components.p,{children:[`ReadWriteMany on a class whose profile only claims ReadWriteOnce, or Block mode on file-backed storage, pends forever. The `,_jsx(_components.a,{href:`/storage/classes-and-profiles`,children:`profiles table`}),` shows what each class actually supports.`]})}),_jsx(Step,{title:`Is the backend itself healthy?`,children:_jsx(_components.p,{children:`Ceph health warnings (OSDs down, degraded PGs), an unreachable NFS server, or a misconfigured FC port list all surface in the respective status — see the per-backend pages for their failure signatures.`})})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Result:`}),` either a bound claim, or one specific cause. The order matters because each step rules out a whole class: a claim that binds under the test PVC moves the question to the workload, and a class the profile cannot satisfy will never bind however healthy the backend is.`]}),`\n`,_jsxs(_components.p,{children:[`The full checklist with per-cause signatures lives in `,_jsx(_components.a,{href:`/storage/pvcs-and-snapshots#pvc-pending--the-checklist`,children:`PVCs \u0026 snapshots`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`permissions`,children:`Permissions`}),`\n`,_jsxs(_components.p,{children:[`All storage backend operations map to the `,_jsx(_components.code,{children:`storage`}),` action family, scoped to `,_jsx(_components.code,{children:`krn:celum:supervisor:\u003csupervisor>:storage:*`}),`:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Task`}),_jsx(_components.th,{children:`Action`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Read backend status, classes, profiles, the Storage tab and the last reachability check`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`storage:GetStatus`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Read the disk inventory`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`storage:Discover`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Install a backend, wipe disks, recover a stuck rollback`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`storage:InstallDriver`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Create or update an NFS StorageClass`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`storage:ApplyStorageClass`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Delete an orphan NFS StorageClass`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`storage:DeleteStorageClass`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Run a test PVC, run the reachability check`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`storage:Test`})})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`“Recover a stuck rollback” does not roll anything back.`}),` It detects a HelmRelease caught in a Flux rollback loop and forces it `,_jsx(_components.em,{children:`forward`}),`. It is idempotent and safe to press on a healthy cluster, where it reports `,_jsx(_components.code,{children:`matched: false`}),` and does nothing — but it will never take a backend back off. Removing a storage backend is a manual operation.`]})}),`\n`,_jsxs(_components.p,{children:[`Ceph cluster health reads use `,_jsx(_components.code,{children:`ceph:GetStatus`}),` on `,_jsx(_components.code,{children:`krn:celum:supervisor:\u003csupervisor>:ceph:*`}),`. The snapshot controller and the namespace-scoped PVC/snapshot listings have their own families — see the per-page tables.`]}),`\n`,_jsx(Heading,{level:`2`,id:`the-storage-pages`,children:`The Storage pages`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`The Storage tab`,icon:`stethoscope`,href:`/storage/storage-tab`,children:_jsx(_components.p,{children:`What a supervisor’s storage is doing right now — per backend — and a check that sends packets to prove it.`})}),_jsx(Card,{title:`LINSTOR`,icon:`layer-group`,href:`/storage/linstor`,children:_jsx(_components.p,{children:`Replicated local disks and a shared array LUN from one backend — which class a workload wants, and why.`})}),_jsx(Card,{title:`Storage performance`,icon:`gauge-high`,href:`/storage/performance`,children:_jsx(_components.p,{children:`One benchmark across replicated NVMe, a Fibre Channel array and vSAN — in VMs and pods — and why consumer drives are excluded from replication.`})}),_jsx(Card,{title:`Rook-Ceph`,icon:`database`,href:`/storage/rook-ceph`,children:_jsx(_components.p,{children:`Local-disk and SAN-LUN installs, the disk picker and wipe flow, Ceph health, and rollback recovery.`})}),_jsx(Card,{title:`NFS \u0026 Fibre Channel`,icon:`plug`,href:`/storage/nfs-and-fibre-channel`,children:_jsx(_components.p,{children:`The external backends — NFS driver and storage classes, and Fibre Channel array LUNs under LINSTOR or Ceph.`})}),_jsx(Card,{title:`Classes \u0026 profiles`,icon:`layer-group`,href:`/storage/classes-and-profiles`,children:_jsx(_components.p,{children:`StorageClasses, CDI StorageProfiles, and which class to give VMs and golden images.`})}),_jsx(Card,{title:`PVCs \u0026 snapshots`,icon:`box-archive`,href:`/storage/pvcs-and-snapshots`,children:_jsx(_components.p,{children:`The per-namespace claim browser, volume snapshots, the snapshot controller, and the Pending checklist.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Storage overview","description":"The backend catalogue a supervisor can install from — software-defined, arrays and NFS — which one a workload wants and why, where install and day-2 state live, and the triage order for a Pending PVC.","icon":"hard-drive","href":"/storage/overview"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Choosing a backend","slug":"choosing-a-backend","depth":2,"children":[]},{"title":"What lives where","slug":"what-lives-where","depth":2,"children":[]},{"title":"PVC Pending — the triage order","slug":"pvc-pending-—-the-triage-order","depth":2,"children":[]},{"title":"Permissions","slug":"permissions","depth":2,"children":[]},{"title":"The Storage pages","slug":"the-storage-pages","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"celum-e0119be0","siteName":"Celum","title":"Storage overview - Celum","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-01T19:25:08.037Z","originalFileLocation":"storage/overview.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"The backend catalogue a supervisor can install from — software-defined, arrays and NFS — which one a workload wants and why, where install and day-2 state live, and the triage order for a Pending PVC.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Celum\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/celum-e0119be0/8ykZiPODj77OBFTN/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/celum-e0119be0/8ykZiPODj77OBFTN/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/celum-e0119be0/8ykZiPODj77OBFTN/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/celum-e0119be0/8ykZiPODj77OBFTN/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/celum-e0119be0/8ykZiPODj77OBFTN/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/celum-e0119be0/8ykZiPODj77OBFTN/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/celum-e0119be0/8ykZiPODj77OBFTN/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/celum-e0119be0/8ykZiPODj77OBFTN/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/celum-e0119be0/8ykZiPODj77OBFTN/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Storage overview - Celum\">\u003cmeta data-mint-head property=\"og:description\" content=\"The backend catalogue a supervisor can install from — software-defined, arrays and NFS — which one a workload wants and why, where install and day-2 state live, and the triage order for a Pending PVC.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Celum\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.celum.io/storage/overview\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://celum-e0119be0.mintlify.site/_mintlify/api/og/v2?division=Storage\u0026amp;title=Storage+overview\u0026amp;description=The+backend+catalogue+a+supervisor+can+install+from+%E2%80%94+software-defined%2C+arrays+and+NFS+%E2%80%94+which+one+a+workload+wants+and+why%2C+where+install+and+day-2+state+live%2C\u0026amp;theme=b18dc9aec4cff6709b68009f\u0026amp;signature=185c8d316cee9b2e58475459220212767547b54ffeeefaa69606bf3b29f2c3ef\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Storage overview - Celum\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The backend catalogue a supervisor can install from — software-defined, arrays and NFS — which one a workload wants and why, where install and day-2 state live, and the triage order for a Pending PVC.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://celum-e0119be0.mintlify.site/_mintlify/api/og/v2?division=Storage\u0026amp;title=Storage+overview\u0026amp;description=The+backend+catalogue+a+supervisor+can+install+from+%E2%80%94+software-defined%2C+arrays+and+NFS+%E2%80%94+which+one+a+workload+wants+and+why%2C+where+install+and+day-2+state+live%2C\u0026amp;theme=b18dc9aec4cff6709b68009f\u0026amp;signature=185c8d316cee9b2e58475459220212767547b54ffeeefaa69606bf3b29f2c3ef\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/celum-e0119be0/8ykZiPODj77OBFTN/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Celum\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4F46E5\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.celum.io/storage/overview\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/storage/overview.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.celum.io/#organization\",\"name\":\"Celum\",\"url\":\"https://docs.celum.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/celum-e0119be0/NF4EBzT06mCbloJe/images/icon-64.png?fit=max\u0026auto=format\u0026n=NF4EBzT06mCbloJe\u0026q=85\u0026s=5cc0f1352d4722abcd86fa910254326e\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.celum.io#website\",\"name\":\"Celum\",\"url\":\"https://docs.celum.io\",\"publisher\":{\"@id\":\"https://docs.celum.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.celum.io/storage/overview#webpage\",\"url\":\"https://docs.celum.io/storage/overview\",\"name\":\"Storage overview\",\"description\":\"The backend catalogue a supervisor can install from — software-defined, arrays and NFS — which one a workload wants and why, where install and day-2 state live, and the triage order for a Pending PVC.\",\"dateModified\":\"2026-11-01T19:25:08.037Z\",\"isPartOf\":{\"@id\":\"https://docs.celum.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.celum.io/storage/overview#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.celum.io/storage/overview#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Celum\",\"item\":\"https://docs.celum.io\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Storage overview\",\"item\":\"https://docs.celum.io/storage/overview\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.celum.io/storage/overview#article\",\"headline\":\"Storage overview\",\"name\":\"Storage overview\",\"description\":\"The backend catalogue a supervisor can install from — software-defined, arrays and NFS — which one a workload wants and why, where install and day-2 state live, and the triage order for a Pending PVC.\",\"url\":\"https://docs.celum.io/storage/overview\",\"mainEntityOfPage\":{\"@id\":\"https://docs.celum.io/storage/overview#webpage\"},\"dateModified\":\"2026-11-01T19:25:08.037Z\",\"publisher\":{\"@id\":\"https://docs.celum.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.celum.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Celum\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Celum\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/storage/overview.md","siteName":"Celum","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Get Started","pages":[{"title":"Introduction","icon":"hand-wave","href":"/get-started/introduction"},{"title":"Deploy the appliance on vCenter","sidebarTitle":"Deploy the appliance","icon":"server","href":"/get-started/deploy-the-appliance"},{"title":"Quickstart","icon":"rocket","href":"/get-started/quickstart"},{"title":"Authentication \u0026 IAM","icon":"key","href":"/get-started/authentication"},{"title":"Register a supervisor","icon":"plug","href":"/get-started/register-a-supervisor"},{"title":"Platform onboarding","icon":"layer-group","href":"/get-started/platform-onboarding"},{"title":"Create a project","icon":"folder-tree","href":"/get-started/create-a-project"},{"title":"Run a VM","icon":"server","href":"/get-started/run-a-vm"},{"title":"Add a disk to a VM","icon":"hard-drive","href":"/get-started/add-a-disk"},{"title":"Publish it on a public name","icon":"globe","href":"/get-started/publish-it"},{"title":"Live-migrate a VM","icon":"shuffle","href":"/get-started/live-migrate"},{"title":"See what is talking to what","icon":"circle-nodes","href":"/get-started/see-the-traffic"},{"title":"Lock it down with a policy","icon":"file-shield","href":"/get-started/lock-it-down"},{"title":"Delegate to a team","icon":"users","href":"/get-started/delegate-to-a-team"}]},{"group":"Concepts","pages":[{"title":"Architecture","icon":"sitemap","href":"/concepts/architecture"},{"title":"Supervisors \u0026 clusters","icon":"layer-group","href":"/concepts/supervisors-and-clusters"},{"title":"Projects","icon":"folder-tree","href":"/concepts/projects"},{"title":"Permissions model","icon":"shield-halved","href":"/concepts/permissions-model"},{"title":"Celum AI and MCP","icon":"robot","href":"/concepts/celum-ai"}]},{"group":"Clusters","icon":"circle-nodes","pages":[{"title":"Clusters overview","icon":"circle-nodes","href":"/clusters/overview"},{"title":"Create a cluster","icon":"circle-plus","href":"/clusters/create"},{"title":"Cluster templates","icon":"copy","href":"/clusters/templates"},{"title":"Day-2 operations","icon":"gauge-high","href":"/clusters/day-2-operations"},{"title":"Hosted control planes","icon":"boxes-stacked","href":"/clusters/hosted-control-planes"},{"title":"Access \u0026 credentials","icon":"key","href":"/clusters/access-and-credentials"},{"title":"Troubleshooting clusters","icon":"bug","href":"/clusters/troubleshooting"}]},{"group":"GitOps \u0026 Apps","icon":"code-branch","pages":[{"title":"GitOps \u0026 Apps overview","icon":"code-branch","href":"/gitops/overview"},{"title":"App catalog","icon":"box-open","href":"/gitops/app-catalog"},{"title":"Repositories \u0026 manifests","icon":"code-commit","href":"/gitops/repositories-and-manifests"},{"title":"Charts \u0026 the mirror","icon":"magnifying-glass","href":"/gitops/charts"},{"title":"Registries","icon":"box","href":"/gitops/registries"},{"title":"Registry mirroring in depth","sidebarTitle":"Registry mirroring","icon":"copy","href":"/gitops/registry-mirroring"}]},{"group":"Virtual machines","icon":"server","pages":[{"title":"Image library","icon":"compact-disc","href":"/vms/image-library"},{"title":"Create a VM","icon":"circle-plus","href":"/vms/create"},{"title":"VM lifecycle","icon":"rotate","href":"/vms/lifecycle"},{"title":"VM networking","icon":"network-wired","href":"/vms/networking"},{"title":"VM storage \u0026 disks","icon":"hard-drive","href":"/vms/storage"},{"title":"Console \u0026 access","icon":"terminal","href":"/vms/console-and-access"},{"title":"Guest customisation templates","href":"/vms/guest-customisation-templates"},{"title":"Migrate VMs from vSphere","sidebarTitle":"Migrate from vSphere","icon":"truck","href":"/vms/migrate-from-vsphere"}]},{"group":"Networking","icon":"network-wired","pages":[{"title":"Networking overview","icon":"network-wired","href":"/networking/overview"},{"title":"Project networking","icon":"diagram-project","href":"/networking/project-networking"},{"title":"Pools \u0026 IPAM","icon":"chart-pie","href":"/networking/pools-and-ipam"},{"title":"VM identity pools","icon":"id-card","href":"/networking/vm-identity-pools"},{"title":"BGP \u0026 Egress","icon":"route","href":"/networking/bgp-and-egress"},{"title":"Gateways \u0026 Routes","icon":"globe","href":"/networking/gateways-and-routes"},{"title":"DNS","icon":"globe","href":"/networking/dns"}]},{"group":"Security","icon":"shield-halved","pages":[{"title":"Security overview","icon":"shield-halved","href":"/security/overview"},{"title":"Topology","icon":"circle-nodes","href":"/security/topology"},{"title":"Flow analytics","icon":"chart-simple","href":"/security/flow-analytics"},{"title":"Forensics","icon":"magnifying-glass-chart","href":"/security/forensics"},{"title":"Network policies","icon":"file-shield","href":"/security/policies"},{"title":"Pipeline \u0026 runtime","icon":"radio","href":"/security/pipeline-and-runtime"},{"title":"DNS views","icon":"radar","href":"/security/dns-views"},{"title":"PQC Readiness","icon":"atom","href":"/security/pqc-readiness"}]},{"group":"Platform Health","icon":"heart-pulse","pages":[{"title":"Platform health overview","icon":"heart-pulse","href":"/platform-health/overview"},{"title":"Supervisor overview","icon":"gauge","href":"/platform-health/supervisor-overview"},{"title":"Monitoring","icon":"chart-line","href":"/platform-health/monitoring"},{"title":"Certificates","icon":"lock","href":"/platform-health/certificates"},{"title":"Logs","icon":"file-lines","href":"/platform-health/logs"},{"title":"Flow telemetry","icon":"wave-square","href":"/platform-health/flow-telemetry"},{"title":"Infrastructure \u0026 nodes","icon":"server","href":"/platform-health/infrastructure"},{"title":"Slack notifications","description":"Post guest-cluster deletion approvals — with Approve/Reject buttons clicked in Slack — and cluster health alerts to a channel.","icon":"bell","href":"/platform-health/slack-notifications"}]},{"group":"Storage","icon":"hard-drive","pages":[{"title":"Storage overview","icon":"hard-drive","href":"/storage/overview"},{"title":"The Storage tab","description":"What a supervisor's Storage tab shows for LINSTOR, NFS, Ceph or any other CSI — including a reachability check that sends real packets from the host and pod networks — and how to read it.","icon":"stethoscope","href":"/storage/storage-tab"},{"title":"Storage performance","icon":"gauge-high","href":"/storage/performance"},{"title":"LINSTOR","icon":"layer-group","href":"/storage/linstor"},{"title":"Rook-Ceph","icon":"database","href":"/storage/rook-ceph"},{"title":"NFS \u0026 Fibre Channel","icon":"plug","href":"/storage/nfs-and-fibre-channel"},{"title":"Classes \u0026 profiles","icon":"layer-group","href":"/storage/classes-and-profiles"},{"title":"PVCs \u0026 snapshots","icon":"box-archive","href":"/storage/pvcs-and-snapshots"}]},{"group":"Reference","icon":"book","pages":[{"title":"Permissions","icon":"list-check","href":"/reference/permissions"},{"title":"Environment variables","icon":"sliders","href":"/reference/environment-variables"},{"title":"Appliance configuration","icon":"sliders","href":"/reference/appliance-configuration"},{"title":"Onboarding options","icon":"table-list","href":"/reference/onboarding-options"},{"title":"Glossary","icon":"book","href":"/reference/glossary"}]},{"group":"Administration","icon":"sliders","pages":[{"title":"Settings","href":"/administration/settings"},{"title":"Audit log","href":"/administration/audit-log"},{"title":"Deletion approvals","href":"/administration/deletion-approvals"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/ai-assistant/aichat"}]}]},"basePath":"","title":"Storage overview - Celum","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":[],"chunks":[]}