probe: Support probing for partition UUID with --part-uuid
Linux supports root=PARTUUID=<partuuid> boot argument, so add support for probing it. Compared to the fs UUID, the partition UUID does not change when reformatting a partition. For now, only disks using a GPT partition table are supported. Signed-off-by: Jacob Kroon <jacob.kroon@gmail.com> Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
26094f5241
commit
f2b9083f85
2 changed files with 37 additions and 1 deletions
|
@ -4771,9 +4771,11 @@ a rest.
|
||||||
@node probe
|
@node probe
|
||||||
@subsection probe
|
@subsection probe
|
||||||
|
|
||||||
@deffn Command probe [@option{--set} var] @option{--driver}|@option{--partmap}|@option{--fs}|@option{--fs-uuid}|@option{--label} device
|
@deffn Command probe [@option{--set} var] @option{--driver}|@option{--partmap}|@option{--fs}|@option{--fs-uuid}|@option{--label}|@option{--part-uuid} device
|
||||||
Retrieve device information. If option @option{--set} is given, assign result
|
Retrieve device information. If option @option{--set} is given, assign result
|
||||||
to variable @var{var}, otherwise print information on the screen.
|
to variable @var{var}, otherwise print information on the screen.
|
||||||
|
|
||||||
|
The option @option{--part-uuid} is currently only implemented for GPT-formatted disks.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <grub/device.h>
|
#include <grub/device.h>
|
||||||
#include <grub/disk.h>
|
#include <grub/disk.h>
|
||||||
#include <grub/partition.h>
|
#include <grub/partition.h>
|
||||||
|
#include <grub/gpt_partition.h>
|
||||||
#include <grub/net.h>
|
#include <grub/net.h>
|
||||||
#include <grub/fs.h>
|
#include <grub/fs.h>
|
||||||
#include <grub/file.h>
|
#include <grub/file.h>
|
||||||
|
@ -45,6 +46,7 @@ static const struct grub_arg_option options[] =
|
||||||
{"fs", 'f', 0, N_("Determine filesystem type."), 0, 0},
|
{"fs", 'f', 0, N_("Determine filesystem type."), 0, 0},
|
||||||
{"fs-uuid", 'u', 0, N_("Determine filesystem UUID."), 0, 0},
|
{"fs-uuid", 'u', 0, N_("Determine filesystem UUID."), 0, 0},
|
||||||
{"label", 'l', 0, N_("Determine filesystem label."), 0, 0},
|
{"label", 'l', 0, N_("Determine filesystem label."), 0, 0},
|
||||||
|
{"part-uuid", 0, 0, N_("Determine partition UUID."), 0, 0},
|
||||||
{0, 0, 0, 0, 0, 0}
|
{0, 0, 0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -98,6 +100,38 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
grub_device_close (dev);
|
grub_device_close (dev);
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
if (state[6].set)
|
||||||
|
{
|
||||||
|
/* AAAABBBB-CCCC-DDDD-EEEE-FFFFFFFFFFFF + null terminator */
|
||||||
|
char val[37] = "none";
|
||||||
|
if (dev->disk && dev->disk->partition &&
|
||||||
|
grub_strcmp(dev->disk->partition->partmap->name, "gpt") == 0)
|
||||||
|
{
|
||||||
|
struct grub_gpt_partentry entry;
|
||||||
|
struct grub_partition *p = dev->disk->partition;
|
||||||
|
grub_disk_t disk = grub_disk_open(dev->disk->name);
|
||||||
|
if (!disk)
|
||||||
|
return grub_errno;
|
||||||
|
if (grub_disk_read(disk, p->offset, p->index, sizeof(entry), &entry))
|
||||||
|
return grub_errno;
|
||||||
|
grub_disk_close(disk);
|
||||||
|
grub_gpt_part_guid_t *guid = &entry.guid;
|
||||||
|
grub_snprintf (val, sizeof(val),
|
||||||
|
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||||
|
grub_le_to_cpu32 (guid->data1),
|
||||||
|
grub_le_to_cpu16 (guid->data2),
|
||||||
|
grub_le_to_cpu16 (guid->data3),
|
||||||
|
guid->data4[0], guid->data4[1], guid->data4[2],
|
||||||
|
guid->data4[3], guid->data4[4], guid->data4[5],
|
||||||
|
guid->data4[6], guid->data4[7]);
|
||||||
|
}
|
||||||
|
if (state[0].set)
|
||||||
|
grub_env_set (state[0].arg, val);
|
||||||
|
else
|
||||||
|
grub_printf ("%s", val);
|
||||||
|
grub_device_close (dev);
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
fs = grub_fs_probe (dev);
|
fs = grub_fs_probe (dev);
|
||||||
if (! fs)
|
if (! fs)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
Loading…
Reference in a new issue