SI/lvm.pm
changeset 15 4e3753b998a9
parent 13 2e3ad71484ea
child 16 fd87c1e3b451
equal deleted inserted replaced
14:aecda2763079 15:4e3753b998a9
     3 use if $ENV{DEBUG} ~~ /lvm|all/ => qw(Smart::Comments);
     3 use if $ENV{DEBUG} ~~ /lvm|all/ => qw(Smart::Comments);
     4 
     4 
     5 use strict;
     5 use strict;
     6 use warnings;
     6 use warnings;
     7 use IO::File;
     7 use IO::File;
     8 
     8 use Cwd qw(abs_path);
       
     9 use File::Basename;
     9 
    10 
    10 use SI::tools;
    11 use SI::tools;
    11 
    12 
    12 my @volumegroups = ();
    13 my @volumegroups = ();
    13 
    14 
    14 sub _vgs(\%) {
    15 sub _vgs(\%) {
    15     return @volumegroups if @volumegroups;
    16     return @volumegroups if @volumegroups;
    16 
    17 
    17     my $devs = shift;
    18     my $devs = shift;
       
    19 
    18 
    20 
    19     # find the physical volumes we've already recognised as „non-removable“
    21     # find the physical volumes we've already recognised as „non-removable“
    20     my @pvs = grep { $_ ~~ $devs->{known} } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`;
    22     my @pvs = grep { $_ ~~ $devs->{known} } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`;
    21     return @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs 2>/dev/null`;
    23     return @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs 2>/dev/null`;
    22 }
    24 }
    26 
    28 
    27     # we can't just use `pvs', since this would return *all*
    29     # we can't just use `pvs', since this would return *all*
    28     # physical devices known to lvm, not just the non-removable
    30     # physical devices known to lvm, not just the non-removable
    29 
    31 
    30     my @vgs = _vgs(%$devs);
    32     my @vgs = _vgs(%$devs);
    31     my @lvs = map { readlink } 
    33     run("vgchange -ay @vgs 2>/dev/null");
       
    34 
       
    35     my @lvs = 
       
    36 	      map { abs_path ((dirname $_) . "/" . readlink) } 
    32 	      map { s/^\s*//; (split /:/)[0] } 
    37 	      map { s/^\s*//; (split /:/)[0] } 
    33 	      grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`;
    38 	      grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`;
    34 
       
    35     foreach (@lvs) {
    39     foreach (@lvs) {
    36 	$devs->{volume}{$_} = { origin => "lvm" };
    40 	$devs->{volume}{$_} = { origin => "lvm" };
    37     }
    41     }
    38 }
    42 }
    39 
    43