[PATCH] Fix mkinitrd detection of LVM root on RHEL 4
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
On Tue, Aug 03, 2010 at 05:32:24PM +0100, Matthew Booth wrote:
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 {
Looks OK, ACK. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones New in Fedora 11: Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 70 libraries supprt'd http://fedoraproject.org/wiki/MinGW http://www.annexia.org/fedora_mingw
participants (2)
-
Matthew Booth -
Richard W.M. Jones