[Libguestfs] [PATCH v2 3/3] resize: copy GPT partition flags

Richard W.M. Jones rjones at redhat.com
Tue Jan 16 08:49:38 UTC 2018


On Mon, Jan 15, 2018 at 03:14:01PM +0100, Cédric Bosdonnat wrote:
> In some cases, the first stage bootloader needs the 'Legacy BIOS
> bootable' flag to be set on the partition. This change copies all
> flags (including this one) for each partition of the old disk to the
> new one to avoid ending up with non-bootable disks.
> ---
>  resize/resize.ml | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/resize/resize.ml b/resize/resize.ml
> index 880fa98cb..1a21e4dff 100644
> --- a/resize/resize.ml
> +++ b/resize/resize.ml
> @@ -50,6 +50,7 @@ type partition = {
>    p_type : partition_content;    (* Content type and content size. *)
>    p_label : string option;       (* Label/name. *)
>    p_guid : string option;        (* Partition GUID (GPT only). *)
> +  p_attributes : int64 option;   (* Partition attributes bit mask (GPT only). *)
>  
>    (* What we're going to do: *)
>    mutable p_operation : partition_operation;
> @@ -493,6 +494,12 @@ read the man page virt-resize(1).
>            let label =
>              try Some (g#part_get_name "/dev/sda" part_num)
>              with G.Error _ -> None in
> +          let attributes =
> +            match parttype with
> +            | MBR -> None
> +            | GPT ->
> +              try Some (g#part_get_gpt_attributes "/dev/sda" part_num)
> +              with G.Error _ -> None in
>            let guid =
>              match parttype with
>              | MBR -> None
> @@ -502,7 +509,7 @@ read the man page virt-resize(1).
>  
>            { p_name = name; p_part = part;
>              p_bootable = bootable; p_id = id; p_type = typ;
> -            p_label = label; p_guid = guid;
> +            p_label = label; p_guid = guid; p_attributes = attributes;
>              p_operation = OpCopy; p_target_partnum = 0;
>              p_target_start = 0L; p_target_end = 0L }
>        ) parts in
> @@ -1150,6 +1157,7 @@ read the man page virt-resize(1).
>                       part_size = 0L };
>            p_bootable = false; p_id = No_ID; p_type = ContentUnknown;
>            p_label = None; p_guid = None;
> +          p_attributes = None;
>  
>            (* Target information is meaningful. *)
>            p_operation = OpIgnore;
> @@ -1191,12 +1199,13 @@ read the man page virt-resize(1).
>     * is changed from primary to extended.  Thus we need to set the
>     * MBR ID before doing the copy so sfdisk doesn't corrupt things.
>     *)
> -  let set_partition_bootable_and_id p =
> +  let set_partition_attributes p =
>        if p.p_bootable then
>          g#part_set_bootable "/dev/sdb" p.p_target_partnum true;
>  
>        Option.may (g#part_set_name "/dev/sdb" p.p_target_partnum) p.p_label;
>        Option.may (g#part_set_gpt_guid "/dev/sdb" p.p_target_partnum) p.p_guid;
> +      Option.may (g#part_set_gpt_attributes "/dev/sdb" p.p_target_partnum) p.p_attributes;
>  
>        match parttype, p.p_id with
>        | GPT, GPT_Type gpt_type ->
> @@ -1205,7 +1214,7 @@ read the man page virt-resize(1).
>          g#part_set_mbr_id "/dev/sdb" p.p_target_partnum mbr_id
>        | GPT, (No_ID|MBR_ID _) | MBR, (No_ID|GPT_Type _) -> ()
>    in
> -  List.iter set_partition_bootable_and_id partitions;
> +  List.iter set_partition_attributes partitions;
>  
>    (* Copy over the data. *)
>    let copy_partition p =
> -- 

Looks good, ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines.  Supports shell scripting,
bindings from many languages.  http://libguestfs.org




More information about the Libguestfs mailing list