lvmthin: disable autoactivation for new logical volumes
When discovering a new volume group (VG), for example on boot, LVM
triggers autoactivation. With the default settings, this activates all
logical volumes (LVs) in the VG. Activating an LV creates a
device-mapper device and a block device under /dev/mapper.
Autoactivation is problematic for shared LVM storages, see #4997 [1].
For the inherently local LVM-thin storage it is less problematic, but
it still makes sense to avoid unnecessarily activating LVs and thus
making them visible on the host at boot.
To avoid that, disable autoactivation after creating new LVs. lvcreate
on trixie does not accept the --setautoactivation flag for thin LVs
yet, support was only added with [2]. Hence, setting the flag is is
done with an additional lvchange command for now. With this setting,
LVM autoactivation will not activate these LVs, and the storage stack
will take care of activating/deactivating LVs when needed.
The flag is only set for newly created LVs, so LVs created before this
patch can still trigger #4997. To avoid this, users will be advised to
run a script to disable autoactivation for existing LVs.
[1] https://bugzilla.proxmox.com/show_bug.cgi?id=4997
[2] 1fba3b876b
Signed-off-by: Friedrich Weber <f.weber@proxmox.com>
Link: https://lore.proxmox.com/20250709141034.169726-3-f.weber@proxmox.com
This commit is contained in:
committed by
Thomas Lamprecht
parent
f296ffc4e4
commit
2796d6b639
@ -83,6 +83,18 @@ sub filesystem_path {
|
||||
return wantarray ? ($path, $vmid, $vtype) : $path;
|
||||
}
|
||||
|
||||
# lvcreate on trixie does not accept --setautoactivation for thin LVs yet, so set it via lvchange
|
||||
# TODO PVE 10: evaluate if lvcreate accepts --setautoactivation
|
||||
my $set_lv_autoactivation = sub {
|
||||
my ($vg, $lv, $autoactivation) = @_;
|
||||
|
||||
my $cmd = [
|
||||
'/sbin/lvchange', '--setautoactivation', $autoactivation ? 'y' : 'n', "$vg/$lv",
|
||||
];
|
||||
eval { run_command($cmd); };
|
||||
warn "could not set autoactivation: $@" if $@;
|
||||
};
|
||||
|
||||
sub alloc_image {
|
||||
my ($class, $storeid, $scfg, $vmid, $fmt, $name, $size) = @_;
|
||||
|
||||
@ -112,6 +124,7 @@ sub alloc_image {
|
||||
];
|
||||
|
||||
run_command($cmd, errmsg => "lvcreate '$vg/$name' error");
|
||||
$set_lv_autoactivation->($vg, $name, 0);
|
||||
|
||||
return $name;
|
||||
}
|
||||
@ -298,6 +311,7 @@ sub clone_image {
|
||||
|
||||
my $cmd = ['/sbin/lvcreate', '-n', $name, '-prw', '-kn', '-s', $lv];
|
||||
run_command($cmd, errmsg => "clone image '$lv' error");
|
||||
$set_lv_autoactivation->($vg, $name, 0);
|
||||
|
||||
return $name;
|
||||
}
|
||||
@ -346,7 +360,7 @@ sub volume_snapshot {
|
||||
|
||||
my $cmd = ['/sbin/lvcreate', '-n', $snapvol, '-pr', '-s', "$vg/$volname"];
|
||||
run_command($cmd, errmsg => "lvcreate snapshot '$vg/$snapvol' error");
|
||||
|
||||
# disabling autoactivation not needed, as -s defaults to --setautoactivationskip y
|
||||
}
|
||||
|
||||
sub volume_snapshot_rollback {
|
||||
@ -360,6 +374,7 @@ sub volume_snapshot_rollback {
|
||||
|
||||
$cmd = ['/sbin/lvcreate', '-kn', '-n', $volname, '-s', "$vg/$snapvol"];
|
||||
run_command($cmd, errmsg => "lvm rollback '$vg/$snapvol' error");
|
||||
$set_lv_autoactivation->($vg, $volname, 0);
|
||||
}
|
||||
|
||||
sub volume_snapshot_delete {
|
||||
|
||||
Reference in New Issue
Block a user