From: "DERUMIER, Alexandre via pve-devel" <pve-devel@lists.proxmox.com>
To: "pve-devel@lists.proxmox.com" <pve-devel@lists.proxmox.com>,
"f.ebner@proxmox.com" <f.ebner@proxmox.com>
Cc: "DERUMIER, Alexandre" <alexandre.derumier@groupe-cyllene.com>
Subject: Re: [pve-devel] [RFC storage 1/3] plugin: add method to get qemu blockdevice options for volume
Date: Fri, 23 May 2025 08:19:22 +0000 [thread overview]
Message-ID: <mailman.615.1747988402.394.pve-devel@lists.proxmox.com> (raw)
In-Reply-To: <20250509141532.111458-3-f.ebner@proxmox.com>
[-- Attachment #1: Type: message/rfc822, Size: 19258 bytes --]
From: "DERUMIER, Alexandre" <alexandre.derumier@groupe-cyllene.com>
To: "pve-devel@lists.proxmox.com" <pve-devel@lists.proxmox.com>, "f.ebner@proxmox.com" <f.ebner@proxmox.com>
Subject: Re: [pve-devel] [RFC storage 1/3] plugin: add method to get qemu blockdevice options for volume
Date: Fri, 23 May 2025 08:19:22 +0000
Message-ID: <eeb11ec08d36c3a6f5290134158e91ad7be8b432.camel@groupe-cyllene.com>
Hi Fiona,
do we still support glusterfs for pve9 (as it's deprecated)?
-------- Message initial --------
De: Fiona Ebner <f.ebner@proxmox.com>
Répondre à: Proxmox VE development discussion <pve-
devel@lists.proxmox.com>
À: pve-devel@lists.proxmox.com
Objet: [pve-devel] [RFC storage 1/3] plugin: add method to get qemu
blockdevice options for volume
Date: 09/05/2025 16:15:30
There intentionally is only handling for absolute paths in the default
plugin implementation. Any plugin requiring more needs to implement
the method itself.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
I discussed this with Fabian off-list. With PVE 9 being a major
release and most popular plugins not using special protocols like
'rbd://', this seems acceptable. He'll also give a heads-up to known
plugin developers with other changes for PVE 9 in time.
For NBD, etc. qemu-server should construct the blockdev object.
Still missing API bump + Changelog
Did not test snapshots yet.
src/PVE/Storage.pm | 19 ++++++++++++
src/PVE/Storage/Plugin.pm | 64 +++++++++++++++++++++++++++++++++++++++
2 files changed, 83 insertions(+)
diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index d0a696a..5915395 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -710,6 +710,25 @@ sub abs_filesystem_path {
return $path;
}
+sub qemu_blockdev_options {
+ my ($cfg, $volid, $snapname) = @_;
+
+ my ($storeid, $volname) = parse_volume_id($volid);
+
+ my $scfg = storage_config($cfg, $storeid);
+
+ my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+
+ my ($vtype) = $plugin->parse_volname($volname);
+ die "cannot use volume of type '$vtype' as a QEMU blockdevice\n"
+ if $vtype ne 'images' && $vtype ne 'iso' && $vtype ne
'import';
+
+ die "QEMU blockdevice - 'snapname' argument is not supported for
vtype '$vtype'"
+ if $snapname && $vtype ne 'images';
+
+ return $plugin->qemu_blockdev_options($scfg, $storeid, $volname,
$snapname);
+}
+
# used as last resort to adapt volnames when migrating
my $volname_for_storage = sub {
my ($cfg, $storeid, $name, $vmid, $format) = @_;
diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm
index 4e16420..dc3c6df 100644
--- a/src/PVE/Storage/Plugin.pm
+++ b/src/PVE/Storage/Plugin.pm
@@ -1880,6 +1880,70 @@ sub rename_volume {
return "${storeid}:${base}${target_vmid}/${target_volname}";
}
+=pod
+
+=head3 qemu_blockdev_options
+
+ $blockdev = $plugin->qemu_blockdev_options($scfg, $storeid,
$volname, $snapname)
+
+Returns a hash reference with the basic options needed to open the
volume via QEMU's C<-blockdev>
+API. This at least requires a C<< $blockdev->{driver} >> and a
reference to the image, e.g.
+C<< $blockdev->{filename} >> for the C<file> driver. For files, the
C<file> driver can be used. For
+host block devices, the C<host_device> driver can be used. The plugin
must not set options like
+C<cache> or C<aio>. Those are managed by qemu-server and will be
overwritten. For other available
+drivers and the exact specification of the options, see
+L<https://antiphishing.vadesecure.com/v4?f=UU1XcHkxazJBTmIySlBBMWR_zLc
v5a0_cIOSeWbIK2KapikXx8zXaPqWjlzjA2kV1Dznkr2dclNPHmvBavMw9A&i=RTNLd2NGe
E1RTDFrR25iaOm2xB-
k3c1aAk9xq9J3vLE&k=ywmE&r=ZnVkMm1UMHFmWHNzejI1TlffqTgRgYngUnr3SAFiUmsWi
qzGK6dBlW9tfep801MY&s=7964585ab390894467d9e21a57498f84ada52f1951c00b01c
c9facbdff1f8b32&u=https%3A%2F%2Fqemu.readthedocs.io%2Fen%2Fmaster%2Fint
erop%2Fqemu-qmp-ref.html%23object-QMP-block-core.BlockdevOptions>
+
+While Perl does not have explicit types, the result will need to be
converted to JSON later and
+match the QMP specification (see link above), so implicit types are
important. In the return value,
+use C<JSON::true> and C<JSON::false> for booleans, C<"$value"> for
strings, and C<int($value)> for
+integers.
+
+Arguments:
+
+=over
+
+=item C<$scfg>
+
+The hash reference with the storage configuration.
+
+=item C<$storeid>
+
+The storage ID.
+
+=item C<$volume>
+
+The volume name.
+
+=item C<$snapname>
+
+(optional) The snapshot name. Set when the associated snapshot should
be opened
+rather than the volume itself.
+
+=back
+
+=cut
+sub qemu_blockdev_options {
+ my ($class, $scfg, $storeid, $volname, $snapname) = @_;
+
+ my $blockdev = {};
+
+ my ($path) = $class->path($scfg, $volname, $storeid, $snapname);
+
+ if ($path =~ m|^/|) {
+ # The 'file' driver only works for regular files. The check
below is taken from
+ # block/file-posix.c:hdev_probe_device() in QEMU. Do not
bother with detecting 'host_cdrom'
+ # devices here, those are not managed by the storage layer.
+ my $st = File::stat::stat($path);
+ my $driver = (S_ISCHR($st->mode) || S_ISBLK($st->mode)) ?
'host_device' : 'file';
+ $blockdev = { driver => $driver, filename => $path };
+ } else {
+ die "storage plugin doesn't implement qemu_blockdev_options()
method\n";
+ }
+
+ return $blockdev;
+}
+
# Used by storage plugins for external backup providers. See
PVE::BackupProvider::Plugin for the API
# the provider needs to implement.
#
[-- Attachment #2: Type: text/plain, Size: 160 bytes --]
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next prev parent reply other threads:[~2025-05-23 8:20 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-09 14:15 [pve-devel] [RFC qemu/pve-storage] storage plugin " Fiona Ebner
2025-05-09 14:15 ` [pve-devel] [RFC qemu 1/1] block/rbd: add @keyring-file option to BlockdevOptionsRbd Fiona Ebner
2025-05-12 10:57 ` DERUMIER, Alexandre via pve-devel
[not found] ` <dfc78aa17b9c1c8496fa74cb6e6d2517337b65c0.camel@groupe-cyllene.com>
2025-05-12 11:25 ` Fiona Ebner
2025-05-12 13:39 ` DERUMIER, Alexandre via pve-devel
[not found] ` <330ddb6da2469b425acda6ceb9cdaf5a510a854f.camel@groupe-cyllene.com>
2025-05-12 14:36 ` Fiona Ebner
2025-05-12 14:53 ` DERUMIER, Alexandre via pve-devel
2025-05-09 14:15 ` [pve-devel] [RFC storage 1/3] plugin: add method to get qemu blockdevice options for volume Fiona Ebner
2025-05-23 8:19 ` DERUMIER, Alexandre via pve-devel [this message]
2025-05-23 8:30 ` DERUMIER, Alexandre via pve-devel
[not found] ` <eeb11ec08d36c3a6f5290134158e91ad7be8b432.camel@groupe-cyllene.com>
2025-05-23 8:32 ` Fiona Ebner
2025-05-23 8:42 ` DERUMIER, Alexandre via pve-devel
[not found] ` <2efc51be0c973a3055e8214beef06ea9a1c6583b.camel@groupe-cyllene.com>
2025-05-23 8:46 ` Fiona Ebner
[not found] ` <175dd76aa95365010c8448bdd15eddf30aa39641.camel@groupe-cyllene.com>
2025-05-23 8:38 ` Fiona Ebner
2025-05-23 8:50 ` DERUMIER, Alexandre via pve-devel
[not found] ` <67db7959a03a391df39e9b5af24edc2bed48a21d.camel@groupe-cyllene.com>
2025-05-23 8:54 ` Fiona Ebner
2025-05-23 9:15 ` DERUMIER, Alexandre via pve-devel
[not found] ` <abbb8159177112d0f1f44d1dccc8fc3907bccb73.camel@groupe-cyllene.com>
2025-05-23 9:18 ` Fiona Ebner
2025-05-23 9:23 ` DERUMIER, Alexandre via pve-devel
2025-05-23 9:34 ` DERUMIER, Alexandre via pve-devel
[not found] ` <abebd4ee7f1197d9e549203355c9482bd7b1004a.camel@groupe-cyllene.com>
2025-05-23 9:53 ` Fiona Ebner
2025-05-23 10:30 ` DERUMIER, Alexandre via pve-devel
2025-05-09 14:15 ` [pve-devel] [RFC storage 2/3] iscsi direct plugin: implement method to get qemu blockdevice options Fiona Ebner
2025-05-12 13:14 ` Fiona Ebner
2025-05-09 14:15 ` [pve-devel] [RFC storage 3/3] rbd plugin: implement new " Fiona Ebner
2025-05-09 14:21 ` [pve-devel] [RFC qemu/pve-storage] storage plugin method to get qemu blockdevice options for volume Fiona Ebner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=mailman.615.1747988402.394.pve-devel@lists.proxmox.com \
--to=pve-devel@lists.proxmox.com \
--cc=alexandre.derumier@groupe-cyllene.com \
--cc=f.ebner@proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal