16 return @volumegroups if @volumegroups; |
16 return @volumegroups if @volumegroups; |
17 |
17 |
18 my $devs = shift; |
18 my $devs = shift; |
19 |
19 |
20 # find the physical volumes we've already recognised as „non-removable“ |
20 # find the physical volumes we've already recognised as „non-removable“ |
21 my @known = keys %{$devs->{volume}}, keys %{$devs->{disk}}; |
21 my @known = keys %{ $devs->{volume} }, keys %{ $devs->{disk} }; |
22 |
22 |
23 my @pvs = grep { $_ ~~ @known } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`; |
23 my @pvs = |
|
24 grep { $_ ~~ @known } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`; |
24 @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs 2>/dev/null`; |
25 @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs 2>/dev/null`; |
25 run("vgchange -ay @volumegroups 2>&1 >/dev/null"); |
26 run("vgchange -ay @volumegroups 2>&1 >/dev/null"); |
26 return @volumegroups; |
27 return @volumegroups; |
27 } |
28 } |
28 |
29 |
31 |
32 |
32 # we can't just use `pvs', since this would return *all* |
33 # we can't just use `pvs', since this would return *all* |
33 # physical devices known to lvm, not just the non-removable |
34 # physical devices known to lvm, not just the non-removable |
34 |
35 |
35 my @vgs = _vgs(%$devs); |
36 my @vgs = _vgs(%$devs); |
36 my @lvs = |
37 my @lvs = |
37 map { abs_path ((dirname $_) . "/" . readlink) } |
38 map { abs_path((dirname $_) . "/" . readlink) } |
38 map { s/^\s*//; (split /:/)[0] } |
39 map { s/^\s*//; (split /:/)[0] } |
39 grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`; |
40 grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`; |
40 foreach (@lvs) { |
41 foreach (@lvs) { |
41 $devs->{volume}{$_} = { origin => "lvm" }; |
42 $devs->{volume}{$_} = { origin => "lvm" }; |
42 } |
43 } |
43 } |
44 } |
44 |
45 |
45 sub vgcfgbackup($\%) { |
46 sub vgcfgbackup($\%) { |
46 my ($file, $devs) = @_; |
47 my ($file, $devs) = @_; |
47 |
48 |
48 # we save it vg by vg to have the restore more easy |
49 # we save it vg by vg to have the restore more easy |
49 my @vgs = _vgs(%$devs); |
50 my @vgs = _vgs(%$devs); |
50 foreach ( map { s/^\s*(.*)/$1/; $_ = (split /:/)[0] } `vgs --noheadings --separator : @vgs`) |
51 foreach (map { s/^\s*(.*)/$1/; $_ = (split /:/)[0] } |
|
52 `vgs --noheadings --separator : @vgs`) |
51 { |
53 { |
52 verbose("saving vg $_\n"); |
54 verbose("saving vg $_\n"); |
53 my $file = sprintf $file, $_; |
55 my $file = sprintf $file, $_; |
54 run("vgcfgbackup -f '$file' '$_' >/dev/null"); |
56 run("vgcfgbackup -f '$file' '$_' >/dev/null"); |
55 } |
57 } |
56 |
58 |
57 # for testing let's save it all |
59 # for testing let's save it all |