X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=PVE%2FStorage%2FLvmThinPlugin.pm;h=c9e127ce0cb5a170f991f8704dc3a9660c54e977;hb=cda32b2361671fafb7127c14702039db711ea657;hp=c834a2272f98a903f0748d90e256a5d93e152a93;hpb=f44e50fed1baa31cd879e3e08d19eb71e611261c;p=pve-storage.git diff --git a/PVE/Storage/LvmThinPlugin.pm b/PVE/Storage/LvmThinPlugin.pm index c834a22..c9e127c 100644 --- a/PVE/Storage/LvmThinPlugin.pm +++ b/PVE/Storage/LvmThinPlugin.pm @@ -2,8 +2,9 @@ package PVE::Storage::LvmThinPlugin; use strict; use warnings; -use Data::Dumper; + use IO::File; + use PVE::Tools qw(run_command trim); use PVE::Storage::Plugin; use PVE::Storage::LVMPlugin; @@ -15,6 +16,12 @@ use PVE::JSONSchema qw(get_standard_option); # lvcreate -n pvepool -L 20G pve # lvconvert --type thin-pool pve/pvepool +# NOTE: volumes which were created as linked clones of another base volume +# are currently not tracking this relationship in their volume IDs. this is +# generally not a problem, as LVM thin allows deletion of such base volumes +# without affecting the linked clones. this leads to increased disk usage +# when migrating LVM-thin volumes, which is normally prevented for linked clones. + use base qw(PVE::Storage::LVMPlugin); sub type { @@ -43,9 +50,13 @@ sub options { nodes => { optional => 1 }, disable => { optional => 1 }, content => { optional => 1 }, + bwlimit => { optional => 1 }, }; } +# NOTE: the fourth and fifth element of the returned array are always +# undef, even if the volume is a linked clone of another volume. see note +# at beginning of file. sub parse_volname { my ($class, $volname) = @_; @@ -84,9 +95,7 @@ sub alloc_image { die "no such volume group '$vg'\n" if !defined ($vgs->{$vg}); - my $lvs = PVE::Storage::LVMPlugin::lvm_list_volumes($vg); - - $name = PVE::Storage::LVMPlugin::lvm_find_free_diskname($lvs, $vg, $storeid, $vmid) + $name = $class->find_free_diskname($storeid, $scfg, $vmid) if !$name; my $cmd = ['/sbin/lvcreate', '-aly', '-V', "${size}k", '--name', $name, @@ -108,7 +117,7 @@ sub free_image { # remove all volume snapshots first foreach my $lv (keys %$dat) { - next if $lv !~ m/^snap_${volname}_(\w+)$/; + next if $lv !~ m/^snap_${volname}_${PVE::JSONSchema::CONFIGID_RE}$/; my $cmd = ['/sbin/lvremove', '-f', "$vg/$lv"]; run_command($cmd, errmsg => "lvremove snapshot '$vg/$lv' error"); } @@ -156,6 +165,7 @@ sub list_images { push @$res, { volid => $volid, format => 'raw', size => $info->{lv_size}, vmid => $owner, + ctime => $info->{ctime}, }; } } @@ -169,9 +179,13 @@ sub list_thinpools { my $lvs = PVE::Storage::LVMPlugin::lvm_list_volumes($vg); my $thinpools = []; - foreach my $lvname (keys %{$lvs->{$vg}}) { - next if $lvs->{$vg}->{$lvname}->{lv_type} ne 't'; - push @$thinpools, { lv => $lvname }; + foreach my $vg (keys %$lvs) { + foreach my $lvname (keys %{$lvs->{$vg}}) { + next if $lvs->{$vg}->{$lvname}->{lv_type} ne 't'; + my $lv = $lvs->{$vg}->{$lvname}; + $lv->{lv} = $lvname; + push @$thinpools, $lv; + } } return $thinpools; @@ -253,9 +267,7 @@ sub clone_image { $lv = "$vg/$volname"; } - my $lvs = PVE::Storage::LVMPlugin::lvm_list_volumes($vg); - - my $name = PVE::Storage::LVMPlugin::lvm_find_free_diskname($lvs, $vg, $storeid, $vmid); + my $name = $class->find_free_diskname($storeid, $scfg, $vmid); my $cmd = ['/sbin/lvcreate', '-n', $name, '-prw', '-kn', '-s', $lv]; run_command($cmd, errmsg => "clone image '$lv' error"); @@ -359,4 +371,11 @@ sub volume_has_feature { return undef; } +# used in LVMPlugin->volume_import +sub volume_import_write { + my ($class, $input_fh, $output_file) = @_; + run_command(['dd', "of=$output_file", 'conv=sparse', 'bs=64k'], + input => '<&'.fileno($input_fh)); +} + 1;