Matthew Booth
2010-Aug-03 16:32 UTC
[Libguestfs] [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
Richard W.M. Jones
2010-Aug-17 10:45 UTC
[Libguestfs] [PATCH] Fix mkinitrd detection of LVM root on RHEL 4
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