[Libguestfs] [PATCH] Fix architecture detection of Linux guests with invalid grub.conf

Richard W.M. Jones rjones at redhat.com
Wed Jan 19 16:45:25 UTC 2011


On Wed, Jan 19, 2011 at 04:35:04PM +0000, Matthew Booth wrote:
> If a Linux guest's grub.conf contained a default kernel which referred to
> non-existent kernel, architecture detection would default to i686. For an x86_64
> guest, the result would not boot.
> 
> This change uses the first grub.conf entry if the default is invalid or not
> present, and falls back to the architecture detected by inspection otherwise. If
> neither of these yield an architecture, it defaults to x86_64 instead of i686 as
> a more conservative default.
> 
> Fixes RHBZ#623579

> ---
>  lib/Sys/VirtV2V/Converter/RedHat.pm |   21 ++++++++++++---------
>  1 files changed, 12 insertions(+), 9 deletions(-)
> 
> diff --git a/lib/Sys/VirtV2V/Converter/RedHat.pm b/lib/Sys/VirtV2V/Converter/RedHat.pm
> index 78a454a..a8a7051 100644
> --- a/lib/Sys/VirtV2V/Converter/RedHat.pm
> +++ b/lib/Sys/VirtV2V/Converter/RedHat.pm
> @@ -610,17 +610,20 @@ sub _get_os_arch
>      my $boot = $desc->{boot};
>      my $default_boot = $boot->{default} if(defined($boot));
>  
> -    my $arch;
> -    if(defined($default_boot)) {
> -        my $config = $boot->{configs}->[$default_boot];
> +    # Pick the default config if one is defined
> +    my $config = $boot->{configs}->[$default_boot] if defined($default_boot);
>  
> -        if(defined($config->{kernel})) {
> -            $arch = $config->{kernel}->{arch};
> -        }
> -    }
> +    # Pick the first defined config if there is no default, or it is invalid
> +    $config = $boot->{configs}[0] unless defined($config);
> +
> +    my $arch = $config->{kernel}->{arch}
> +        if defined($config) && defined($config->{kernel});
> +
> +    # Use the libguestfs-detected arch if the above failed
> +    $arch = $desc->{arch} unless defined($arch);
>  
> -    # Default to i686 if we didn't find an architecture
> -    return 'i686' if(!defined($arch));
> +    # Default to x86_64 if we still didn't find an architecture
> +    return 'x86_64' unless defined($arch);
>  
>      # We want an i686 guest for i[345]86
>      return 'i686' if($arch =~ /^i[345]86$/);

Code looks good to me, and the reasoning is sound, ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming blog: http://rwmj.wordpress.com
Fedora now supports 80 OCaml packages (the OPEN alternative to F#)
http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora




More information about the Libguestfs mailing list