---- Changes since 1.440 ----
Filesystem space used is show on the logical volume list, and the field for a new volume's size is more user-friendly.
When using newer versions of the resize2fs command, EXT filesystems can be shrunk as well as enlarged.
+---- Changes since 1.480 ----
+When creating a logical volume, size can now be specified as a fraction of the volume group size, free space, or free space on some physical volume.
&ui_textbox("name", $lv->{'name'}, 20));
if (!$in{'lv'}) {
- # Can show nice size chooser
+ # Can show nice size chooser for absolute or relative size
+ @pvopts = map { $_->{'name'} }
+ &list_physical_volumes($in{'vg'});
print &ui_table_row($text{'lv_size'},
- &ui_bytesbox("size", $lv->{'size'}*1024, 8));
+ &ui_radio_table("size_mode", 0,
+ [ [ 0, $text{'lv_size0'},
+ &ui_bytesbox("size", $lv->{'size'}*1024, 8) ],
+ [ 1, $text{'lv_size1'},
+ &ui_textbox("vgsize", undef, 4)."%" ],
+ [ 2, $text{'lv_size2'},
+ &ui_textbox("freesize", undef, 4)."%" ],
+ [ 3, $text{'lv_size3'},
+ &text('lv_size3a',
+ &ui_textbox("pvsize", undef, 4)."%",
+ &ui_select("pvof", undef, \@pvopts)) ],
+ ]), 3);
}
else {
# Show in exactly kB
lv_header=Logical volume details
lv_name=Volume name
lv_size=Volume size
+lv_size0=Absolute size
+lv_size1=Percentage of VG size
+lv_size2=Percentage of VG free space
+lv_size3=Percentage of PV free space
+lv_size3a=$1 of $2
lv_device=Device file
lv_status=Current status
lv_mount=Mounted on $1 as $2
lv_ename=Missing or invalid volume name
lv_esame=A logical volume with the same name already exists
lv_esize=Missing or invalid volume size
+lv_evgsize=Missing or invalid volume group size percentage
+lv_efreesize=Missing or invalid free volume group size percentage
+lv_epvsize=Missing or invalid free physical volume size percentage
lv_estripe=Missing or invalid number of stripes
lv_delete=Delete Logical Volume
lv_rusure=Are you sure you want to delete the logical volume $1 ? Any data in a filesystem on this logical volume will be deleted forever!
# Use the lvdisplay command
local $lv;
local $_;
+ local ($vg) = grep { $_->{'name'} eq $_[0] } &list_volume_groups();
open(DISPLAY, "lvdisplay |");
while(<DISPLAY>) {
s/\r|\n//g;
elsif (/LV\s+Size\s+(\S+)\s+(\S+)/i) {
$lv->{'size'} = &mult_units($1, $2);
}
+ elsif (/Current\s+LE\s+(\d+)/ && $vg) {
+ $lv->{'size'} = $1 * $vg->{'pe_size'};
+ }
elsif (/LV\s+Write\s+Access\s+(\S+)/i) {
$lv->{'perm'} = $1 eq 'read/write' ? 'rw' : 'r';
}
# create_logical_volume(&lv)
sub create_logical_volume
{
-local $cmd = "lvcreate -n$_[0]->{'name'} -L$_[0]->{'size'}k";
+local $cmd = "lvcreate -n$_[0]->{'name'} ";
+local $suffix;
+if ($_[0]->{'size_of'} eq 'VG' || $_[0]->{'size_of'} eq 'FREE') {
+ $cmd .= "-l $_[0]->{'size'}%$_[0]->{'size_of'}";
+ }
+elsif ($_[0]->{'size_of'}) {
+ $cmd .= "-l $_[0]->{'size'}%PVS";
+ $suffix = " /dev/".$_[0]->{'size_of'};
+ }
+else {
+ $cmd .= "-L$_[0]->{'size'}k";
+ }
if ($_[0]->{'is_snap'}) {
$cmd .= " -s '/dev/$_[0]->{'vg'}/$_[0]->{'snapof'}'";
}
$cmd .= " -i $_[0]->{'stripe'}" if ($_[0]->{'stripe'});
$cmd .= " $_[0]->{'vg'}";
}
+$cmd .= $suffix;
local $out = &backquote_logged("$cmd 2>&1 </dev/null");
return $? ? $out : undef;
}
&list_logical_volumes($in{'vg'});
$same && (!$in{'lv'} || $in{'lv'} ne $in{'name'}) &&
&error($text{'lv_esame'});
- $in{'size'} =~ /^\d+$/ || &error($text{'lv_esize'});
- if (defined($in{'size_units'})) {
- # Convert selected units to kB
- $in{'size'} = $in{'size'}*$in{'size_units'}/1024;
- delete($in{'size_units'});
+ if ($in{'size_mode'} == 0) {
+ # Absolute size
+ $in{'size'} =~ /^\d+$/ || &error($text{'lv_esize'});
+ $size = $in{'size'};
+ if (defined($in{'size_units'})) {
+ # Convert selected units to kB
+ $size *= $in{'size_units'}/1024;
+ delete($in{'size_units'});
+ }
+ $sizeof = undef;
+ }
+ elsif ($in{'size_mode'} == 1) {
+ # Size of VG
+ $in{'vgsize'} =~ /^\d+$/ &&
+ $in{'vgsize'} > 0 &&
+ $in{'vgsize'} <= 100 || &error($text{'lv_evgsize'});
+ $size = $in{'vgsize'};
+ $sizeof = 'VG';
+ }
+ elsif ($in{'size_mode'} == 2) {
+ # Size of free space
+ $in{'freesize'} =~ /^\d+$/ &&
+ $in{'freesize'} > 0 &&
+ $in{'freesize'} <= 100 || &error($text{'lv_efreesize'});
+ $size = $in{'freesize'};
+ $sizeof = 'FREE';
+ }
+ else {
+ # Size of some PV
+ $in{'pvsize'} =~ /^\d+$/ &&
+ $in{'pvsize'} > 0 &&
+ $in{'pvsize'} <= 100 || &error($text{'lv_epvsize'});
+ $size = $in{'pvsize'};
+ $sizeof = $in{'pvof'};
}
$in{'snap'} || $in{'lv'} || $in{'stripe_def'} ||
$in{'stripe'} =~ /^[1-9]\d*$/ || &error($text{'lv_estripe'});
# Just create the logical volume
$lv->{'vg'} = $in{'vg'};
$lv->{'name'} = $in{'name'};
- $lv->{'size'} = $in{'size'};
+ $lv->{'size'} = $size;
+ $lv->{'size_of'} = $sizeof;
if ($in{'snap'}) {
$lv->{'is_snap'} = 1;
$lv->{'snapof'} = $in{'snapof'};