[Libguestfs] [PATCH v2v 2/2] convert: Remove /dev/mapper/osprober-* devices left around by grub2

Laszlo Ersek lersek at redhat.com
Tue May 17 12:02:35 UTC 2022


On 05/17/22 13:18, Richard W.M. Jones wrote:
> On Tue, May 17, 2022 at 01:10:32PM +0200, Laszlo Ersek wrote:
>> On 05/17/22 12:59, Richard W.M. Jones wrote:
>>> These devices can be left around by grub2 when it runs the osprober
>>> tool after we run “/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg”.
>>> They are read-only mirrors of existing filesystems.  These confuse
>>> later steps in conversion, specifically fstrim.
>>>
>>> Reported-by: Ming Xie
>>> Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2003503
>>> ---
>>>  convert/linux_bootloaders.ml | 9 ++++++++-
>>>  1 file changed, 8 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/convert/linux_bootloaders.ml b/convert/linux_bootloaders.ml
>>> index a70b65a41c..7c5fb0be3f 100644
>>> --- a/convert/linux_bootloaders.ml
>>> +++ b/convert/linux_bootloaders.ml
>>> @@ -345,7 +345,14 @@ object (self)
>>>    method remove_console = self#grub2_update_console ~remove:true
>>>  
>>>    method update () =
>>> -    ignore (g#command [| grub2_mkconfig_cmd; "-o"; grub_config |])
>>> +    ignore (g#command [| grub2_mkconfig_cmd; "-o"; grub_config |]);
>>> +
>>> +    (* Grub2 runs osprober which sometimes leaves around read-only
>>> +     * device-mapper maps covering existing filesystems.  These
>>> +     * confuse later steps (especially fstrim).  So just delete
>>> +     * any if found. (RHBZ#2003503).
>>> +     *)
>>> +    ignore (g#command [| "bash"; "-c"; "rm -f /dev/mapper/osprober-*" |])
>>>  
>>>    method get_config_file () =
>>>      grub_config
>>>
>>
>> Hmm... I'm not sure why this is better than "dmsetup remove", but it
>> does not really matter. We need these nodes to disappear only for the
>> remainder of the conversion -- so command that effects that suffices!
>>
>> Reviewed-by: Laszlo Ersek <lersek at redhat.com>
> 
> Yeah, I'm not really sure what I was thinking there.  I certainly
> *meant* to use dmsetup remove, but maybe ... it's accidentally better?
> 
> The problem with running dmsetup is that we have to run the guest
> command, which might not exist.
> 
> Fun fact I found when investigating this.  Upstream os-prober dropped
> the whole device mapper / dmsetup / osprober-linux-* stuff back in
> 2017.

Wow, indeed! ... Earlier I had trouble finding the upstream repository
for os-prober, but now I've found it:

  https://salsa.debian.org/installer-team/os-prober.git

and the commit you mean is most likely

  b760c18ffec7 ("Remove code using device mapper.", 2017-04-30)

It names three debian bug reports, and sure enough, the last one of
those is what we're hitting:

  "Leaves stale device-mapper entry"
  https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=853163

(The bug report also refers to "dmsetup remove".)

Similar Fedora bug reports ("CLOSED EOL"):

  os-prober gives device-mapper errors
  https://bugzilla.redhat.com/show_bug.cgi?id=1600778

  grub2-mkconfig does not work correctly with os-prober
  https://bugzilla.redhat.com/show_bug.cgi?id=1744693

Then upstream fixed the bug by ripping out the device mapper code. :/

As replacement, the upstream commit recommends "grub-mount" -- which I
guess is not available in RHEL8?

That's right, in dist-git, on the rhel-8.7.0 branch at least, the
"grub.macros" file passes "--disable-grub-mount" to the BIOS and EFI
builds both. :/

This option seems to go back to historical dist-git commit 31004e676e8c
("Rebase to upstream snapshot.", 2013-06-07), which was even part of
rhel-7.0!

In other words, the dmsetup leak was never per se fixed (despite the
many reports), and upstream's recommended alternative has never been
enabled in RHEL. Stellar!

> The current code doesn't mention osprober-linux-* at all.
> So I guess the version in this RHEL 8 guest is quite old.
> 
> Since I'm still testing the (above) version of this patch, let's see
> if "rm" actually works before doing any further work on this.

OK!

Laszlo


More information about the Libguestfs mailing list