Hello everyone, I’m evaluating Linstor as the solution for running compute workloads with local disks while replicating it to a storage layer.
At this moment, I have 4 compute nodes and 1 storage node. Each compute node has 1 disk on LVM for VM creation, while the storage node runs on ZFS for long term persistence.
My goal is to have the compute nodes capable of accessing the storage locally, as well as ensure there is replication on the backup node for long term. Next I’d like to also include Backup routines to a object storage off-site in a cloud storage, which also means ensuring encryption is enabled on the disks.
Per my test so far, I’ve been able to create simple storage resources across the 2 drivers after allowing it to be mixed (AllowMixingStoragePoolDriver true). But I’m not being able to do it when LUKS get added, likely due to sector sizes/extend sizes or something mismatching.
So far, I’ve created 2 storage pools: backup with the ZFS_thin driver, and compute for the LVM_thin driver.
root@romulus:~# linstor storage-pool list -p
+-----------------------------------------------------------------------------------------------------------------------------------------------+
| StoragePool | Node | Driver | PoolName | FreeCapacity | TotalCapacity | CanSnapshots | State | SharedName |
|===============================================================================================================================================|
| DfltDisklessStorPool | omv | DISKLESS | | | | False | Ok | omv;DfltDisklessStorPool |
| DfltDisklessStorPool | romulus | DISKLESS | | | | False | Ok | romulus;DfltDisklessStorPool |
| DfltDisklessStorPool | rotterdam | DISKLESS | | | | False | Ok | rotterdam;DfltDisklessStorPool |
| DfltDisklessStorPool | ryzen | DISKLESS | | | | False | Ok | ryzen;DfltDisklessStorPool |
| DfltDisklessStorPool | tiny | DISKLESS | | | | False | Ok | tiny;DfltDisklessStorPool |
| backup | omv | ZFS_THIN | nas | 5.17 TiB | 7.27 TiB | True | Ok | omv;backup |
| compute | romulus | LVM_THIN | pve/data | 264.72 GiB | 348.82 GiB | True | Ok | romulus;compute |
| compute | rotterdam | LVM_THIN | pve/data | 348.61 GiB | 348.82 GiB | True | Ok | rotterdam;compute |
| compute | ryzen | LVM_THIN | pve/data | 1.60 TiB | 1.67 TiB | True | Ok | ryzen;compute |
| compute | tiny | LVM_THIN | pve/data | 319.97 GiB | 319.97 GiB | True | Ok | tiny;compute |
+-----------------------------------------------------------------------------------------------------------------------------------------------+
Next, I’ve created the resource group to use both storage pools:
linstor resource-group create nomad --storage-pool backup compute --place-count 2 -l DRBD,LUKS,STORAGE
linstor resource-group set-property nomad AllowMixingStoragePoolDriver true
LINSTOR ==> rg list -p
+---------------------------------------------------------------------------------+
| ResourceGroup | SelectFilter | VlmNrs | Description |
|=================================================================================|
| DfltRscGrp | PlaceCount: 2 | | |
|---------------------------------------------------------------------------------|
| linstor-db-grp | PlaceCount: 3 | 0 | |
|---------------------------------------------------------------------------------|
| nomad | PlaceCount: 2 | | |
| | StoragePool(s): compute, backup | | |
| | DisklessOnRemaining: False | | |
| | LayerStack: ['DRBD', 'LUKS', 'STORAGE'] | | |
|---------------------------------------------------------------------------------|
| proxmox | PlaceCount: 2 | 0 | |
| | StoragePool(s): compute, backup | | |
+---------------------------------------------------------------------------------+
resource-group query-size-info nomad
╭──────────────────────────────────────────────────────────────╮
┊ MaxVolumeSize ┊ AvailableSize ┊ Capacity ┊ Next Spawn Result ┊
╞══════════════════════════════════════════════════════════════╡
┊ 31.96 TiB ┊ 2.51 TiB ┊ 2.66 TiB ┊ backup on omv ┊
┊ ┊ ┊ ┊ compute on ryzen ┊
╰──────────────────────────────────────────────────────────────╯
Spawning a resource based on these configurations indeed create the disks across the two storage groups, but it fails immediately with a Standalone error:
LINSTOR ==> rg spawn nomad a-encrypted 5Gib -l DRBD,LUKS,STORAGE
LINSTOR ==> resource list -r a-encrypted
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ ResourceName ┊ Node ┊ Layers ┊ Usage ┊ Conns ┊ State ┊ CreatedOn ┊
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════╡
┊ a-encrypted ┊ omv ┊ DRBD,LUKS,STORAGE ┊ Unused ┊ StandAlone(ryzen) ┊ Outdated ┊ 2026-01-14 11:06:04 ┊
┊ a-encrypted ┊ ryzen ┊ DRBD,LUKS,STORAGE ┊ Unused ┊ StandAlone(omv) ┊ UpToDate ┊ 2026-01-14 11:06:01 ┊
┊ a-encrypted ┊ tiny ┊ DRBD,STORAGE ┊ Unused ┊ Ok ┊ TieBreaker ┊ 2026-01-14 11:05:51 ┊
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Creating a plain resource with mixed drivers, without LUKS, actually seems to work
LINSTOR ==> rg spawn nomad a-plain 5Gib -l DRBD,STORAGE
LINSTOR ==> resource list -r a-plain
╭───────────────────────────────────────────────────────────────────────────────────────────╮
┊ ResourceName ┊ Node ┊ Layers ┊ Usage ┊ Conns ┊ State ┊ CreatedOn ┊
╞═══════════════════════════════════════════════════════════════════════════════════════════╡
┊ a-plain ┊ omv ┊ DRBD,STORAGE ┊ Unused ┊ Ok ┊ UpToDate ┊ 2026-01-14 11:08:44 ┊
┊ a-plain ┊ romulus ┊ DRBD,STORAGE ┊ Unused ┊ Ok ┊ TieBreaker ┊ 2026-01-14 11:08:40 ┊
┊ a-plain ┊ ryzen ┊ DRBD,STORAGE ┊ Unused ┊ Ok ┊ UpToDate ┊ 2026-01-14 11:08:40 ┊
╰───────────────────────────────────────────────────────────────────────────────────────────╯
Looking at dmesg on the nodes, these are the logs when creating the LUKS volume that goes out of sync
From the ZFS node
[303001.501572] drbd a-encrypted: Starting worker thread (node-id 0)
[303001.524393] drbd a-encrypted ryzen: Starting sender thread (peer-node-id 1)
[303001.540059] drbd a-encrypted tiny: Starting sender thread (peer-node-id 2)
[303001.646442] drbd a-encrypted/0 drbd1019: meta-data IO uses: blk-bio
[303001.650803] drbd a-encrypted/0 drbd1019: disk( Diskless -> Attaching ) [attach]
[303001.650830] drbd a-encrypted/0 drbd1019: Maximum number of peer devices = 7
[303001.651123] drbd a-encrypted: Method to ensure write ordering: flush
[303001.651161] drbd a-encrypted/0 drbd1019: drbd_bm_resize called with capacity == 10458872
[303001.655182] drbd a-encrypted/0 drbd1019: resync bitmap: bits=1307359 bits_4k=1307359 words=142996 pages=280
[303001.655197] drbd a-encrypted/0 drbd1019: size = 5107 MB (5229436 KB)
[303001.684153] drbd a-encrypted/0 drbd1019: bitmap READ of 280 pages took 20 ms
[303001.686357] drbd a-encrypted/0 drbd1019: recounting of set bits took additional 4ms
[303001.686392] drbd a-encrypted/0 drbd1019: disk( Attaching -> Inconsistent ) [attach]
[303001.686401] drbd a-encrypted/0 drbd1019: attached to current UUID: 0000000000000004
[303001.712765] drbd a-encrypted ryzen: conn( StandAlone -> Unconnected ) [connect]
[303001.716188] drbd a-encrypted tiny: conn( StandAlone -> Unconnected ) [connect]
[303001.727844] drbd a-encrypted ryzen: Starting receiver thread (peer-node-id 1)
[303001.730340] drbd a-encrypted tiny: Starting receiver thread (peer-node-id 2)
[303001.730410] drbd a-encrypted tiny: conn( Unconnected -> Connecting ) [connecting]
[303001.730667] drbd a-encrypted ryzen: conn( Unconnected -> Connecting ) [connecting]
[303002.240663] drbd a-encrypted tiny: Handshake to peer 2 successful: Agreed network protocol version 123
[303002.240687] drbd a-encrypted tiny: Feature flags enabled on protocol level: 0x1ff TRIM THIN_RESYNC WRITE_SAME WRITE_ZEROES RESYNC_DAGTAG
[303002.240717] drbd a-encrypted ryzen: Handshake to peer 1 successful: Agreed network protocol version 123
[303002.240741] drbd a-encrypted ryzen: Feature flags enabled on protocol level: 0x1ff TRIM THIN_RESYNC WRITE_SAME WRITE_ZEROES RESYNC_DAGTAG
[303002.241745] drbd a-encrypted tiny: Peer authenticated using 20 bytes HMAC
[303002.241851] drbd a-encrypted ryzen: Peer authenticated using 20 bytes HMAC
[303002.244628] drbd a-encrypted: Preparing cluster-wide state change 3153436799: 0->1 role( Secondary ) conn( Connected )
[303002.264641] drbd a-encrypted/0 drbd1019 ryzen: drbd_sync_handshake:
[303002.264663] drbd a-encrypted/0 drbd1019 ryzen: self 0000000000000004:0000000000000000:DC68FCE9F561873C:0000000000000000 bits:0 flags:24
[303002.264678] drbd a-encrypted/0 drbd1019 ryzen: peer 15C8116C05BB675E:DC68FCE9F561873D:0000000000000000:0000000000000000 bits:0 flags:1020
[303002.264691] drbd a-encrypted/0 drbd1019 ryzen: uuid_compare()=target-set-bitmap by rule=just-created-self
[303002.264702] drbd a-encrypted/0 drbd1019 ryzen: Setting and writing the whole bitmap, fresh node
[303002.283914] drbd a-encrypted/0 drbd1019: bitmap WRITE of 280 pages took 16 ms
[303002.284017] drbd a-encrypted: Declined by peer ryzen (id: 1), see the kernel log there
[303002.284062] drbd a-encrypted: Aborting cluster-wide state change 3153436799 (36ms) rv = -10
[303002.284164] drbd a-encrypted ryzen: conn( Connecting -> Disconnecting ) [connect-failed]
[303002.284170] drbd a-encrypted/0 drbd1019: disk( Inconsistent -> Outdated ) [connect-failed]
[303002.286713] drbd a-encrypted ryzen: Terminating sender thread
[303002.286772] drbd a-encrypted ryzen: Starting sender thread (peer-node-id 1)
[303002.296474] drbd a-encrypted: Preparing cluster-wide state change 2076488740: 0->2 role( Secondary ) conn( Connected )
[303002.344349] drbd a-encrypted ryzen: Connection closed
[303002.344392] drbd a-encrypted ryzen: helper command: /sbin/drbdadm disconnected
[303002.348467] drbd a-encrypted/0 drbd1019 tiny: self 0000000000000004:0000000000000000:DC68FCE9F561873C:0000000000000000 bits:0 flags:0
[303002.348494] drbd a-encrypted/0 drbd1019 tiny: peer's exposed UUID: 15C8116C05BB675E
[303002.348531] drbd a-encrypted: State change 2076488740: primary_nodes=0, weak_nodes=0
[303002.348543] drbd a-encrypted: Committing cluster-wide state change 2076488740 (52ms)
[303002.348660] drbd a-encrypted tiny: conn( Connecting -> Connected ) peer( Unknown -> Secondary ) [connected]
[303002.348672] drbd a-encrypted/0 drbd1019 tiny: pdsk( DUnknown -> Diskless ) repl( Off -> Established ) [connected]
[303002.351735] drbd a-encrypted ryzen: helper command: /sbin/drbdadm disconnected exit code 0
[303002.351828] drbd a-encrypted ryzen: conn( Disconnecting -> StandAlone ) [disconnected]
[303002.351848] drbd a-encrypted ryzen: Terminating receiver thread
[303016.993769] drbd a-encrypted ryzen: conn( StandAlone -> Unconnected ) [connect]
[303016.993891] drbd a-encrypted ryzen: Starting receiver thread (peer-node-id 1)
[303016.994145] drbd a-encrypted ryzen: conn( Unconnected -> Connecting ) [connecting]
[303017.505346] drbd a-encrypted ryzen: Handshake to peer 1 successful: Agreed network protocol version 123
[303017.505369] drbd a-encrypted ryzen: Feature flags enabled on protocol level: 0x1ff TRIM THIN_RESYNC WRITE_SAME WRITE_ZEROES RESYNC_DAGTAG
[303017.506955] drbd a-encrypted ryzen: Peer authenticated using 20 bytes HMAC
[303017.509083] drbd a-encrypted: Preparing cluster-wide state change 342049303: 0->1 role( Secondary ) conn( Connected )
[303017.529196] drbd a-encrypted/0 drbd1019 ryzen: Peer sent bogus sizes, disconnecting
[303017.529286] drbd a-encrypted/0 drbd1019 ryzen: drbd_sync_handshake:
[303017.529295] drbd a-encrypted/0 drbd1019 ryzen: self 0000000000000004:0000000000000000:DC68FCE9F561873C:0000000000000000 bits:1307359 flags:20
[303017.529309] drbd a-encrypted/0 drbd1019 ryzen: peer 15C8116C05BB675E:DC68FCE9F561873D:0000000000000000:0000000000000000 bits:1311454 flags:1020
[303017.529323] drbd a-encrypted/0 drbd1019 ryzen: uuid_compare()=target-set-bitmap by rule=just-created-self
[303017.529334] drbd a-encrypted/0 drbd1019 ryzen: Setting and writing the whole bitmap, fresh node
[303017.529995] drbd a-encrypted: Declined by peer ryzen (id: 1), see the kernel log there
[303017.530029] drbd a-encrypted: Aborting cluster-wide state change 342049303 (20ms) rv = -10
[303017.530204] drbd a-encrypted ryzen: conn( Connecting -> Disconnecting ) [connect-failed]
[303017.530912] drbd a-encrypted ryzen: Terminating sender thread
[303017.531000] drbd a-encrypted ryzen: Starting sender thread (peer-node-id 1)
[303017.563675] drbd a-encrypted ryzen: Connection closed
[303017.563725] drbd a-encrypted ryzen: helper command: /sbin/drbdadm disconnected
[303017.567904] drbd a-encrypted ryzen: helper command: /sbin/drbdadm disconnected exit code 0
[303017.567999] drbd a-encrypted ryzen: conn( Disconnecting -> StandAlone ) [disconnected]
[303017.568016] drbd a-encrypted ryzen: Terminating receiver thread
From the LVM node
[325022.351965] drbd a-encrypted: Starting worker thread (node-id 1)
[325022.354138] drbd a-encrypted omv: Starting sender thread (peer-node-id 0)
[325022.354893] drbd a-encrypted tiny: Starting sender thread (peer-node-id 2)
[325022.364434] drbd a-encrypted/0 drbd1019: meta-data IO uses: blk-bio
[325022.364578] drbd a-encrypted/0 drbd1019: disk( Diskless -> Attaching ) [attach]
[325022.364587] drbd a-encrypted/0 drbd1019: Maximum number of peer devices = 7
[325022.364762] drbd a-encrypted: Method to ensure write ordering: flush
[325022.364770] drbd a-encrypted/0 drbd1019: drbd_bm_resize called with capacity == 10491632
[325022.365208] drbd a-encrypted/0 drbd1019: resync bitmap: bits=1311454 bits_4k=1311454 words=143444 pages=281
[325022.365215] drbd a-encrypted/0 drbd1019: size = 5123 MB (5245816 KB)
[325022.366834] drbd a-encrypted/0 drbd1019: disk( Attaching -> Inconsistent ) [attach]
[325022.366837] drbd a-encrypted/0 drbd1019: attached to current UUID: 0000000000000004
[325022.368655] drbd a-encrypted omv: conn( StandAlone -> Unconnected ) [connect]
[325022.369315] drbd a-encrypted tiny: conn( StandAlone -> Unconnected ) [connect]
[325022.369447] drbd a-encrypted omv: Starting receiver thread (peer-node-id 0)
[325022.369490] drbd a-encrypted omv: conn( Unconnected -> Connecting ) [connecting]
[325022.369498] drbd a-encrypted tiny: Starting receiver thread (peer-node-id 2)
[325022.369531] drbd a-encrypted tiny: conn( Unconnected -> Connecting ) [connecting]
[325022.547466] drbd a-encrypted: Preparing cluster-wide state change 608941056: 1->all role( Primary ) disk( UpToDate )
[325022.547470] drbd a-encrypted: Committing cluster-wide state change 608941056 (0ms)
[325022.547474] drbd a-encrypted: role( Secondary -> Primary ) [primary]
[325022.547477] drbd a-encrypted/0 drbd1019: disk( Inconsistent -> UpToDate ) quorum( no -> yes ) [primary]
[325022.547479] drbd a-encrypted/0 drbd1019 tiny: pdsk( DUnknown -> Outdated ) [primary]
[325022.547481] drbd a-encrypted/0 drbd1019 omv: pdsk( DUnknown -> Outdated ) [primary]
[325022.547533] drbd a-encrypted/0 drbd1019: persisting effective size = 5123 MB (5245816 KB)
[325022.548407] drbd a-encrypted: Forced to consider local data as UpToDate!
[325022.548410] drbd a-encrypted: Forced to consider peers as Outdated!
[325022.550072] drbd a-encrypted/0 drbd1019: new current UUID: 15C8116C05BB675F weak: FFFFFFFFFFFFFFFD
[325022.553188] drbd a-encrypted: Preparing cluster-wide state change 3382306153: 1->all role( Secondary )
[325022.553193] drbd a-encrypted: Committing cluster-wide state change 3382306153 (0ms)
[325022.553199] drbd a-encrypted: role( Primary -> Secondary ) [secondary]
[325022.876012] drbd a-encrypted tiny: Handshake to peer 2 successful: Agreed network protocol version 123
[325022.876020] drbd a-encrypted tiny: Feature flags enabled on protocol level: 0x1ff TRIM THIN_RESYNC WRITE_SAME WRITE_ZEROES RESYNC_DAGTAG
[325022.876853] drbd a-encrypted tiny: Peer authenticated using 20 bytes HMAC
[325022.877157] drbd a-encrypted: Preparing cluster-wide state change 3910019162: 1->2 role( Secondary ) conn( Connected )
[325022.885829] drbd a-encrypted/0 drbd1019 tiny: self 15C8116C05BB675E:DC68FCE9F561873D:0000000000000000:0000000000000000 bits:0 flags:0
[325022.885836] drbd a-encrypted/0 drbd1019 tiny: peer's exposed UUID: 0000000000000000
[325022.885848] drbd a-encrypted: State change 3910019162: primary_nodes=0, weak_nodes=0
[325022.885852] drbd a-encrypted: Committing cluster-wide state change 3910019162 (8ms)
[325022.885872] drbd a-encrypted tiny: conn( Connecting -> Connected ) peer( Unknown -> Secondary ) [connected]
[325022.885876] drbd a-encrypted/0 drbd1019 tiny: pdsk( Outdated -> Diskless ) repl( Off -> Established ) [connected]
[325026.389115] drbd a-encrypted omv: Handshake to peer 0 successful: Agreed network protocol version 123
[325026.389124] drbd a-encrypted omv: Feature flags enabled on protocol level: 0x1ff TRIM THIN_RESYNC WRITE_SAME WRITE_ZEROES RESYNC_DAGTAG
[325026.390144] drbd a-encrypted omv: Peer authenticated using 20 bytes HMAC
[325026.393047] drbd a-encrypted: Preparing remote state change 3153436799: 0->1 role( Secondary ) conn( Connected )
[325026.401122] drbd a-encrypted/0 drbd1019 omv: The peer's disk size is too small! (10458872 < 10491632 sectors)
[325026.401149] drbd a-encrypted/0 drbd1019 omv: drbd_sync_handshake:
[325026.401152] drbd a-encrypted/0 drbd1019 omv: self 15C8116C05BB675E:DC68FCE9F561873D:0000000000000000:0000000000000000 bits:0 flags:20
[325026.401157] drbd a-encrypted/0 drbd1019 omv: peer 0000000000000004:0000000000000000:0000000000000000:0000000000000000 bits:0 flags:24
[325026.401161] drbd a-encrypted/0 drbd1019 omv: uuid_compare()=source-set-bitmap by rule=just-created-peer
[325026.401164] drbd a-encrypted/0 drbd1019 omv: Setting and writing one bitmap slot, after drbd_sync_handshake
[325026.432424] drbd a-encrypted omv: Aborting remote state change 3153436799
[325026.432466] drbd a-encrypted omv: conn( Connecting -> Disconnecting ) [receive-disconnect]
[325026.432526] drbd a-encrypted omv: Terminating sender thread
[325026.432532] drbd a-encrypted omv: Starting sender thread (peer-node-id 0)
[325026.443098] drbd a-encrypted omv: Connection closed
[325026.443109] drbd a-encrypted omv: helper command: /sbin/drbdadm disconnected
[325026.444639] drbd a-encrypted omv: helper command: /sbin/drbdadm disconnected exit code 0
[325026.444666] drbd a-encrypted omv: conn( Disconnecting -> StandAlone ) [disconnected]
[325026.444673] drbd a-encrypted omv: Terminating receiver thread
[325026.445080] drbd a-encrypted: Preparing remote state change 2076488740: 0->2 role( Secondary ) conn( Connected )
[325026.448369] drbd a-encrypted/0 drbd1019 tiny: The peer's disk size is too small! (10458872 < 10491632 sectors)
[325026.497454] drbd a-encrypted tiny: Committing remote state change 2076488740 (primary_nodes=0)
[325041.093022] drbd a-encrypted omv: conn( StandAlone -> Unconnected ) [connect]
[325041.093068] drbd a-encrypted omv: Starting receiver thread (peer-node-id 0)
[325041.093133] drbd a-encrypted omv: conn( Unconnected -> Connecting ) [connecting]
[325041.653577] drbd a-encrypted omv: Handshake to peer 0 successful: Agreed network protocol version 123
[325041.653584] drbd a-encrypted omv: Feature flags enabled on protocol level: 0x1ff TRIM THIN_RESYNC WRITE_SAME WRITE_ZEROES RESYNC_DAGTAG
[325041.655700] drbd a-encrypted omv: Peer authenticated using 20 bytes HMAC
[325041.657265] drbd a-encrypted: Preparing remote state change 342049303: 0->1 role( Secondary ) conn( Connected )
[325041.666090] drbd a-encrypted/0 drbd1019 omv: The peer's disk size is too small! (10458872 < 10491632 sectors)
[325041.666127] drbd a-encrypted/0 drbd1019 omv: drbd_sync_handshake:
[325041.666131] drbd a-encrypted/0 drbd1019 omv: self 15C8116C05BB675E:DC68FCE9F561873D:0000000000000000:0000000000000000 bits:1311454 flags:20
[325041.666135] drbd a-encrypted/0 drbd1019 omv: peer 0000000000000004:0000000000000000:DC68FCE9F561873C:0000000000000000 bits:1307359 flags:20
[325041.666141] drbd a-encrypted/0 drbd1019 omv: uuid_compare()=source-set-bitmap by rule=just-created-peer
[325041.666144] drbd a-encrypted/0 drbd1019 omv: Setting and writing one bitmap slot, after drbd_sync_handshake
[325041.677819] drbd a-encrypted omv: Aborting remote state change 342049303
[325041.678061] drbd a-encrypted omv: conn( Connecting -> Disconnecting ) [receive-disconnect]
[325041.678141] drbd a-encrypted omv: Terminating sender thread
[325041.678148] drbd a-encrypted omv: Starting sender thread (peer-node-id 0)
[325041.682956] drbd a-encrypted omv: Connection closed
[325041.682965] drbd a-encrypted omv: helper command: /sbin/drbdadm disconnected
[325041.684293] drbd a-encrypted omv: helper command: /sbin/drbdadm disconnected exit code 0
[325041.684316] drbd a-encrypted omv: conn( Disconnecting -> StandAlone ) [disconnected]
[325041.684322] drbd a-encrypted omv: Terminating receiver thread
Questions
- Is it actually possible to run LUKS across different storage drivers, or am I trying unsupported features together?
- Is there any other suggestion on how to achieve encrypted backups to an off-site location without using the LUKS layer using Linstor backups?
Thank you for anyone that can help figure this feature integrations and deployment design hurdles