summaryrefslogtreecommitdiffstats
path: root/perl-install/devices.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/devices.pm')
-rw-r--r--perl-install/devices.pm139
1 files changed, 51 insertions, 88 deletions
diff --git a/perl-install/devices.pm b/perl-install/devices.pm
index 09606f7ca..7ac79dcce 100644
--- a/perl-install/devices.pm
+++ b/perl-install/devices.pm
@@ -1,4 +1,4 @@
-package devices; # $Id$
+package devices;
use diagnostics;
use strict;
@@ -28,7 +28,7 @@ sub set_loop {
my $dev = find_free_loop();
if ($o_encrypt_key && $o_encryption) {
- eval { modules::load('cryptoloop', 'cbc', arch() =~ /i.86/ ? 'aes-i586' : 'aes') };
+ eval { modules::load('cryptoloop', list_modules::category2modules('various/crypto')) };
my $cmd = "losetup -p 0 -e $o_encryption $dev $file";
log::l("calling $cmd");
open(my $F, "|$cmd");
@@ -52,22 +52,9 @@ sub find_compressed_image {
undef;
}
-sub get_dynamic_major {
- my ($name) = @_;
- cat_('/proc/devices') =~ /^(\d+) \Q$name\E$/m && $1;
-}
-
sub init_device_mapper() {
require modules;
eval { modules::load('dm-mod') };
- make('urandom');
- my $control = '/dev/mapper/control';
- if (! -e $control) {
- my ($major) = get_dynamic_major('misc') or return;
- my ($minor) = cat_('/proc/misc') =~ /(\d+) device-mapper$/m or return;
- mkdir_p(dirname($control));
- syscall_('mknod', $control, c::S_IFCHR() | 0600, makedev($major, $minor)) or die "mknod $control failed: $!";
- }
}
sub entry {
@@ -77,25 +64,6 @@ sub entry {
if (/^0x([\da-f]{3,4})$/i) {
$type = c::S_IFBLK();
($major, $minor) = unmakedev(hex $1);
- } elsif (/^(sd.)(\d{0,2})/) {
- my $path = $2 ? "/sys/block/$1/$1$2/dev" : "/sys/block/$1/dev";
- ($major, $minor) = split(':', chomp_(cat_($path)));
- $type = c::S_IFBLK();
- } elsif (/^hd(.)(\d{0,2})/) {
- $type = c::S_IFBLK();
- ($major, $minor) =
- @{ ${{'a' => [3, 0], 'b' => [3, 64],
- 'c' => [22,0], 'd' => [22,64],
- 'e' => [33,0], 'f' => [33,64],
- 'g' => [34,0], 'h' => [34,64],
- 'i' => [56,0], 'j' => [56,64],
- 'k' => [57,0], 'l' => [57,64],
- 'm' => [88,0], 'n' => [88,64],
- 'o' => [89,0], 'p' => [89,64],
- 'q' => [90,0], 'r' => [90,64],
- 's' => [91,0], 't' => [91,64],
- }}{$1} or internal_error("unknown device $_") };
- $minor += $2 || 0;
} elsif (/^ram(.*)/) {
$type = c::S_IFBLK();
$major = 1;
@@ -110,62 +78,57 @@ sub entry {
$type = c::S_IFBLK();
$major = ($1 eq 'ida' ? 72 : 104) + $2;
$minor = 16 * $3 + ($4 || 0);
- } elsif (m,(ataraid)/d(\d+)(?:p(\d+))?,) {
- # ATA raid "ataraid/d0{p1}"
- $type = c::S_IFBLK();
- $major = 114;
- $minor = 16 * $1 + ($2 || 0);
} elsif (my ($prefix, $nb) = /(.*?)(\d+)$/) {
- my $f = ${{"fd" => sub { c::S_IFBLK(), 2, 0 },
- "hidbp-mse-" => sub { c::S_IFCHR(), 10, 32 },
- "lp" => sub { c::S_IFCHR(), 6, 0 },
- "usb/lp" => sub { c::S_IFCHR(), 180, 0 },
- "input/event" => sub { c::S_IFCHR(), 13, 64 },
- "loop" => sub { c::S_IFBLK(), 7, 0 },
+ my $f = ${{
"md" => sub { c::S_IFBLK(), 9, 0 },
- "nst" => sub { c::S_IFCHR(), 9, 128 },
- "sr" => sub { c::S_IFBLK(), 11, 0 },
- "tty" => sub { c::S_IFCHR(), 4, 0 },
- "ttyS" => sub { c::S_IFCHR(), 4, 64 },
"ubd/" => sub { c::S_IFBLK(), 98, 0 },
- "dm-" => sub { c::S_IFBLK(), get_dynamic_major('device-mapper'), 0 },
- }}{$prefix} or internal_error("unknown device $prefix $nb");
- ($type, $major, $minor) = $f->();
- $minor += $nb;
+ }}{$prefix};
+ if ($f) {
+ ($type, $major, $minor) = $f->();
+ $minor += $nb;
+ }
}
unless ($type) {
($type, $major, $minor) =
- @{ ${{"aztcd" => [ c::S_IFBLK(), 29, 0 ],
- "bpcd" => [ c::S_IFBLK(), 41, 0 ],
- "cdu31a" => [ c::S_IFBLK(), 15, 0 ],
- "cdu535" => [ c::S_IFBLK(), 24, 0 ],
- "cm206cd" => [ c::S_IFBLK(), 32, 0 ],
- "gscd" => [ c::S_IFBLK(), 16, 0 ],
- "mcd" => [ c::S_IFBLK(), 23, 0 ],
- "mcdx" => [ c::S_IFBLK(), 20, 0 ],
- "mem" => [ c::S_IFCHR(), 1, 1 ],
- "optcd" => [ c::S_IFBLK(), 17, 0 ],
- "kbd" => [ c::S_IFCHR(), 11, 0 ],
- "psaux" => [ c::S_IFCHR(), 10, 1 ],
+ @{ ${{
"atibm" => [ c::S_IFCHR(), 10, 3 ],
- "random" => [ c::S_IFCHR(), 1, 8 ],
- "urandom" => [ c::S_IFCHR(), 1, 9 ],
- "sbpcd" => [ c::S_IFBLK(), 25, 0 ],
- "sjcd" => [ c::S_IFBLK(), 18, 0 ],
- "tty" => [ c::S_IFCHR(), 5, 0 ],
- "input/mice"
- => [ c::S_IFCHR(), 13, 63 ],
- "adbmouse" => [ c::S_IFCHR(), 10, 10 ], #- PPC
- "vcsa" => [ c::S_IFCHR(), 7, 128 ],
- "zero" => [ c::S_IFCHR(), 1, 5 ],
- "null" => [ c::S_IFCHR(), 1, 3 ],
-
- "initrd" => [ c::S_IFBLK(), 1, 250 ],
- "console" => [ c::S_IFCHR(), 5, 1 ],
- "systty" => [ c::S_IFCHR(), 4, 0 ],
- "lvm" => [ c::S_IFBLK(), 109, 0 ],
- }}{$_} or internal_error("unknown device $_") };
+ }}{$_} || [] };
}
+ # Lookup non listed devices in /sys
+ unless ($type) {
+ my $sysdev;
+ if (m!input/(.*)! && -e "/sys/class/input/$1/dev") {
+ $sysdev = "/sys/class/input/$1/dev";
+ $type = c::S_IFCHR();
+ } elsif (-e "/sys/block/$_/dev") {
+ $sysdev = "/sys/block/$_/dev";
+ $type = c::S_IFBLK();
+ } elsif (/^(.+)(\d+)$/ && -e "/sys/block/$1/$_/dev") {
+ $sysdev = "/sys/block/$1/$_/dev";
+ $type = c::S_IFBLK();
+ }
+ ($major, $minor) = split(':', chomp_(cat_($sysdev)));
+ }
+ # Lookup partitions in /proc/partitions in case /sys was not available
+ unless ($type) {
+ if (-e "/proc/partitions") {
+ if (cat_("/proc/partitions") =~ /^\s*(\d+)\s+(\d+)\s+\d+\s+$_$/m) {
+ ($major, $minor) = ($1, $2);
+ $type = c::S_IFBLK();
+ }
+ }
+ }
+ # Try to access directly the device
+ # Now device mapper devices are links and do not appear in /proc or /sys
+ unless ($type) {
+ if (-e "/dev/$_") {
+ my (undef, undef, $mode, undef, undef, undef, $rdev, undef) = stat("/dev/$_");
+ ($major, $minor) = unmakedev($rdev);
+ $type = $mode & c::S_IFMT();
+ }
+ }
+
+ $type or internal_error("unknown device $_");
($type, $major, $minor);
}
@@ -194,7 +157,7 @@ sub make($) {
sub simple_partition_scan {
my ($part) = @_;
- $part->{device} =~ /([hs]d[a-z])(\d+)$/;
+ $part->{device} =~ /((?:[hsv]|xv)d[a-z]|mmcblk|(nvme\d+n)\d+p)(\d+)$/;
}
sub part_number {
my ($part) = @_;
@@ -207,23 +170,23 @@ sub part_prefix {
sub prefix_for_dev {
my ($dev) = @_;
- $dev . ($dev =~ /\d$/ || $dev =~ m!mapper/! ? 'p' : '');
+ $dev . ($dev =~ /\d$/ ? 'p' : '');
}
sub should_prefer_UUID {
my ($dev) = @_;
- $dev =~ /^(hd|sd)/;
+ $dev =~ /^((?:[hsv]|xv)d|mmcblk|nvme)/;
}
sub symlink_now_and_register {
my ($if_struct, $of) = @_;
my $if = $if_struct->{device};
- #- add a specific udev script, we can't do it with a udev rule,
+ #- add a static udev device node, we can't do it with a udev rule,
#- eg, ttySL0 is a symlink created by a daemon
- output_with_perm("$::prefix/etc/udev/devices.d/$of.nodes", 0644, "L $of $if\n");
+ symlinkf($if, "$::prefix/usr/lib/udev/devices/$of");
- symlinkf($if, "$::prefix/dev/$of");
+ symlinkf($if, "/dev/$of");
}