sfdisk: add --relocate command
This command allows to relocate GPT backup header behind last partition (--relocate gpt-bak-mini) or to standard position (--relocate gpt-bak-std). Hint: use "fdisk --list-details" to see "Alternative LBA". Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
387ac2771f
commit
ee5a160250
2 changed files with 63 additions and 3 deletions
|
@ -171,7 +171,20 @@ Print all supported types for the current disk label or the label specified by
|
||||||
.TP
|
.TP
|
||||||
.BR \-V , " \-\-verify " [ \fIdevice ...]
|
.BR \-V , " \-\-verify " [ \fIdevice ...]
|
||||||
Test whether the partition table and partitions seem correct.
|
Test whether the partition table and partitions seem correct.
|
||||||
|
.TP
|
||||||
|
.BR "\-\-relocate \fIoper " \fIdevice
|
||||||
|
Relocate partition table header. This command is currently supported for GPT header only.
|
||||||
|
The argument \fIoper\fP can be:
|
||||||
|
.RS
|
||||||
|
.TP
|
||||||
|
.B gpt-bak-std
|
||||||
|
Move GPT backup header to the standard location at the end of the device.
|
||||||
|
.TP
|
||||||
|
.B gpt-bak-mini
|
||||||
|
Move GPT backup header behind the last partition. Note that UEFI
|
||||||
|
standard requires the backup header at the end of the device and partitioning
|
||||||
|
tools can automatically relocate the header to follow the standard.
|
||||||
|
.RE
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
.BR \-a , " \-\-append"
|
.BR \-a , " \-\-append"
|
||||||
|
|
|
@ -79,6 +79,7 @@ enum {
|
||||||
ACT_LIST_FREE,
|
ACT_LIST_FREE,
|
||||||
ACT_LIST_TYPES,
|
ACT_LIST_TYPES,
|
||||||
ACT_REORDER,
|
ACT_REORDER,
|
||||||
|
ACT_RELOCATE,
|
||||||
ACT_SHOW_SIZE,
|
ACT_SHOW_SIZE,
|
||||||
ACT_SHOW_GEOM,
|
ACT_SHOW_GEOM,
|
||||||
ACT_VERIFY,
|
ACT_VERIFY,
|
||||||
|
@ -1368,6 +1369,40 @@ static int command_diskid(struct sfdisk *sf, int argc, char **argv)
|
||||||
return write_changes(sf);
|
return write_changes(sf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sfdisk --relocate <mode> <device>
|
||||||
|
*/
|
||||||
|
static int command_relocate(struct sfdisk *sf, int argc, char **argv)
|
||||||
|
{
|
||||||
|
const char *devname = NULL;
|
||||||
|
const char *oper = NULL;
|
||||||
|
struct fdisk_label *lb;
|
||||||
|
|
||||||
|
if (!argc)
|
||||||
|
errx(EXIT_FAILURE, _("no relocate operation specified"));
|
||||||
|
if (argc < 2)
|
||||||
|
errx(EXIT_FAILURE, _("no disk device specified"));
|
||||||
|
if (argc > 2)
|
||||||
|
errx(EXIT_FAILURE, _("unexpected arguments"));
|
||||||
|
|
||||||
|
oper = argv[0];
|
||||||
|
devname = argv[1];
|
||||||
|
lb = fdisk_get_label(sf->cxt, "gpt");
|
||||||
|
|
||||||
|
if (strcmp(oper, "gpt-bak-mini") == 0)
|
||||||
|
fdisk_gpt_enable_minimize(lb, 1);
|
||||||
|
|
||||||
|
else if (strcmp(oper, "gpt-bak-std") != 0)
|
||||||
|
errx(EXIT_FAILURE, _("unsupported relocation operation"));
|
||||||
|
|
||||||
|
if (fdisk_assign_device(sf->cxt, devname, 0) != 0)
|
||||||
|
err(EXIT_FAILURE, _("cannot open %s"), devname);
|
||||||
|
|
||||||
|
fdisk_label_set_changed(lb, 1);
|
||||||
|
|
||||||
|
return write_changes(sf);
|
||||||
|
}
|
||||||
|
|
||||||
static void sfdisk_print_partition(struct sfdisk *sf, size_t n)
|
static void sfdisk_print_partition(struct sfdisk *sf, size_t n)
|
||||||
{
|
{
|
||||||
struct fdisk_partition *pa = NULL;
|
struct fdisk_partition *pa = NULL;
|
||||||
|
@ -1989,8 +2024,9 @@ static void __attribute__((__noreturn__)) usage(void)
|
||||||
|
|
||||||
fputs(USAGE_SEPARATOR, out);
|
fputs(USAGE_SEPARATOR, out);
|
||||||
fputs(_(" --disk-id <dev> [<str>] print or change disk label ID (UUID)\n"), out);
|
fputs(_(" --disk-id <dev> [<str>] print or change disk label ID (UUID)\n"), out);
|
||||||
|
fputs(_(" --relocate <oper> <dev> move partition header\n"), out);
|
||||||
|
|
||||||
fputs(USAGE_SEPARATOR, out);
|
fputs(USAGE_ARGUMENTS, out);
|
||||||
fputs(_(" <dev> device (usually disk) path\n"), out);
|
fputs(_(" <dev> device (usually disk) path\n"), out);
|
||||||
fputs(_(" <part> partition number\n"), out);
|
fputs(_(" <part> partition number\n"), out);
|
||||||
fputs(_(" <type> partition type, GUID for GPT, hex for MBR\n"), out);
|
fputs(_(" <type> partition type, GUID for GPT, hex for MBR\n"), out);
|
||||||
|
@ -2002,6 +2038,7 @@ static void __attribute__((__noreturn__)) usage(void)
|
||||||
fputs(_(" --move-data[=<typescript>] move partition data after relocation (requires -N)\n"), out);
|
fputs(_(" --move-data[=<typescript>] move partition data after relocation (requires -N)\n"), out);
|
||||||
fputs(_(" --move-use-fsync use fsync after each write when move data\n"), out);
|
fputs(_(" --move-use-fsync use fsync after each write when move data\n"), out);
|
||||||
fputs(_(" -f, --force disable all consistency checking\n"), out);
|
fputs(_(" -f, --force disable all consistency checking\n"), out);
|
||||||
|
|
||||||
fprintf(out,
|
fprintf(out,
|
||||||
_(" --color[=<when>] colorize output (%s, %s or %s)\n"), "auto", "always", "never");
|
_(" --color[=<when>] colorize output (%s, %s or %s)\n"), "auto", "always", "never");
|
||||||
fprintf(out,
|
fprintf(out,
|
||||||
|
@ -2062,7 +2099,8 @@ int main(int argc, char *argv[])
|
||||||
OPT_MOVEDATA,
|
OPT_MOVEDATA,
|
||||||
OPT_MOVEFSYNC,
|
OPT_MOVEFSYNC,
|
||||||
OPT_DELETE,
|
OPT_DELETE,
|
||||||
OPT_NOTELL
|
OPT_NOTELL,
|
||||||
|
OPT_RELOCATE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct option longopts[] = {
|
static const struct option longopts[] = {
|
||||||
|
@ -2097,6 +2135,8 @@ int main(int argc, char *argv[])
|
||||||
{ "wipe", required_argument, NULL, 'w' },
|
{ "wipe", required_argument, NULL, 'w' },
|
||||||
{ "wipe-partitions", required_argument, NULL, 'W' },
|
{ "wipe-partitions", required_argument, NULL, 'W' },
|
||||||
|
|
||||||
|
{ "relocate", no_argument, NULL, OPT_RELOCATE },
|
||||||
|
|
||||||
{ "part-uuid", no_argument, NULL, OPT_PARTUUID },
|
{ "part-uuid", no_argument, NULL, OPT_PARTUUID },
|
||||||
{ "part-label", no_argument, NULL, OPT_PARTLABEL },
|
{ "part-label", no_argument, NULL, OPT_PARTLABEL },
|
||||||
{ "part-type", no_argument, NULL, OPT_PARTTYPE },
|
{ "part-type", no_argument, NULL, OPT_PARTTYPE },
|
||||||
|
@ -2272,6 +2312,9 @@ int main(int argc, char *argv[])
|
||||||
case OPT_NOTELL:
|
case OPT_NOTELL:
|
||||||
sf->notell = 1;
|
sf->notell = 1;
|
||||||
break;
|
break;
|
||||||
|
case OPT_RELOCATE:
|
||||||
|
sf->act = ACT_RELOCATE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
errtryhelp(EXIT_FAILURE);
|
errtryhelp(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -2358,6 +2401,10 @@ int main(int argc, char *argv[])
|
||||||
case ACT_REORDER:
|
case ACT_REORDER:
|
||||||
rc = command_reorder(sf, argc - optind, argv + optind);
|
rc = command_reorder(sf, argc - optind, argv + optind);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ACT_RELOCATE:
|
||||||
|
rc = command_relocate(sf, argc - optind, argv + optind);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sfdisk_deinit(sf);
|
sfdisk_deinit(sf);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue