grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] diskfilter: use nodes in logical volume's segment as member devi


From: Michael Chang
Subject: [PATCH] diskfilter: use nodes in logical volume's segment as member device
Date: Mon, 2 Aug 2021 17:40:20 +0800

Currently the grub_diskfilter_memberlist function returns all physical
volumes added to a volume group to which a logical volume (LV) belongs.
However this is suboptimal as it doesn't fit the intended behavior of
returning underlying devices that make up the LV. To give a clear
picture, the result should be identical to running commands below to
display the logical volumes with underlying physical volumes in use.

  lvs -o +devices /dev/system/root
  lvdisplay --maps /dev/system/root

This change is required if any part of the PV not used by root LV is
encrypted. Using this lvm setup as an example:

  localhost:~ # lsblk
  NAME            MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
  vda             253:0    0   20G  0 disk
  ├─vda1          253:1    0    8M  0 part
  └─vda2          253:2    0   20G  0 part
    ├─system-swap 254:0    0  1.4G  0 lvm   [SWAP]
    └─system-root 254:1    0 18.6G  0 lvm   /
  vdb             253:16   0   10M  0 disk
  └─data          254:2    0    8M  0 crypt
    └─system-data 254:3    0    4M  0 lvm   /data

Running grub-install would end up with error because "system" VG
contains /dev/vdb which is encrypted.

  error: attempt to install to encrypted disk without cryptodisk
  enabled. Set `GRUB_ENABLE_CRYPTODISK=y' in file `/etc/default/grub'.

Certainly we can enable GRUB_ENABLE_CRYPTODISK=y and move on, but that
is not always acceptable since the server may need to boot unattended,
in addition typing passphase for every system startup can be a big
hassle of which most users would like to avoid.

This patch solves the problem by returning physical volumes, /dev/vda2,
rightly used by system-root in the example above, thus changing how
grub-install perceives the underlying block device to boot and avoids
the error from happening.

Signed-off-by: Michael Chang <mchang@suse.de>
Tested-by: Olav Reinert <seroton10@gmail.com>
---
 grub-core/disk/diskfilter.c | 44 +++++++++++++++++++++++--------------
 1 file changed, 27 insertions(+), 17 deletions(-)

diff --git a/grub-core/disk/diskfilter.c b/grub-core/disk/diskfilter.c
index 6eb2349a6..595f5f70f 100644
--- a/grub-core/disk/diskfilter.c
+++ b/grub-core/disk/diskfilter.c
@@ -300,6 +300,8 @@ grub_diskfilter_memberlist (grub_disk_t disk)
   grub_disk_dev_t p;
   struct grub_diskfilter_vg *vg;
   struct grub_diskfilter_lv *lv2 = NULL;
+  struct grub_diskfilter_segment *seg;
+  unsigned int i, j;
 
   if (!lv->vg->pvs)
     return NULL;
@@ -331,25 +333,33 @@ grub_diskfilter_memberlist (grub_disk_t disk)
            }
     }
 
-  for (pv = lv->vg->pvs; pv; pv = pv->next)
-    {
-      if (!pv->disk)
+  for (i = 0, seg = lv->segments; i < lv->segment_count; i++, seg++)
+    for (j =0; j < seg->node_count; ++j)
+      if ((pv = seg->nodes[j].pv))
        {
-         /* TRANSLATORS: This message kicks in during the detection of
-            which modules needs to be included in core image. This happens
-            in the case of degraded RAID and means that autodetection may
-            fail to include some of modules. It's an installation time
-            message, not runtime message.  */
-         grub_util_warn (_("Couldn't find physical volume `%s'."
-                           " Some modules may be missing from core image."),
-                         pv->name);
-         continue;
+
+         if (!pv->disk)
+           {
+             /* TRANSLATORS: This message kicks in during the detection of
+                which modules needs to be included in core image. This happens
+                in the case of degraded RAID and means that autodetection may
+                fail to include some of modules. It's an installation time
+                message, not runtime message.  */
+             grub_util_warn (_("Couldn't find physical volume `%s'."
+                               " Some modules may be missing from core 
image."),
+                             pv->name);
+             continue;
+           }
+
+         for (tmp = list; tmp; tmp = tmp->next)
+           if (grub_strcmp (tmp->disk->name, pv->disk->name) == 0)
+             continue;
+
+         tmp = grub_malloc (sizeof (*tmp));
+         tmp->disk = pv->disk;
+         tmp->next = list;
+         list = tmp;
        }
-      tmp = grub_malloc (sizeof (*tmp));
-      tmp->disk = pv->disk;
-      tmp->next = list;
-      list = tmp;
-    }
 
   return list;
 }
-- 
2.31.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]