Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12
○Not yet marked complete on this device.
Two storage plugins share a name and almost nothing else.
lvmthin is what a default Proxmox installation gives you: local, thin,
snapshot-capable, and unable to be shared. lvm is the plugin you point at a
SAN LUN: shared across the cluster, thick, and — since PVE 9 — snapshot-capable
in a completely different way.
Confusing them produces designs that cannot do what the design document says
they do, which is why this lesson keeps them apart from the first paragraph.
The two plugins side by side
lvmthin
lvm
Typical use
Local storage on each node
A shared iSCSI/FC/SAS LUN
Shared
no
possible — when the underlying LUN is shared
Thin provisioning
yes, in the pool
no, at the LVM layer — the array may do it
Image formats
raw
raw, and qcow2 for volume-chain snapshots
Snapshots
yes, native thin snapshots
yes, as volume chains, since PVE 9
Linked clones
yes
no
Content types
images, rootdir
images, rootdir
Live migration without disk copy
no
yes, when shared
Their configuration entries look almost identical, which is part of the problem:
lvmthin: local-lvm thinpool data vgname pve content rootdir,imageslvm: san-lun-a vgname san-vg-a content rootdir,images shared 1 base iscsi-portal:0.0.0.scsi-360000000000000000000000000000001
The shared 1 line is the whole difference in behaviour, and the previous part
established what it means: an assertion that every node sees the same data, which
PVE acts on without verifying.
LVM over a shared LUN, and the lock
The arrangement is straightforward. A SAN presents one large LUN to every node
in the cluster. Each node sees the same block device. LVM on top of it splits
the LUN into logical volumes, one or more per guest, and PVE names them
vm-<VMID>-<NAME>.
The obvious question is what stops two nodes writing LVM metadata at the same
time and corrupting the volume group. The documentation answers it directly:
the backend implements proper cluster-wide locking if the storage is marked as
shared in the configuration.
Configuration changeadd a shared LVM storage over an existing SAN volume group— Changes cluster configuration. Assumes the volume group already exists on a LUN presented to every node. Marking it shared is what enables cluster-wide locking and live migration without disk copy — and it must be true before you set it.
Read-only / Safeconfirm every node really does see the volume group— Read-only. Run on each node. If a node does not list the volume group, the shared flag is a promise that node cannot keep, and any guest migrated there will fail to start — or worse, if the flag is wrong in the other direction, succeed against the wrong data.
vgs -o vg_name,vg_size,vg_free,pv_count
pvs -o pv_name,vg_name,pv_size
pvesm status --storage san-lun-a
LVM-thin: the local default
A default Proxmox VE installation creates a pve volume group with a thin pool
called data, and registers it as the local-lvm storage. Building one by hand
is two commands:
Destructivecreate a thin pool in an existing volume group— DESTRUCTIVE if the volume group or its space is in use. lvcreate consumes 100 GiB of the volume group; lvconvert changes that logical volume into a thin pool, after which its contents are managed by the thin target and it cannot be used as an ordinary LV. Confirm free space with vgs first.
Configuration changeregister the thin pool as a PVE storage— Changes cluster configuration. Note the absence of --shared: a thin pool is local to the node whose disks back it, and marking it shared is the failure described in the storage model lesson.
pvesm add lvmthin local-lvm \
--vgname pve \
--thinpool data \
--content images,rootdir
pvesm status --storage local-lvm
The thin pool has two ways to fill
This is the part that costs people a weekend, and it is not the one they
monitor.
A thin pool has two allocated areas: the data area, which holds guest
blocks, and a separate metadata area, which holds the mapping from logical
blocks to physical ones. Both can fill. Only the first is what pvesm status
and most dashboards show.
Read-only / Safethe only thin-pool health command that matters— Read-only. data_percent is what everyone watches; metadata_percent is what takes the pool down while data sits at 40%. Snapshots and many small volumes consume metadata far faster than they consume data.
lvs -o lv_name,lv_size,data_percent,metadata_percent,lv_metadata_size,snap_percent
lvs -a -o lv_name,pool_lv,lv_size,data_percent | head -30
Both plugins accept saferemove, documented as zeroing out data when removing
logical volumes so that it cannot be accessed by other LVs created later.
That is a real concern on multi-tenant or regulated estates: without it, a newly
created volume can contain the previous volume’s blocks, and a guest that reads
its own unwritten disk sees somebody else’s data.
The cost is time and I/O. Removing a 2 TB volume means writing 2 TB of zeroes,
throttled by saferemove_throughput (up to 10 MiB/s by default) and stepped by
saferemove-stepsize (up to 32 MiB by default). At the default throughput, that
2 TB removal takes days.
The decision is therefore not “should data be erased” but “where”. On a
multi-tenant estate, enable it and size the throughput deliberately. Elsewhere,
consider whether encryption at rest, or the array’s own crypto-erase, answers
the same question at a fraction of the cost.
Key takeaways
lvmthin and lvm are different products with similar names. Thin is local,
thin-provisioned, snapshot- and linked-clone-capable. Plain LVM over a shared
LUN is shared and thick.
Shared LVM is safe because PVE implements cluster-wide locking when the
storage is marked shared, using pmxcfs rather than cLVM or a separate lock
manager. The lock therefore depends on quorum.
That lock protects PVE’s operations from each other and nothing else. The
LUN must be presented to this cluster alone; a second writer destroys the
volume group metadata.
A thin pool has a data area and a separate metadata area, and metadata
fills first under snapshot-heavy workloads. Alarm on metadata_percent, not
only data_percent. Repairing metadata needs the pool inactive.
PVE 9 gave LVM snapshots as volume chains — a separate volume per snapshot,
layered with qcow2 — rather than classic LVM snapshots, which degrade the
whole volume group. Chains are walked on read, so prune them.
LVM over a thin-provisioned array reports the LUN’s size, not the array’s free
space. The array needs its own capacity alarm.
saferemove zeroes removed volumes and is throttled to 10 MiB/s by default,
so a large removal takes a very long time. Decide it deliberately.
Never mark an LVM-thin storage shared.
Knowledge check
Knowledge check · 5 questions
Q1. What makes LVM over a shared SAN LUN safe against two nodes corrupting the volume group metadata?
Q2. A 1.7 TiB LVM-thin pool at 40% data usage suddenly stops accepting writes and guests start failing. The capacity dashboard shows 40%. What has happened?
Q3. Which statements about snapshots as volume chains, added for LVM in PVE 9, are correct? Select all that apply.
Q4. An LVM-thin storage can be marked shared to allow live migration without disk copy, provided the underlying disks are on a SAN.
Q5. A node running guests on shared LVM loses quorum. What is the correct response?
Passing score: 75%. Answers are checked in this browser.