[Libguestfs] [PATCH 3/3] v2v: bootloaders: improve detection of Grub2 default method

Richard W.M. Jones rjones at redhat.com
Mon Oct 3 08:08:19 UTC 2016


On Tue, Sep 27, 2016 at 05:58:12PM +0200, Pino Toscano wrote:
> Detect only once which method must be used to get and set the default
> Grub2 kernel in the guest: this avoids the same checks in list_kernels
> and set_default_kernel.
> 
> Also, add a "no method" option as well: Debian/Ubuntu guests do not have
> neither grubby nor Perl's Bootloader::Tools, so there is no way to know
> what is the default kernel, nor to change it.  In this case, add a
> warning about this situation.
> ---
>  v2v/linux_bootloaders.ml | 61 ++++++++++++++++++++++++++++++++++--------------
>  1 file changed, 44 insertions(+), 17 deletions(-)
> 
> diff --git a/v2v/linux_bootloaders.ml b/v2v/linux_bootloaders.ml
> index 4f53f87..e03d22b 100644
> --- a/v2v/linux_bootloaders.ml
> +++ b/v2v/linux_bootloaders.ml
> @@ -184,6 +184,12 @@ object
>      g#aug_save ()
>  end
>  
> +(** The method used to get and set the default kernel in Grub2. *)
> +type default_kernel_method =
> +  | MethodGrubby  (** Use the 'grubby' tool. *)
> +  | MethodPerlBootloader  (** Use the 'Bootloader::Tools' Perl module. *)
> +  | MethodNone  (** No known way. *)
> +
>  (* Grub2 representation. *)
>  class bootloader_grub2 (g : G.guestfs) grub_config =
>  
> @@ -199,6 +205,20 @@ class bootloader_grub2 (g : G.guestfs) grub_config =
>        error (f_"failed to find grub2-mkconfig binary (but Grub2 was detected on guest)")
>    in
>  
> +  let get_default_method =
> +    let has_perl_bootloader () =
> +      try
> +        ignore (g#command [| "/usr/bin/perl"; "-MBootloader::Tools"; "-e1" |]);
> +        true
> +      with G.Error _ -> false
> +    in
> +    if g#exists "/sbin/grubby" then MethodGrubby
> +    else if has_perl_bootloader () then MethodPerlBootloader
> +    else (
> +      warning (f_"could not determine a way to update the configuration of Grub2");
> +      MethodNone
> +    ) in
> +
>  object (self)
>    inherit bootloader
>  
> @@ -250,18 +270,23 @@ object (self)
>  
>    method list_kernels =
>      let get_default_image () =
> -      let cmd =
> -        if g#exists "/sbin/grubby" then
> -          [| "grubby"; "--default-kernel" |]
> -        else
> -          [| "/usr/bin/perl"; "-MBootloader::Tools"; "-e"; "
> -                InitLibrary();
> -                my $default = Bootloader::Tools::GetDefaultSection();
> -                print $default->{image};
> -             " |] in
> -      match g#command cmd with
> -      | "" -> None
> -      | k ->
> +      let res =
> +        match get_default_method with
> +        | MethodGrubby ->
> +          Some (g#command [| "grubby"; "--default-kernel" |])
> +        | MethodPerlBootloader ->
> +          let cmd =
> +            [| "/usr/bin/perl"; "-MBootloader::Tools"; "-e"; "
> +                  InitLibrary();
> +                  my $default = Bootloader::Tools::GetDefaultSection();
> +                  print $default->{image};
> +               " |] in
> +          Some (g#command cmd)
> +        | MethodNone ->
> +          None in
> +      match res with
> +      | None -> None
> +      | Some k ->
>          let len = String.length k in
>          let k =
>            if len > 0 && k.[len-1] = '\n' then
> @@ -285,10 +310,11 @@ object (self)
>      vmlinuzes
>  
>    method set_default_kernel vmlinuz =
> -    let cmd =
> -      if g#exists "/sbin/grubby" then
> -        [| "grubby"; "--set-default"; vmlinuz |]
> -      else
> +    match get_default_method with
> +    | MethodGrubby ->
> +      ignore (g#command [| "grubby"; "--set-default"; vmlinuz |])
> +    | MethodPerlBootloader ->
> +      let cmd =
>          [| "/usr/bin/perl"; "-MBootloader::Tools"; "-e"; sprintf "
>              InitLibrary();
>              my @sections = GetSectionList(type=>image, image=>\"%s\");
> @@ -296,7 +322,8 @@ object (self)
>              my $newdefault = $section->{name};
>              SetGlobals(default, \"$newdefault\");
>            " vmlinuz |] in
> -    ignore (g#command cmd)
> +      ignore (g#command cmd)
> +    | MethodNone -> ()
>  
>    method configure_console = self#grub2_update_console ~remove:false

ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW




More information about the Libguestfs mailing list