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 # verbose("device $name"); |
22 my $dev = "/dev/$name"; |
23 |
23 |
24 if (!-e "$_/device") { |
24 next if !-e "$_/device"; |
25 # verbose("skipping (non-dev)\n"); |
25 next if (grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./; |
26 next; |
26 next if (stat $dev)[0] == (stat $0)[0]; |
27 } |
27 |
28 if ((grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./) { |
28 # exclude the device (stick) we're part of - this HACK is |
29 # verbose("skipping (removable)\n"); |
29 # only useful on KVM - the usb stick doesn't appear as a removeable |
30 next; |
30 # device |
31 } |
31 next if (stat $0)[0] ~~ [map { (stat)[6] } map { "/dev/" . basename(dirname $_) } glob("$_/*/partition")]; |
|
32 |
|
33 |
32 verbose("\n"); |
34 verbose("\n"); |
33 verbose("device $name\n"); |
35 verbose("device $dev\n"); |
34 |
36 |
35 die "ERR: /dev/$name does not exist. (should not happen)" |
37 die "ERR: $dev does not exist. (should not happen): $!" |
36 if !-e "/dev/$name"; |
38 if !-b $dev; |
37 |
39 |
38 # now the physical disk -- let's ask for the partition table |
40 # now the physical disk -- let's ask for the partition table |
39 |
41 |
40 my @sfdisk = `sfdisk -d /dev/$name 2>/dev/null`; |
42 my @sfdisk = `sfdisk -d /dev/$name 2>/dev/null`; |
41 |
43 |
45 |
47 |
46 $devs->{disk}{"/dev/$name"} = { |
48 $devs->{disk}{"/dev/$name"} = { |
47 pt => \@sfdisk |
49 pt => \@sfdisk |
48 }; |
50 }; |
49 |
51 |
50 push @{$devs->{known}}, "/dev/$name"; |
|
51 |
|
52 # and let's prepare the volume entries |
52 # and let's prepare the volume entries |
53 foreach (@sfdisk) { |
53 foreach (@sfdisk) { |
54 /^(\S+)\s*:.*Id=\s*([[:xdigit:]]+)/ or next; |
54 /^(\S+)\s*:.*Id=\s*([[:xdigit:]]+)/ or next; |
55 $devs->{volume}{$1} = { |
55 $devs->{volume}{$1} = { |
56 origin => "ptable", |
56 origin => "ptable", |
57 ptable_type => $2, |
57 ptable_type => $2, |
58 }; |
58 }; |
59 push @{$devs->{known}}, $1; |
|
60 } |
59 } |
61 } |
60 } |
62 |
61 |
63 return; |
62 return; |
64 } |
63 } |