--- 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;
--- 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
--- 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>;
}
}
--- 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;
--- 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" ? "" : " "