16 |
16 |
17 # find the partition tables of all |
17 # find the partition tables of all |
18 # non-removable block devices (this may include |
18 # non-removable block devices (this may include |
19 # LVs (used as disk itself) too) |
19 # LVs (used as disk itself) too) |
20 foreach (glob("/sys/block/*")) { |
20 foreach (glob("/sys/block/*")) { |
21 my $name = basename($_); |
21 my $name = basename($_); |
22 my $dev = "/dev/$name"; |
22 my $dev = "/dev/$name"; |
23 |
23 |
24 next if !-e "$_/device"; |
24 next if !-e "$_/device"; |
25 next if (grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./; |
25 next |
26 next if (stat $dev)[0] == (stat $0)[0]; |
26 if (grep { /ATTR{removable}/ } |
|
27 `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./; |
|
28 next if (stat $dev)[0] == (stat $0)[0]; |
27 |
29 |
28 # exclude the device (stick) we're part of - this HACK is |
30 # exclude the device (stick) we're part of - this HACK is |
29 # only useful on KVM - the usb stick doesn't appear as a removeable |
31 # only useful on KVM - the usb stick doesn't appear as a removeable |
30 # device |
32 # device |
31 next if (stat $0)[0] ~~ [map { (stat)[6] } map { "/dev/" . basename(dirname $_) } glob("$_/*/partition")]; |
33 next |
|
34 if (stat $0)[0] ~~ [map { (stat)[6] } |
|
35 map { "/dev/" . basename(dirname $_) } glob("$_/*/partition")]; |
32 |
36 |
|
37 verbose("\n"); |
|
38 verbose("device $dev\n"); |
33 |
39 |
34 verbose("\n"); |
40 die "ERR: $dev does not exist. (should not happen): $!" |
35 verbose("device $dev\n"); |
41 if !-b $dev; |
36 |
42 |
37 die "ERR: $dev does not exist. (should not happen): $!" |
43 # now the physical disk -- let's ask for the partition table |
38 if !-b $dev; |
|
39 |
44 |
40 # now the physical disk -- let's ask for the partition table |
45 my @sfdisk = `sfdisk -d /dev/$name 2>/dev/null`; |
41 |
46 |
42 my @sfdisk = `sfdisk -d /dev/$name 2>/dev/null`; |
47 my $of = sprintf $file, $name; |
|
48 my $oh = new IO::File ">$of" or die "Can't open >$of: $!\n"; |
|
49 print $oh @sfdisk; |
43 |
50 |
44 my $of = sprintf $file, $name; |
51 $devs->{disk}{"/dev/$name"} = { pt => \@sfdisk }; |
45 my $oh = new IO::File ">$of" or die "Can't open >$of: $!\n"; |
|
46 print $oh @sfdisk; |
|
47 |
52 |
48 $devs->{disk}{"/dev/$name"} = { |
53 # and let's prepare the volume entries |
49 pt => \@sfdisk |
54 foreach (@sfdisk) { |
50 }; |
55 /^(\S+)\s*:.*Id=\s*([[:xdigit:]]+)/ or next; |
51 |
56 $devs->{volume}{$1} = { |
52 # and let's prepare the volume entries |
57 origin => "ptable", |
53 foreach (@sfdisk) { |
58 ptable_type => $2, |
54 /^(\S+)\s*:.*Id=\s*([[:xdigit:]]+)/ or next; |
59 }; |
55 $devs->{volume}{$1} = { |
60 } |
56 origin => "ptable", |
|
57 ptable_type => $2, |
|
58 }; |
|
59 } |
|
60 } |
61 } |
61 |
62 |
62 return; |
63 return; |
63 } |
64 } |
64 1; |
65 1; |
|
66 |
65 # vim:sts=4 sw=4 aw ai si: |
67 # vim:sts=4 sw=4 aw ai si: |