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: |
|