[pve-devel] [PATCH storage 1/1] fix #3580: plugins: make preallocation mode selectable for qcow2 and raw images

Lorenz Stechauner l.stechauner at proxmox.com
Thu Sep 9 13:11:34 CEST 2021


On 09.09.21 12:25, Fabian Ebner wrote:
> Am 08.09.21 um 10:11 schrieb alexandre derumier:
>> Hi,
>> it can be done too with ceph rbd with "rbd create ... –thick-provision"
>>
>
> Hi,
> there also is the 'sparse' storage config option (currently only used 
> for ZFS plugins). If there is only thick or thin, re-using that one is 
> probably nicer, because the newly proposed preallocation option seems 
> to be closely tied to qemu-img.

Sounds like a good idea. I doubt, that anyone would use full 
prellocation anyway, so simply using 'sparse' for prealloc=off and 
default remains prealloc=metadata sounds good.

>
>> Le lundi 06 septembre 2021 à 15:15 +0200, Lorenz Stechauner a écrit :
>>> the plugins for file based storages
>>>   * BTRFS
>>>   * CIFS
>>>   * Dir
>>>   * Glusterfs
>>>   * NFS
>>> now allow the option 'preallocation'.
>>>
>>> 'preallocation' can have four values:
>>>   * default
>>>   * off
>>>   * metadata
>>>   * falloc
>>>   * full
>>> see man pages for `qemu-img` for what these mean exactly. [0]
>>>
>>> the defualt value was chosen to be
>>>   * qcow2: metadata (as previously)
>>>   * raw: off (I was unable to find any documentation on this, so
>>>      could only test this and found, that 'off' was the most
>>>      fitting.)
>>>
>>> when using 'metadata' as preallocation mode, for raw images 'off'
>>> is used.
>>>
>>> [0]
>>> https://qemu.readthedocs.io/en/latest/system/images.html#disk-image-file-formats 
>>>
>>>
>>> Signed-off-by: Lorenz Stechauner <l.stechauner at proxmox.com>
>>> ---
>>>   PVE/Storage/BTRFSPlugin.pm     |  1 +
>>>   PVE/Storage/CIFSPlugin.pm      |  1 +
>>>   PVE/Storage/DirPlugin.pm       |  1 +
>>>   PVE/Storage/GlusterfsPlugin.pm |  4 ++-
>>>   PVE/Storage/NFSPlugin.pm       |  1 +
>>>   PVE/Storage/Plugin.pm          | 46
>>> +++++++++++++++++++++++++++++++++-
>>>   6 files changed, 52 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/PVE/Storage/BTRFSPlugin.pm b/PVE/Storage/BTRFSPlugin.pm
>>> index fe42082..31a2954 100644
>>> --- a/PVE/Storage/BTRFSPlugin.pm
>>> +++ b/PVE/Storage/BTRFSPlugin.pm
>>> @@ -73,6 +73,7 @@ sub options {
>>>          is_mountpoint => { optional => 1 },
>>>          nocow => { optional => 1 },
>>>          mkdir => { optional => 1 },
>>> +       preallocation => { optional => 1 },
>>>          # TODO: The new variant of mkdir with  `populate` vs
>>> `create`...
>>>       };
>>>   }
>>> diff --git a/PVE/Storage/CIFSPlugin.pm b/PVE/Storage/CIFSPlugin.pm
>>> index 0221069..2d94413 100644
>>> --- a/PVE/Storage/CIFSPlugin.pm
>>> +++ b/PVE/Storage/CIFSPlugin.pm
>>> @@ -140,6 +140,7 @@ sub options {
>>>          smbversion => { optional => 1},
>>>          mkdir => { optional => 1 },
>>>          bwlimit => { optional => 1 },
>>> +       preallocation => { optional => 1 },
>>>       };
>>>   }
>>>   diff --git a/PVE/Storage/DirPlugin.pm b/PVE/Storage/DirPlugin.pm
>>> index 2267f11..3eeec98 100644
>>> --- a/PVE/Storage/DirPlugin.pm
>>> +++ b/PVE/Storage/DirPlugin.pm
>>> @@ -59,6 +59,7 @@ sub options {
>>>          mkdir => { optional => 1 },
>>>          is_mountpoint => { optional => 1 },
>>>          bwlimit => { optional => 1 },
>>> +       preallocation => { optional => 1 },
>>>      };
>>>   }
>>>   diff --git a/PVE/Storage/GlusterfsPlugin.pm
>>> b/PVE/Storage/GlusterfsPlugin.pm
>>> index ea4df82..d8d2b88 100644
>>> --- a/PVE/Storage/GlusterfsPlugin.pm
>>> +++ b/PVE/Storage/GlusterfsPlugin.pm
>>> @@ -137,6 +137,7 @@ sub options {
>>>          format => { optional => 1 },
>>>          mkdir => { optional => 1 },
>>>          bwlimit => { optional => 1 },
>>> +       preallocation => { optional => 1 },
>>>       };
>>>   }
>>>   @@ -260,7 +261,8 @@ sub alloc_image {
>>>         my $cmd = ['/usr/bin/qemu-img', 'create'];
>>>   -    push @$cmd, '-o', 'preallocation=metadata' if $fmt eq 'qcow2';
>>> +    my $prealloc_opt =
>>> PVE::Storage::Plugin::preallocation_cmd_option($scfg, $fmt);
>>> +    push @$cmd, '-o', $prealloc_opt if defined($prealloc_opt);
>>>         push @$cmd, '-f', $fmt, $volumepath, "${size}K";
>>>   diff --git a/PVE/Storage/NFSPlugin.pm b/PVE/Storage/NFSPlugin.pm
>>> index 39bf15a..21b288a 100644
>>> --- a/PVE/Storage/NFSPlugin.pm
>>> +++ b/PVE/Storage/NFSPlugin.pm
>>> @@ -90,6 +90,7 @@ sub options {
>>>          format => { optional => 1 },
>>>          mkdir => { optional => 1 },
>>>          bwlimit => { optional => 1 },
>>> +       preallocation => { optional => 1 },
>>>       };
>>>   }
>>>   diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm
>>> index b1865cb..4924525 100644
>>> --- a/PVE/Storage/Plugin.pm
>>> +++ b/PVE/Storage/Plugin.pm
>>> @@ -41,6 +41,19 @@ our @SHARED_STORAGE = (
>>>       'pbs',
>>>   );
>>>   +our $QCOW2_PREALLOCATION = {
>>> +    off => 1,
>>> +    metadata => 1,
>>> +    falloc => 1,
>>> +    full => 1,
>>> +};
>>> +
>>> +our $RAW_PREALLOCATION = {
>>> +    off => 1,
>>> +    falloc => 1,
>>> +    full => 1,
>>> +};
>>> +
>>>   our $MAX_VOLUMES_PER_GUEST = 1024;
>>>     cfs_register_file ('storage.cfg',
>>> @@ -150,6 +163,11 @@ my $defaultData = {
>>>              type => 'string', format => 'pve-storage-format',
>>>              optional => 1,
>>>          },
>>> +       preallocation => {
>>> +           description => "Preallocation mode for raw and qcow2
>>> images.",
>>> +           type => 'string', enum => ['default', 'off', 'metadata',
>>> 'falloc', 'full'],
>>> +           optional => 1,
>>> +       },
>>>       },
>>>   };
>>>   @@ -762,7 +780,8 @@ sub alloc_image {
>>>       } else {
>>>          my $cmd = ['/usr/bin/qemu-img', 'create'];
>>>   -       push @$cmd, '-o', 'preallocation=metadata' if $fmt eq
>>> 'qcow2';
>>> +       my $prealloc_opt = preallocation_cmd_option($scfg, $fmt);
>>> +       push @$cmd, '-o', $prealloc_opt if defined($prealloc_opt);
>>>            push @$cmd, '-f', $fmt, $path, "${size}K";
>>>   @@ -1484,4 +1503,29 @@ sub volume_import_formats {
>>>       return ();
>>>   }
>>>   +sub preallocation_cmd_option {
>>> +    my ($scfg, $fmt) = @_;
>>> +
>>> +    my $prealloc = $scfg->{preallocation};
>>> +
>>> +    $prealloc = undef if $prealloc eq 'default';
>>> +
>>> +    if ($fmt eq 'qcow2') {
>>> +       $prealloc = $prealloc // 'metadata';
>>> +
>>> +       die "preallocation mode '$prealloc' not supported by format
>>> '$fmt'\n" if !$QCOW2_PREALLOCATION->{$prealloc};
>>> +
>>> +       return "preallocation=$prealloc";
>>> +    } elsif ($fmt eq 'raw') {
>>> +       $prealloc = $prealloc // 'off';
>>> +       $prealloc = 'off' if $prealloc eq 'metadata';
>>> +
>>> +       die "preallocation mode '$prealloc' not supported by format
>>> '$fmt'\n" if !$RAW_PREALLOCATION->{$prealloc};
>>> +
>>> +       return "preallocation=$prealloc";
>>> +    }
>>> +
>>> +    return undef;
>>> +}
>>> +
>>>   1;
>>
>> _______________________________________________
>> pve-devel mailing list
>> pve-devel at lists.proxmox.com
>> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>>




More information about the pve-devel mailing list