Blockstor is a Kubernetes control plane for LVM and ZFS storage with DRBD replication. It speaks a LINSTOR-compatible REST API, so the clients you already use — linstor-csi, piraeus-operator, ha-controller, golinstor, the linstor CLI — keep working unchanged.
The difference is what's underneath. Instead of a central controller with its own database and synchronous RPC to every node, blockstor is built the way Kubernetes operators are built: the desired state lives in CRDs, and a set of controller-runtime reconcilers drive the cluster toward it. There is no external database to back up, no in-memory state to lose on restart, and no controller→node polling to fall behind.
controller-runtime managers with watch-based informers, declarative reconcile loops, and Status SSA. No synchronous fan-out RPC, no central in-memory state, no per-request controller→node polling. Desired/observed convergence is automatic.Resource, ResourceDefinition, ResourceGroup, StoragePool, Snapshot, Node, PhysicalDevice are designed to be read and (where appropriate) written by other operators: cozystack tenant operators, GitOps tooling, custom monitoring/alerting, admission webhooks. Schemas carry kubebuilder enum/min/max validation; multi-writer Status uses Server-Side Apply field managers.Spec.NodeName) and writes observed state back via Status SSA directly. No gRPC dispatch from a central controller.linux/amd64, linux/arm64) and cross-compile cleanly, so blockstor fits on edge and small ARM nodes where a multi-hundred-megabyte Java runtime would not.What works today:
zfs send/recv, thin-send-recv) for clone / add-replicaphysical-storage create-device-pool)Not implemented — the API answers these with 501 Not Implemented:
On the roadmap:
qemu-storage-daemon, for shared-SAN KubernetesBlockstor installs onto an existing cluster and is driven with the standard linstor client and piraeus linstor-csi. The full walkthrough — installing the control plane, registering nodes and pools, and wiring up CSI — lives in docs/usage.md.
The three images are published to GHCR on every release:
ghcr.io/cozystack/blockstor-controller — the reconcilersghcr.io/cozystack/blockstor-apiserver — the LINSTOR-compatible REST API (mTLS)ghcr.io/cozystack/blockstor-satellite — the per-node DRBD / storage agentdocs/usage.md — install and operate blockstor with the linstor client + piraeus/linstor-csi.docs/architecture.md — the load-bearing design decisions.docs/layer-stack.md — DRBD / LUKS / STORAGE compositions.AGENTS.md — repository layout and the local Talos+QEMU dev stand, for contributors.Blockstor was inspired by LINBIT's LINSTOR, and it operates DRBD to provide block-level replication. It deliberately speaks LINSTOR's API so that the rich ecosystem the LINSTOR community has built keeps working unchanged. Heartfelt thanks to LINBIT and to the wider DRBD / LINSTOR / Piraeus community.
Blockstor is licensed under Apache 2.0. The code is provided as-is with no warranties.
Third-party Go modules and their licenses are catalogued in THIRD_PARTY_LICENSES.md; the runtime dependency graph is constrained to an Apache-2.0–compatible allowlist (Apache-2.0, BSD-2-Clause, BSD-3-Clause, MIT, MPL-2.0, ISC) by the license-scan CI gate in .github/workflows/license-check.yml. For interoperability with LINSTOR clients, type definitions are sourced from the Apache-2.0 golinstor library; blockstor does not copy or generate code from upstream LINSTOR (GPL) sources.
LINSTOR, LINBIT, and DRBD are trademarks or registered trademarks of LINBIT. Blockstor is an independent project and is not affiliated with, endorsed by, or sponsored by LINBIT.
$ claude mcp add blockstor \
-- python -m otcore.mcp_server <graph>