[Libguestfs] [PATCH VERSION 4] Generic partition creation interface.

Jim Meyering jim at meyering.net
Thu Nov 5 16:19:33 UTC 2009


Richard W.M. Jones wrote:
> On Thu, Nov 05, 2009 at 01:15:03PM +0000, Richard W.M. Jones wrote:
>> After a bit of discussion with Jim Meyering I've decided to withdraw
>> this and rewrite it based on libparted.  Using the parted command line
>> tool is just too unpredictable.
>
> After going down this rathole I decided maybe that wasn't such a
> good plan after all.
>
> The following patch goes back to using the command line interface, but
> we have made guestfs_part_disk work for both MBR and GPT formats
> (thanks to Jim).
>
> Most of the rest of the patch is concerned with updating documentation
> and examples to emphasize using guestfs_part* instead of
> guestfs_sfdisk* calls.
>
> Rich.
>
> --
> Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
> virt-df lists disk usage of guests without needing to install any
> software inside the virtual machine.  Supports Linux and Windows.
> http://et.redhat.com/~rjones/virt-df/
>
>>From 74914b6fd255d849c8d5caf482e9c727f0a13afd Mon Sep 17 00:00:00 2001
> From: Richard Jones <rjones at redhat.com>
> Date: Wed, 4 Nov 2009 23:15:26 +0000
> Subject: [PATCH] Generic partition creation interface.
>
> The current sfdisk interface works, but is somewhat limited
> since it can only deal with MBR-style partitions.  For disks
> larger than 2TB, MBR partitions are unsuitable and we need
> to provide access to other partition table types (eg. GPT).

Hi Rich,

This all looks fine.
Haven't tested yet, though.
Two comments:

...
> +int
> +do_part_add (const char *device, const char *prlogex,
> +             int64_t startsect, int64_t endsect)
> +{
> +  char *err;
> +  int r;
> +  char startstr[32];
> +  char endstr[32];
> +
> +  /* Check and translate prlogex. */
> +  if (strcmp (prlogex, "primary") == 0 ||
> +      strcmp (prlogex, "logical") == 0 ||
> +      strcmp (prlogex, "extended") == 0)
> +    ;
> +  else if (strcmp (prlogex, "p") == 0)
> +    prlogex = "primary";
> +  else if (strcmp (prlogex, "l") == 0)
> +    prlogex = "logical";
> +  else if (strcmp (prlogex, "e") == 0)
> +    prlogex = "extended";
> +  else {
> +    reply_with_error ("part-add: unknown partition type: %s: this should be \"primary\", \"logical\" or \"extended\"", prlogex);
> +    return -1;

Did you consider enforcing this only for msdos partition tables
and allowing arbitrary names for GPT?

...
> +int
> +do_part_disk (const char *device, const char *parttype)
> +{
> +  char *err;
> +  int r;
> +  const char *startstr;
> +  const char *endstr;
> +
> +  parttype = check_parttype (parttype);
> +  if (!parttype) {
> +    reply_with_error ("part-disk: unknown partition type: common choices are \"gpt\" and \"msdos\"");
> +    return -1;
> +  }
> +
> +  /* Voooooodooooooooo (thanks Jim Meyering for working this out). */
> +  if (strcmp (parttype, "msdos") == 0) {
> +    startstr = "1s";
> +    endstr = "-1s";
> +  } else if (strcmp (parttype, "gpt") == 0) {
> +    startstr = "34s";
> +    endstr = "-34s";
> +  } else {
> +    /* untested */
> +    startstr = "1s";
> +    endstr = "-1s";
> +  }
> +
> +  r = command (NULL, &err,
> +               "/sbin/parted", "-s", "--", device,
> +               "mklabel", parttype,
> +               /* This slightly wrong - in the GPT case it will give
> +                * the partition the name "primary".  We have to give
> +                * it some name, so this is as good as any.
> +                */
> +               "mkpart", "primary", startstr, endstr,

I created many GPT partition tables with "primary" as the name
of each partition, before I noticed the error.
To avoid giving the impression that libguestfs is doing
this out of ignorance, how about using e.g.,

      strcmp (parttype, "gpt") == 0 ? "p1" : "primary"

...




More information about the Libguestfs mailing list