On Thursday, 27 October 2016 20:22:30 CET Pavel Butsykin wrote:
> This patch improves the search of grub config on EFI partition. This means 
> that
> the config will be found not only for rhel but also for many other 
> distributions.
> Tests were performed on the following distributions: centos, fedora, ubuntu,
> suse. In all cases, the config path was /boot/efi/EFI/*distname*/grub.cfg
> 
> The main purpose of the patch is to improve support for converting of vm with 
> UEFI for most distributions. Unfortunately this patch does not solve the 
> problem
> for all distributions, for example Debian does not store grub config on the 
> EFI
> partition, therefore for such distributions another solution is necessary.
> 
> Signed-off-by: Pavel Butsykin <[email protected]>
> ---
>  v2v/linux_bootloaders.ml | 56 
> +++++++++++++++++++++++++++++-------------------
>  1 file changed, 34 insertions(+), 22 deletions(-)
> 
> diff --git a/v2v/linux_bootloaders.ml b/v2v/linux_bootloaders.ml
> index e03d22b..210c273 100644
> --- a/v2v/linux_bootloaders.ml
> +++ b/v2v/linux_bootloaders.ml
> @@ -335,32 +335,44 @@ end
>  
>  let detect_bootloader (g : G.guestfs) inspect =
>    let config_file, typ =
> -    let locations = [
> -      "/boot/grub2/grub.cfg", Grub2;
> -      "/boot/grub/grub.cfg", Grub2;
> -      "/boot/grub/menu.lst", Grub1;
> -      "/boot/grub/grub.conf", Grub1;
> +    let grub_configs = [
> +      "grub.cfg", Grub2;
> +      "grub.conf", Grub1;
> +      "menu.lst", Grub1;
>      ] in
> -    let locations =
> +
> +    let boot_location =
>        match inspect.i_firmware with
> -      | I_UEFI _ ->
> -        [
> -          "/boot/efi/EFI/redhat/grub.cfg", Grub2;
> -          "/boot/efi/EFI/redhat/grub.conf", Grub1;
> -        ] @ locations
> -      | I_BIOS -> locations in
> -    try
> -      List.find (
> -        fun (config_file, _) -> g#is_file ~followsymlinks:true config_file
> -      ) locations
> -    with
> -      Not_found ->
> -        error (f_"no bootloader detected") in
> +      | I_BIOS -> "/boot/"
> +      | I_UEFI _ -> "/boot/efi/EFI/"
> +    in
> +
> +    let rec find_grub dirs configs =
> +      let rec config_check dir configs =
> +        match configs with
> +        | [] -> None
> +        | (config, typ) :: configs ->
> +          let cfg_path = boot_location ^ dir ^ "/" ^ config in
> +          if g#is_file ~followsymlinks:true cfg_path then (
> +            Some (cfg_path, typ)
> +          ) else config_check dir configs;
> +      in
> +      match dirs with
> +      | [] -> error (f_"no bootloader detected")
> +      | dir :: dirs ->
> +        let res = config_check dir configs in
> +        match res with
> +        | None -> find_grub dirs configs
> +        | Some (cfg_path, typ) -> cfg_path, typ
> +    in
> +
> +  find_grub (Array.to_list (g#ls boot_location)) grub_configs in

It sounds like this could be simplified by using g#find +
Common_utils.last_part_of (to extract the basename of each path, never
use Filename.basename for paths in the appliance!) + comparison with
the elements in the grub_configs array of this patch.

>    match typ with
>    | Grub1 ->
> -    if config_file = "/boot/efi/EFI/redhat/grub.conf" then
> -      g#aug_transform "grub" "/boot/efi/EFI/redhat/grub.conf";
> -
> +    (match inspect.i_firmware with
> +    | I_BIOS -> ()
> +    | I_UEFI _ -> g#aug_transform "grub" config_file
> +    );
>      new bootloader_grub1 g inspect config_file

This part looks fine.

Thanks,
-- 
Pino Toscano

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
Libguestfs mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libguestfs

Reply via email to