[Libguestfs] [PATCH] Fix mkinitrd detection of LVM root on RHEL 4

Matthew Booth mbooth at redhat.com
Tue Aug 3 16:32:24 UTC 2010


RHEL 4's mkinitrd will fail to recognise that root is on LVM when running on a
recent kernel/udev due to changes in naming. This patch detects LVM root for
RHEL 4, and uses a dirty hack to frig mkinitrd if required.

Fixes RHBZ#580461
---
 lib/Sys/VirtV2V/GuestOS/RedHat.pm |   21 +++++++++++++++++++--
 1 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/lib/Sys/VirtV2V/GuestOS/RedHat.pm b/lib/Sys/VirtV2V/GuestOS/RedHat.pm
index 101a64b..74b9de1 100644
--- a/lib/Sys/VirtV2V/GuestOS/RedHat.pm
+++ b/lib/Sys/VirtV2V/GuestOS/RedHat.pm
@@ -1639,13 +1639,14 @@ sub prepare_bootable
     my @modules = @_;
 
     my $g = $self->{g};
+    my $desc = $self->{desc};
 
     # Find the grub entry for the given kernel
     my $initrd;
     my $found = 0;
     eval {
         my $prefix;
-        if ($self->{desc}->{boot}->{grub_fs} eq "/boot") {
+        if ($desc->{boot}->{grub_fs} eq "/boot") {
             $prefix = '';
         } else {
             $prefix = '/boot';
@@ -1720,7 +1721,23 @@ sub prepare_bootable
                 $g->modprobe('loop');
             };
 
-            $g->command(['/sbin/mkinitrd', @module_args, $initrd, $version]);
+            my @env;
+
+            # RHEL 4 mkinitrd determines if the root filesystem is on LVM by
+            # checking if the device name (after following symlinks) starts with
+            # /dev/mapper. However, on recent kernels/udevs, /dev/mapper/foo is
+            # just a symlink to /dev/dm-X. This means that RHEL 4 mkinitrd
+            # running in the appliance fails to detect root on LVM. We check
+            # ourselves if root is on LVM, and frig RHEL 4's mkinitrd if it is
+            # by setting root_lvm=1 in its environment. This overrides an
+            # internal variable in mkinitrd, and is therefore extremely nasty
+            # and applicable only to a particular version of mkinitrd.
+            if ($desc->{distro} eq 'rhel' && $desc->{major_version} eq '4') {
+                push(@env, 'root_lvm=1') if ($g->is_lv($desc->{root_device}));
+            }
+
+            $g->sh(join(' ', @env).' /sbin/mkinitrd '.join(' ', @module_args).
+                   " $initrd $version");
         }
 
         else {
-- 
1.7.2




More information about the Libguestfs mailing list