SI/lvm.pm
changeset 7 03ca6d811a17
parent 6 df6ca24871d4
child 10 23dd30396607
equal deleted inserted replaced
6:df6ca24871d4 7:03ca6d811a17
     1 package SI::lvm;
     1 package SI::lvm;
     2 
     2 
     3 use strict;
     3 use strict;
     4 use warnings;
     4 use warnings;
       
     5 use IO::File;
       
     6 
       
     7 use if $ENV{DEBUG} ~~ /lvm|all/ => qw(Smart::Comments);
       
     8 
     5 use SI::tools;
     9 use SI::tools;
     6 
    10 
       
    11 my @volumegroups = ();
       
    12 
       
    13 sub _vgs(\%) {
       
    14     return @volumegroups if @volumegroups;
       
    15 
       
    16     my $devs = shift;
       
    17 
       
    18     my @pvs = grep { $devs->{volume}{$_}{type} =~ /^lvm/ } 
       
    19 	grep { defined $devs->{volume}{$_} }
       
    20 	keys %{$devs->{volume}};
       
    21 
       
    22     return @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs`;
       
    23 }
       
    24 
       
    25 sub volumes(\%) {
       
    26     my ($devs) = @_;
       
    27 
       
    28     # we can't just use `pvs', since this would return *all*
       
    29     # physical devices known to lvm, not just the non-removable
       
    30     my @pvs = grep { $devs->{volume}{$_}{type} =~ /^lvm/ } 
       
    31 	grep { defined $devs->{volume}{$_} }
       
    32 	keys %{$devs->{volume}};
       
    33 
       
    34     my @vgs = _vgs(%$devs);
       
    35     my @lvs = map { readlink } 
       
    36 	      map { s/^\s*//; (split /:/)[0] } 
       
    37 	      grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`;
       
    38 
       
    39     @{$devs->{volume}}{@lvs} = ();
       
    40 
       
    41 
       
    42 }
       
    43 
     7 sub vgcfgbackup($\%) {
    44 sub vgcfgbackup($\%) {
     8     my ($file, $part) = @_;
    45     my ($file, $devs) = @_;
     9     foreach (map { (split /:/)[0] }
    46 
    10         map { /^\s*(.*)/; } `vgs --noheadings --separator :`)
    47     # we save it vg by vg to have the restore more easy
       
    48     my @vgs = _vgs(%$devs);
       
    49     foreach ( map { s/^\s*(.*)/$1/; $_ = (split /:/)[0] } `vgs --noheadings --separator : @vgs`)
    11     {
    50     {
       
    51 	verbose("saving vg $_\n");
    12         my $file = sprintf $file, $_;
    52         my $file = sprintf $file, $_;
    13         run("vgcfgbackup -f $file >/dev/null");
    53         run("vgcfgbackup -f $file $_ >/dev/null");
    14     }
    54     }
       
    55 
       
    56     # for testing let's save it all
       
    57     verbose("saving vg *\n");
       
    58     $file = sprintf $file, "*";
       
    59     run("vgcfgbackup -f '$file' >/dev/null");
    15 }
    60 }
    16 
    61 
    17 1;
    62 1;
    18 # vim:sts=4 sw=4 aw ai si:
    63 # vim:sts=4 sw=4 aw ai si: