]> git.proxmox.com Git - pve-installer.git/commitdiff
run env: replace lsblk with hd_list but fix it up a bit
authorWolfgang Bumiller <w.bumiller@proxmox.com>
Tue, 20 Jun 2023 10:01:36 +0000 (12:01 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 20 Jun 2023 12:00:00 +0000 (14:00 +0200)
Instead of lsblk we use the original `hd_list` to be closer
to what we originally had.
However, from the PVE codebase I copied over the use of the
`E: DEVNAME` property to find the `/dev` node like (since
some weird devices can have '!' in /sys with '/' in /dev),
drop the check for `/sys/block/$d/dev`, and provide both the
`/dev` and `/sys/block` path in the output array.

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
Proxmox/Install/RunEnv.pm
proxmox-tui-installer/src/options.rs
proxmox-tui-installer/src/setup.rs

index 0b6c209050733ca1b7d60772c7260ef865526668..dd717fcb2bb2cd2ecc929f3d17837df40f4461cc 100644 (file)
@@ -32,26 +32,58 @@ sub query_total_memory : prototype() {
 }
 
 # Returns a hash.
-# {
-#     name => {
-#         size => <bytes>,
-#     }
-# }
+# [
+#     [ <useless index>, "/dev/path", size_in_blocks, "model", logical_blocksize, <name as found in /sys/block> ]
+# ]
 my sub query_blockdevs : prototype() {
-    my $disks = {};
+    my $res = [];
+    my $count = 0;
+    foreach my $bd (</sys/block/*>) {
+       next if $bd =~ m|^/sys/block/ram\d+$|;
+       next if $bd =~ m|^/sys/block/loop\d+$|;
+       next if $bd =~ m|^/sys/block/md\d+$|;
+       next if $bd =~ m|^/sys/block/dm-.*$|;
+       next if $bd =~ m|^/sys/block/fd\d+$|;
+       next if $bd =~ m|^/sys/block/sr\d+$|;
+
+       my $info = `udevadm info --path $bd --query all`;
+       next if !$info;
+       next if $info !~ m/^E: DEVTYPE=disk$/m;
+       next if $info =~ m/^E: ID_CDROM/m;
+       next if $info =~ m/^E: ID_FS_TYPE=iso9660/m;
+
+       my ($name) = $info =~ m/^N: (\S+)$/m;
+       next if !$name;
+
+       my $dev_path;
+       if ($info =~ m/^E: DEVNAME=(\S+)$/m) {
+           $dev_path = $1;
+       } else {
+           $dev_path = "/dev/$name";
+       }
 
-    # FIXME: not the same as the battle proven way we used in the installer for years!
-    my $lsblk = fromjs(qx/lsblk -e 230 --bytes --json/);
-    for my $disk ($lsblk->{blockdevices}->@*) {
-       my ($name, $ro, $size, $type, $mountpoints) = $disk->@{qw(name ro size type mountpoints)};
+       my $size = file_read_firstline("$bd/size");
+       chomp $size;
+       $size = undef if !($size && $size =~ m/^\d+$/);
+       $size = int($size);
+       next if !$size;
+
+       my $model = file_read_firstline("$bd/device/model") || '';
+       $model =~ s/^\s+//;
+       $model =~ s/\s+$//;
+       if (length ($model) > 30) {
+           $model = substr ($model, 0, 30);
+       }
 
-       next if $type ne 'disk' || $ro;
-       next if grep { defined($_) } @$mountpoints;
+       my $logical_bsize = file_read_firstline("$bd/queue/logical_block_size") // '';
+       chomp $logical_bsize;
+       $logical_bsize = undef if !($logical_bsize && $logical_bsize =~ m/^\d+$/);
+       $logical_bsize = int($logical_bsize);
 
-       $disks->{$name} = { size => $size };
+       push @$res, [$count++, $dev_path, $size, $model, $logical_bsize, "/sys/block/$name"];
     }
 
-    return $disks;
+    return $res;
 }
 
 # Returns a hash.
index 9f6408c9064b3a76a4dd31788d8a3f99f4f437ca..b78e104f136163654e1eac1cb81b00cf11df352a 100644 (file)
@@ -223,6 +223,7 @@ pub enum AdvancedBootdiskOptions {
 #[derive(Clone, Debug, Eq, PartialEq)]
 pub struct Disk {
     pub path: String,
+    pub model: Option<String>,
     pub size: u64,
 }
 
index 635d610b753e57ba5d2204c35715c6c1e18cc383..03cbaa4304b25ffd357b981e47f36825c4f5f9b2 100644 (file)
@@ -157,23 +157,17 @@ fn deserialize_disks_map<'de, D>(deserializer: D) -> Result<Vec<Disk>, D::Error>
 where
     D: Deserializer<'de>,
 {
-    #[derive(Deserialize)]
-    struct DiskDescriptor {
-        size: u64,
-    }
-
-    let map: HashMap<String, DiskDescriptor> = Deserialize::deserialize(deserializer)?;
-
-    let mut result = Vec::with_capacity(map.len());
-    for (path, desc) in map.into_iter() {
-        result.push(Disk {
-            path: format!("/dev/{path}"),
-            size: desc.size,
-        });
-    }
-
-    result.sort();
-    Ok(result)
+    let disks = <Vec<(usize, String, u64, String, u64, String)>>::deserialize(deserializer)?;
+    Ok(disks
+        .into_iter()
+        .map(
+            |(_index, device, size_mb, model, logical_bsize, _syspath)| Disk {
+                size: size_mb * logical_bsize,
+                path: device,
+                model: (!model.is_empty()).then_some(model),
+            },
+        )
+        .collect())
 }
 
 fn deserialize_cidr_list<'de, D>(deserializer: D) -> Result<Vec<CidrAddress>, D::Error>