[pve-devel] [PATCH storage 1/1] fix #3580: plugins: make preallocation mode selectable for qcow2 and raw images
Fabian Ebner
f.ebner at proxmox.com
Thu Sep 9 12:25:37 CEST 2021
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.
> 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