SI/lvm.pm
branchstable
changeset 33 6432e90cc34d
parent 26 39421a9700c5
parent 32 8f9e45f83a65
child 34 28090de7d005
equal deleted inserted replaced
26:39421a9700c5 33:6432e90cc34d
     1 package SI::lvm;
       
     2 
       
     3 use if $ENV{DEBUG} ~~ /lvm|all/ => qw(Smart::Comments);
       
     4 
       
     5 use strict;
       
     6 use warnings;
       
     7 use IO::File;
       
     8 use Cwd qw(abs_path);
       
     9 use File::Basename;
       
    10 
       
    11 use SI::tools;
       
    12 
       
    13 my @volumegroups = ();
       
    14 
       
    15 sub _vgs(\%) {
       
    16     return @volumegroups if @volumegroups;
       
    17 
       
    18     my $devs = shift;
       
    19 
       
    20     # find the physical volumes we've already recognised as „non-removable“
       
    21     my @known = keys %{ $devs->{volume} }, keys %{ $devs->{disk} };
       
    22 
       
    23     my @pvs =
       
    24       grep { $_ ~~ @known } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`;
       
    25     @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs 2>/dev/null`;
       
    26     run("vgchange -ay @volumegroups 2>&1 >/dev/null");
       
    27 
       
    28     # we wait for the /dev/mapper devices to appear
       
    29     run("udevadm settle");
       
    30     return @volumegroups;
       
    31 }
       
    32 
       
    33 sub volumes(\%) {
       
    34     my ($devs) = @_;
       
    35 
       
    36     # we can't just use `pvs', since this would return *all*
       
    37     # physical devices known to lvm, not just the non-removable
       
    38 
       
    39     my @vgs = _vgs(%$devs);
       
    40     my @lvs =
       
    41       map { abs_path((dirname $_) . "/" . readlink) }
       
    42       map { s/^\s*//; (split /:/)[0] }
       
    43       grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`;
       
    44     foreach (@lvs) {
       
    45         $devs->{volume}{$_} = { origin => "lvm" };
       
    46     }
       
    47 
       
    48     push @{ $devs->{volumes} }, @lvs;
       
    49 }
       
    50 
       
    51 sub vgcfgbackup($\%) {
       
    52     my ($file, $devs) = @_;
       
    53 
       
    54     # we save it vg by vg to have the restore more easy
       
    55     my @vgs = _vgs(%$devs);
       
    56     foreach (map { s/^\s*(.*)/$1/; $_ = (split /:/)[0] }
       
    57         `vgs --noheadings --separator : @vgs`)
       
    58     {
       
    59         verbose("saving vg $_\n");
       
    60         my $file = sprintf $file, $_;
       
    61         run("vgcfgbackup -f '$file' '$_' >/dev/null");
       
    62     }
       
    63 
       
    64     # for testing let's save it all
       
    65     verbose("saving vg *\n");
       
    66     $file = sprintf $file, "*";
       
    67     run("vgcfgbackup -f '$file' >/dev/null");
       
    68 }
       
    69 
       
    70 1;
       
    71 
       
    72 # vim:sts=4 sw=4 aw ai si: