# HG changeset patch # User Heiko Schlittermann # Date 1263732850 -3600 # Node ID 2e3ad71484ea841e5e519459f25ec69430fac222 # Parent a1aee1136609e6402d0ce99b9a770486e9c6f954 did some cleanup, works for physical devices only diff -r a1aee1136609 -r 2e3ad71484ea SI/blkid.pm --- a/SI/blkid.pm Mon Jan 18 20:35:27 2010 +0100 +++ b/SI/blkid.pm Sun Jan 17 13:54:10 2010 +0100 @@ -11,21 +11,15 @@ sub ids($\%) { my ($file, $devs) = @_; - verbose("reading blkids:"); - foreach (`blkid -c /dev/null`) { + my @volumes = sort keys %{$devs->{volume}}; + verbose("reading blkids: @volumes"); + foreach (`blkid -c /dev/null @volumes`) { my $dev = (split /:/)[0]; - ### $dev - verbose($dev); my ($uuid) = /\sUUID=.(.*?).\s/; my ($type) = /\sTYPE=.(.*?).\s/; my ($label) = /\sLABEL=.(.*?).\s/; - # dev mapper names should be replaced by nicer ones - if ($dev =~ /\/dev\/dm-/) { - $dev = find_by_devid("/dev/mapper", (stat $dev)[6]); - }; - if (exists $devs->{volume}{$dev}) { $devs->{volume}{$dev}{uuid} = $uuid; $devs->{volume}{$dev}{type} = $type; diff -r a1aee1136609 -r 2e3ad71484ea SI/lvm.pm --- a/SI/lvm.pm Mon Jan 18 20:35:27 2010 +0100 +++ b/SI/lvm.pm Sun Jan 17 13:54:10 2010 +0100 @@ -16,8 +16,8 @@ my $devs = shift; - # find the physical volumes we already recognised as „non-removable“ - my @pvs = grep { $_ ~~ $devs->{disk} } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`; + # find the physical volumes we've already recognised as „non-removable“ + my @pvs = grep { $_ ~~ $devs->{known} } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`; return @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs 2>/dev/null`; } @@ -32,15 +32,9 @@ map { s/^\s*//; (split /:/)[0] } grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`; - foreach (keys %{$devs->{volume}}) { - warn "---> $_\n"; - $devs->{volume}{$_} = { - vol_type => ($_ ~~ @lvs) ? "lv" : "", - } + foreach (@lvs) { + $devs->{volume}{$_} = { origin => "lvm" }; } -### $devs - #@{$devs->{volume}}{@lvs} = map { { vol_type => "lv" } } @lvs; - } sub vgcfgbackup($\%) { @@ -52,7 +46,7 @@ { verbose("saving vg $_\n"); my $file = sprintf $file, $_; - run("vgcfgbackup -f $file $_ >/dev/null"); + run("vgcfgbackup -f '$file' '$_' >/dev/null"); } # for testing let's save it all diff -r a1aee1136609 -r 2e3ad71484ea SI/mbr.pm --- a/SI/mbr.pm Mon Jan 18 20:35:27 2010 +0100 +++ b/SI/mbr.pm Sun Jan 17 13:54:10 2010 +0100 @@ -3,6 +3,7 @@ use strict; use warnings; use File::Basename; +use IO::File; use if $ENV{DEBUG} ~~ q(mbr) => "Smart::Comments"; use SI::tools; @@ -14,9 +15,9 @@ foreach my $disk (keys %{$devs->{disk}}) { verbose("saving mbr of $disk\n"); open((my $o), $_ = sprintf(">$file", basename($disk))) or die "Can't open $_: $!\n"; + local $/ = \512; - - open(my $in, $disk) or die "Can't open $disk: $!\n"; + my $in = new IO::File $disk or die "Can't open $disk: $!\n"; print $o $_ = <$in>; } } diff -r a1aee1136609 -r 2e3ad71484ea SI/ptable.pm --- a/SI/ptable.pm Mon Jan 18 20:35:27 2010 +0100 +++ b/SI/ptable.pm Sun Jan 17 13:54:10 2010 +0100 @@ -5,68 +5,58 @@ use strict; use warnings; use File::Find; +use File::Basename; use IO::File; - use SI::tools; $ENV{LC_ALL} = "C"; sub volumes($\%) { my ($file, $devs) = @_; - # find the non-removable devices - - my ($current, $of); - foreach (`sfdisk -d 2>/dev/null`) { - chomp; + # find the partition tables of all + # non-removable block devices (this may include + # LVs (used as disk itself) too) + foreach (glob("/sys/block/*")) { + my $name = basename($_); + verbose("device $name"); - # new entry, new disk - if (my ($device, $name) = /^# partition table .*?(\/\S+\/(\S+))/) { - verbose("scanning device $device"); - + if (!-e "$_/device") { + verbose("skipping (non-dev)\n"); + next; + } if ((grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./) { - $current = undef; verbose("skipping (removable)\n"); next; } + verbose("\n"); - # if it looks like a device mapper, we'll have to remember - # this - if ($device =~ /\/dev\/dm-/) { - if (my $alias = find_by_devid("/dev/mapper", (stat $device)[6])) { - verbose("(alias $device)"); - $devs->{disk}{$alias}{dm} = $device; - $device = $alias; - } - } + die "ERR: /dev/$name does not exist. (should not happen)" + if !-e "/dev/$name"; + + # now the physical disk -- let's ask for the partition table - # save in our data structure - verbose("\n"); - $current = $device; - push @{$devs->{disk}{$current}{pt}}, $_; + my @sfdisk = `sfdisk -d /dev/$name 2>/dev/null`; + + my $of = sprintf $file, $name; + my $oh = new IO::File ">$of" or die "Can't open >$of: $!\n"; + print $oh @sfdisk; - # and open the outfile - my $f = sprintf ">$file", $name; - $of = new IO::File $f or die "ERR: Can't open $f: $!\n"; - print $of "$_\n"; + $devs->{disk}{"/dev/$name"} = { + pt => \@sfdisk + }; - next; - } - - next if not $current; + push @{$devs->{known}}, "/dev/$name"; - push @{$devs->{disk}{$current}{pt}}, $_; - print $of "$_\n"; - - # if it looks like a partition (volume), then - # save it - if (my ($dev, $id) = /^(\/dev\/\S+)\s*:.*\sId=\s*(\d+)/) { - if (my $dm = $devs->{disk}{$current}{dm}) { - $dev =~ s/$dm/$current/; + # and let's prepare the volume entries + foreach (@sfdisk) { + /^(\S+)\s*:.*Id=\s*(\d+)/ or next; + $devs->{volume}{$1} = { + origin => "ptable", + ptable_type => $2, + }; + push @{$devs->{known}}, $1; } - $devs->{volume}{$dev}{fstype} = $id; - } - } return; diff -r a1aee1136609 -r 2e3ad71484ea SI/tools.pm --- a/SI/tools.pm Mon Jan 18 20:35:27 2010 +0100 +++ b/SI/tools.pm Sun Jan 17 13:54:10 2010 +0100 @@ -7,7 +7,7 @@ use File::Find; use base "Exporter"; -our @EXPORT = qw(&run &verbose &find_by_devid); +our @EXPORT = qw(&run &verbose &find_by_devid &cat); sub run(@) { system(@_); @@ -15,6 +15,13 @@ if $?; } +sub cat($) { + my $fh = new IO::File $_[0] + or die "Can't open $_[0]: $!\n"; + return(<$fh>) if wantarray; + return join "", <$fh>; +} + my $last = "\n"; sub verbose(@) { print $last eq "\n" ? "" : " "