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