summaryrefslogtreecommitdiffstats
path: root/perl-install/lvm.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/lvm.pm')
-rw-r--r--perl-install/lvm.pm98
1 files changed, 98 insertions, 0 deletions
diff --git a/perl-install/lvm.pm b/perl-install/lvm.pm
new file mode 100644
index 000000000..5ce2b3c03
--- /dev/null
+++ b/perl-install/lvm.pm
@@ -0,0 +1,98 @@
+package lvm; # $Id$
+
+use diagnostics;
+use strict;
+
+#-######################################################################################
+#- misc imports
+#-######################################################################################
+use common qw(:common :functional :system :file);
+use modules;
+use fsedit;
+use devices;
+use run_program;
+
+#- for partition_table_xxx emulation
+sub hasExtended { 0 }
+sub adjustStart {}
+sub adjustEnd {}
+sub write {}
+sub cylinder_size {
+ my ($hd) = @_;
+ $hd->{PE_size};
+}
+
+
+modules::load('lvm-mod');
+run_program::run('vgscan') if !-e '/etc/lvmtab';
+
+sub get_vg {
+ my ($part) = @_;
+ my $dev = devices::make($part->{device});
+ (split(':', `pvdisplay -c $dev`))[1];
+}
+
+sub update_size {
+ my ($lvm) = @_;
+ my @l = split(':', `vgdisplay -c -D $lvm->{LVMname}`);
+ $lvm->{totalsectors} = ($lvm->{PE_size} = $l[12]) * $l[13];
+}
+
+sub get_lvs {
+ my ($lvm) = @_;
+ $lvm->{primary}{normal} =
+ [
+ map {
+ my $type = -e $_ && fsedit::typeOfPart($_);
+ { device => $_,
+ type => $type || 0x83,
+ isFormatted => $type,
+ size => (split(':', `lvdisplay -c $_`))[6] }
+ } map { /^LV Name\s+(\S+)/ ? $1 : () } `vgdisplay -v -D $lvm->{LVMname}`
+ ];
+}
+
+sub vg_add {
+ my ($part) = @_;
+ if (my $old_name = get_vg($part)) {
+ run_program::run('vgchange', '-a', 'n', $old_name);
+ run_program::run('vgremove', $old_name);
+ }
+ my $dev = devices::make($part->{device});
+ run_program::run_or_die('pvcreate', $dev);
+ my $prog = run_program::run('vgdisplay', $part->{lvm}) ? 'vgextend' : 'vgcreate';
+ run_program::run_or_die($prog, $part->{lvm}, $dev);
+}
+
+sub vg_destroy {
+ my ($lvm) = @_;
+
+ is_empty_array_ref($lvm->{primary}{normal}) or die _("Remove the logical volumes first\n");
+ run_program::run('vgchange', '-a', 'n', $lvm->{LVMname});
+ run_program::run_or_die('vgremove', $lvm->{LVMname});
+ foreach (@{$lvm->{disks}}) {
+ delete $_->{lvm};
+ $_->{isFormatted} = 0;
+ $_->{notFormatted} = 1;
+ }
+}
+
+sub lv_delete {
+ my ($lvm, $lv) = @_;
+
+ run_program::run_or_die('lvremove', '-f', $lv->{device});
+
+ my $list = $lvm->{primary}{normal};
+ @$list = grep { $_ != $lv } @$list;
+}
+
+sub lv_create {
+ my ($lvm, $lv) = @_;
+ my $list = $lvm->{primary}{normal};
+ my $nb = 1 + max(map { basename($_) } @$list);
+ $lv->{device} = "/dev/$lvm->{LVMname}/$nb";
+ run_program::run_or_die('lvcreate', '--size', int($lv->{size} / 2) . 'k', '-n', $nb, $lvm->{LVMname});
+ push @$list, $lv;
+}
+
+1;