fix #5071: zfs over iscsi: add 'zfs-base-path' configuration option
Use '/dev/zvol' as a base path for new storages for providers 'iet' and 'LIO', because that is what modern distributions use. This is a breaking change regarding the addition of new storages on older distributions, but it's enough to specify the base path '/dev' explicitly for setups that require it. Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> Tested-by: Christoph Heiss <c.heiss@proxmox.com> Link: https://lore.proxmox.com/20250605111109.52712-1-f.ebner@proxmox.com
This commit is contained in:
committed by
Thomas Lamprecht
parent
7ecab87144
commit
d181d0b1ee
@ -32,7 +32,8 @@ my $get_lun_cmd_map = sub {
|
|||||||
};
|
};
|
||||||
|
|
||||||
sub get_base {
|
sub get_base {
|
||||||
return '/dev/zvol/rdsk';
|
my ($scfg) = @_;
|
||||||
|
return $scfg->{'zfs-base-path'} || '/dev/zvol/rdsk';
|
||||||
}
|
}
|
||||||
|
|
||||||
sub run_lun_command {
|
sub run_lun_command {
|
||||||
|
|||||||
@ -138,7 +138,7 @@ my $parser = sub {
|
|||||||
|
|
||||||
my $line = 0;
|
my $line = 0;
|
||||||
|
|
||||||
my $base = get_base;
|
my $base = get_base($scfg);
|
||||||
my $config = $get_config->($scfg);
|
my $config = $get_config->($scfg);
|
||||||
my @cfgfile = split "\n", $config;
|
my @cfgfile = split "\n", $config;
|
||||||
|
|
||||||
@ -482,7 +482,8 @@ sub run_lun_command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub get_base {
|
sub get_base {
|
||||||
return '/dev';
|
my ($scfg) = @_;
|
||||||
|
return $scfg->{'zfs-base-path'} || '/dev';
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@ -306,7 +306,7 @@ my $parser = sub {
|
|||||||
$CONFIG =~ s/\n$//;
|
$CONFIG =~ s/\n$//;
|
||||||
die "$scfg->{target}: Target not found" unless $SETTINGS->{targets};
|
die "$scfg->{target}: Target not found" unless $SETTINGS->{targets};
|
||||||
my $max = $SETTINGS->{targets};
|
my $max = $SETTINGS->{targets};
|
||||||
my $base = get_base;
|
my $base = get_base($scfg);
|
||||||
|
|
||||||
for (my $i = 1; $i <= $max; $i++) {
|
for (my $i = 1; $i <= $max; $i++) {
|
||||||
my $target = $SETTINGS->{nodebase} . ':' . $SETTINGS->{"LogicalUnit$i"}->{TargetName};
|
my $target = $SETTINGS->{nodebase} . ':' . $SETTINGS->{"LogicalUnit$i"}->{TargetName};
|
||||||
@ -612,7 +612,8 @@ sub run_lun_command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub get_base {
|
sub get_base {
|
||||||
return '/dev/zvol';
|
my ($scfg) = @_;
|
||||||
|
return $scfg->{'zfs-base-path'} || '/dev/zvol';
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@ -231,7 +231,7 @@ my $extract_volname = sub {
|
|||||||
my ($scfg, $lunpath) = @_;
|
my ($scfg, $lunpath) = @_;
|
||||||
my $volname = undef;
|
my $volname = undef;
|
||||||
|
|
||||||
my $base = get_base;
|
my $base = get_base($scfg);
|
||||||
if ($lunpath =~ /^$base\/$scfg->{pool}\/([\w\-]+)$/) {
|
if ($lunpath =~ /^$base\/$scfg->{pool}\/([\w\-]+)$/) {
|
||||||
$volname = $1;
|
$volname = $1;
|
||||||
my $prefix = $get_backstore_prefix->($scfg);
|
my $prefix = $get_backstore_prefix->($scfg);
|
||||||
@ -422,7 +422,8 @@ sub run_lun_command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub get_base {
|
sub get_base {
|
||||||
return '/dev';
|
my ($scfg) = @_;
|
||||||
|
return $scfg->{'zfs-base-path'} || '/dev';
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@ -38,13 +38,13 @@ my $zfs_get_base = sub {
|
|||||||
my ($scfg) = @_;
|
my ($scfg) = @_;
|
||||||
|
|
||||||
if ($scfg->{iscsiprovider} eq 'comstar') {
|
if ($scfg->{iscsiprovider} eq 'comstar') {
|
||||||
return PVE::Storage::LunCmd::Comstar::get_base;
|
return PVE::Storage::LunCmd::Comstar::get_base($scfg);
|
||||||
} elsif ($scfg->{iscsiprovider} eq 'istgt') {
|
} elsif ($scfg->{iscsiprovider} eq 'istgt') {
|
||||||
return PVE::Storage::LunCmd::Istgt::get_base;
|
return PVE::Storage::LunCmd::Istgt::get_base($scfg);
|
||||||
} elsif ($scfg->{iscsiprovider} eq 'iet') {
|
} elsif ($scfg->{iscsiprovider} eq 'iet') {
|
||||||
return PVE::Storage::LunCmd::Iet::get_base;
|
return PVE::Storage::LunCmd::Iet::get_base($scfg);
|
||||||
} elsif ($scfg->{iscsiprovider} eq 'LIO') {
|
} elsif ($scfg->{iscsiprovider} eq 'LIO') {
|
||||||
return PVE::Storage::LunCmd::LIO::get_base;
|
return PVE::Storage::LunCmd::LIO::get_base($scfg);
|
||||||
} else {
|
} else {
|
||||||
$zfs_unknown_scsi_provider->($scfg->{iscsiprovider});
|
$zfs_unknown_scsi_provider->($scfg->{iscsiprovider});
|
||||||
}
|
}
|
||||||
@ -204,6 +204,12 @@ sub properties {
|
|||||||
description => "target portal group for Linux LIO targets",
|
description => "target portal group for Linux LIO targets",
|
||||||
type => 'string',
|
type => 'string',
|
||||||
},
|
},
|
||||||
|
'zfs-base-path' => {
|
||||||
|
description => "Base path where to look for the created ZFS block devices. Set"
|
||||||
|
. " automatically during creation if not specified. Usually '/dev/zvol'.",
|
||||||
|
type => 'string',
|
||||||
|
format => 'pve-storage-path',
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,11 +229,36 @@ sub options {
|
|||||||
lio_tpg => { optional => 1 },
|
lio_tpg => { optional => 1 },
|
||||||
content => { optional => 1 },
|
content => { optional => 1 },
|
||||||
bwlimit => { optional => 1 },
|
bwlimit => { optional => 1 },
|
||||||
|
'zfs-base-path' => { optional => 1 },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
# Storage implementation
|
# Storage implementation
|
||||||
|
|
||||||
|
sub on_add_hook {
|
||||||
|
my ($class, $storeid, $scfg, %param) = @_;
|
||||||
|
|
||||||
|
if (!$scfg->{'zfs-base-path'}) {
|
||||||
|
my $base_path;
|
||||||
|
if ($scfg->{iscsiprovider} eq 'comstar') {
|
||||||
|
$base_path = PVE::Storage::LunCmd::Comstar::get_base($scfg);
|
||||||
|
} elsif ($scfg->{iscsiprovider} eq 'istgt') {
|
||||||
|
$base_path = PVE::Storage::LunCmd::Istgt::get_base($scfg);
|
||||||
|
} elsif ($scfg->{iscsiprovider} eq 'iet' || $scfg->{iscsiprovider} eq 'LIO') {
|
||||||
|
# Provider implementations hard-code '/dev/', which does not work for distributions like
|
||||||
|
# Debian 12. Keep that implementation as-is for backwards compatibility, but use
|
||||||
|
# '/dev/zvol' here.
|
||||||
|
$base_path = '/dev/zvol';
|
||||||
|
} else {
|
||||||
|
$zfs_unknown_scsi_provider->($scfg->{iscsiprovider});
|
||||||
|
}
|
||||||
|
|
||||||
|
$scfg->{'zfs-base-path'} = $base_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
sub path {
|
sub path {
|
||||||
my ($class, $scfg, $volname, $storeid, $snapname) = @_;
|
my ($class, $scfg, $volname, $storeid, $snapname) = @_;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user