GPT fdisk (aka gdisk, cgdisk, and sgdisk) and FixParts
by Roderick W. Smith, rodsmith@rodsbooks.com

Introduction
------------

This package includes the source code for four related disk partitioning
programs:

- gdisk -- This program is modeled after Linux fdisk, but it operates on
  GUID Partition Table (GPT) disks rather than the Master Boot Record (MBR)
  disks that fdisk modifies. As such, gdisk is an interactive text-mode
  tool for manipulating partitions, but it does nothing to the contents of
  those partitions (usually filesystems, but sometimes swap space or other
  data).

- cgdisk -- This program is modeled after Linux cfdisk, but it operates on
  GPT disks rather than the MBR disks that cfdisk modifies. As such, cgdisk
  is a curses-based text-mode tool for manipulating partitions, which is to
  say that it uses an interface that relies on arrow keys and a dynamic
  display rather than the command letters and a scrolling display like
  gdisk uses.

- sgdisk -- This program is conceptually similar to the Linux sfdisk and
  FreeBSD gpt programs, but its operational details differ. It enables
  manipulation of GPT disks using command-line options, so it's suitable
  for use in scripts or by experts to perform specific tasks that might
  take several commands in gdisk to accomplish.

- fixparts -- This program, unlike the preceding three, operates on MBR
  disks. It's intended to fix certain problems that can be created by
  various utilities. Specifically, it can fix mis-sized extended partitions
  and primary partitions located in the middle of extended partitions. It
  also enables changing primary vs. logical partition status (within limits
  of what's legal in the MBR scheme) and making a few other minor changes.
  It does NOT support creating new partitions; for that, you should use
  fdisk, parted, or some other tool.

More details about the abilities of these tools follows.

All four programs rely on the same set of underlying code base; they differ
only in their control interfaces (defined in gdisk.cc, cgdisk.cc,
sgdisk.cc, and fixparts.cc, respectively) and in which support code they
use.

GPT fdisk (gdisk, cgdisk, and sgdisk) Details
---------------------------------------------

The gdisk program is intended as a (somewhat) fdisk-workalike program for
GPT-partitioned disks, cgdisk is similarly a workalike for fdisk, and
sgdisk provides most of gdisk's functionality in a more script-friendly
program. Although libparted and programs that use it (GNU Parted, gparted,
etc.) provide the ability to handle GPT disks, they have certain
limitations that gdisk overcomes. Specific advantages of gdisk, cgdisk, and
sgdisk include:

* The ability to convert MBR-partitioned disks in-place to GPT format,
  without losing data

* The ability to convert BSD disklabels in-place to create GPT
  partitions, without losing data

* The ability to convert from GPT format to MBR format without data loss
  (gdisk and sgdisk only)

* More flexible specification of filesystem type code GUIDs, which
  GNU Parted tends to corrupt

* Clear identification of the number of unallocated sectors on a
  disk

* A user interface that's familiar to long-time users of Linux
  fdisk and cfdisk (gdisk and cgdisk only)

* The MBR boot loader code is left alone

* The ability to create a hybrid MBR, which permits GPT-unaware OSes to
  access up to three GPT partitions on the disk (gdisk and sgdisk only)

Of course, GPT fdisk isn't without its limitations. Most notably, it lacks
the filesystem awareness and filesystem-related features of GParted. You
can't resize a partition's filesystem or create a partition with a
filesystem already in place with gdisk, for instance. There's no GUI
version of gdisk.

The GPT fdisk package provides three program files: the interactive
text-mode gdisk, the curses-based interactive cgdisk, and the
command-line-driven sgdisk. The first two are intended for use in manually
partitioning disks or changing partitioning details; sgdisk is intended for
use in scripts to help automate tasks such as disk cloning or preparing
multiple disks for Linux installation.

FixParts Details
----------------

This program's creation was motivated by cries for help I've seen in online
forums from users who have found their partition tables to be corrupted by
various buggy partitioning tools. Although most OSes can handle the
afflicted disks fine, libparted-based tools (GParted, parted, most Linux
installers, etc.) tend to flake out when presented with these disks.
Typically, the symptom is a disk that appears to hold no partitions;
however, sometimes the libparted tool presents partitions other than those
that the OS sees.

I've observed four causes of these symptoms, three of which FixParts can
correct:

* Old GPT data -- If a disk is used as a GPT disk and then re-used as an
  MBR disk, the GPT data may be incompletely erased. This happens if the
  disk is repartitioned with fdisk or the Microsoft Windows installer, for
  instance. (Tools based on libparted correctly remove the old GPT data
  when converting from GPT to MBR format.) FixParts checks for this problem
  when it starts and offers to correct it. If you opt to erase the GPT
  data, this erasure occurs immediately, unlike other changes the program
  makes.

* Mis-sized extended partitions -- Some tools create an extended partition
  that's too large, typically ending after the last sector of the disk.
  FixParts automatically corrects this problem (if you use the 'w' option
  to save the partition table).

* Primary partitions inside an extended partition -- Some utilities create
  or move primary partitions to within the range covered by the extended
  partition. FixParts can usually correct this problem by turning the
  primary partition into a logical partition or by changing one or more
  other logical partitions into primaries. Such corrections aren't always
  possible, though, at least not without deleting or resizing other
  partitions.

* Leftover RAID data -- If a disk is used in a RAID array and then re-used
  as a non-RAID disk, some utilities can become confused and fail to see
  the disk. FixParts can NOT correct this problem. You must destroy the old
  RAID data, or possibly remove the dmraid package from the system, to fix
  this problem.

When run, FixParts presents an fdisk-like interface, enabling you to adjust
partition types (primary, logical, or omitted), change type codes, change
the bootable flag, and so on. Although you can delete a partition (by
omitting it), you can't create new partitions with the program. If you're
used to partitioning disks, particularly with Linux fdisk, two unusual
features of FixParts require elaboration:

* No extended partitions -- Internally, FixParts reads the partition table
  and discards data on any extended partition(s) it finds. When you save
  the partition table, the program generates a new extended partition. This
  design means that the program automatically corrects many problems
  related to the extended partition. It also means that you'll see no
  evidence of extended partitions in the FixParts user interface, although
  it keeps track of the requirements and prevents you from creating illegal
  layouts, such as a primary between two logicals.

* Partition numbering -- In most Linux tools, partitions 1-4 are primaries
  and partitions 5 and up are logicals. Although a legal partition table
  loaded into FixParts will initially conform to this convention, some
  types of damaged table might not, and various changes you make can also
  cause deviations. When FixParts writes the partition table, its numbering
  will be altered to conform to the standard MBR conventions, but you
  should use the explicit labeling of partitions as primary or logical
  rather than the partition numbers to determine a partition's status.

Installing
----------

To compile GPT fdisk, you must have appropriate development tools installed,
most notably the GNU Compiler Collection (GCC) and its g++ compiler for C++.
I've also tested compilation with Clang, which seems to work; however, I've
not done extensive testing of the resulting binaries, beyond checking a few
basics. See the README.Windows files for additional notes on compiling the
software for Windows. In addition, note these requirements:

* On Linux, FreeBSD, macOS, and Solaris, libuuid must be installed. This is
  the standard for Linux and macOS, although you may need to install a
  package called uuid-dev or something similar to get the headers. On
  FreeBSD, the e2fsprogs-libuuid port must be installed.

* The ICU library (http://site.icu-project.org), which provides support for
  Unicode partition names, is optional on all platforms except Windows, on
  which it's not supported. Using this library was required to get proper
  UTF-16 partition name support in GPT fdisk versions prior to 0.8.9, but
  as of that version it should no longer be required. Nonetheless, you can
  use it if you're having problems with the new UTF-16 support. This
  library is normally installed in Linux and macOS, but you may need to
  install the development headers (libicu-dev or something similar in
  Linux; or the libicu36-dev Fink package in macOS). To compile with ICU
  support, you must modify the Makefile: Look for commented-out lines that
  refer to USE_UTF16, -licuuc, -licudata, or -licucore. Uncomment them and
  comment out the equivalents that lack these lines.

* The cgdisk program requires the ncurses library and its development files
  (headers). Most Linux distributions install ncurses by default, but you
  may need to install a package called libncurses5-dev, ncurses-devel, or
  something similar to obtain the header files. On my macOS development
  system, I installed the nurses Homebrew ("brew") package; however, other
  Unix-style software repositories are available and may work for you (see
  the next item). If you're having problems installing ncurses, you can
  compile gdisk and/or sgdisk without cgdisk by specifying only the targets
  you want to compile to make.

* The sgdisk program requires the popt library and its development files
  (headers). Most Linux distributions install popt by default, but you may
  need to install a package called popt-dev, popt-devel, or something
  similar to obtain the header files. MacOS users can find a version of
  popt for Mac OS from Darwin Ports (http://popt.darwinports.com), MacPorts
  (https://trac.macports.org/browser/trunk/dports/devel/popt/Portfile), Fink
  (http://www.finkproject.org), or brew (http://macappstore.org/popt/); 
  however, you'll first need to install the relevant environment
  (instructions exist on the relevant projects' pages). When I re-built my
  Mac build environment in February of 2020, I found that brew was, by far,
  the easiest of these to install. Some of the others seem to have been
  abandoned, but I didn't investigate thoroughly. I'm leaving the references
  in case they might be useful in the future. Instead of installing one of
  These ports, you can compile gdisk and/or cgdisk alone, without sgdisk;
  gdisk and cgdisk don't require popt.

When all the necessary development tools and libraries are installed, you
can uncompress the package and type "make" at the command prompt in the
resulting directory. (Beginning with version 1.0.9, GPT fdisk provides a
consolidated Makefile for all supported OSes. Earlier versions used
OS-specific Makefiles, such as Makefile.mac and Makefile.freebsd, which are
still provided, but are deprecated.) You must use GNU make (gmake on
FreeBSD) with this Makefile. You may also need to add header (include)
directories or library directories by setting the CXXFLAGS environment
variable or by editing the Makefile. The result should be program files
called gdisk, cgdisk, sgdisk, and fixparts (or variants with "32.exe" or
"64.exe" added for Windows binaries). Typing "make gdisk", "make cgdisk",
"make sgdisk", or "make fixparts" will compile only the requested programs.
You can use these programs in place or copy the files to a suitable
directory, such as /usr/local/sbin. You can copy the man pages (gdisk.8,
cgdisk.8, sgdisk.8, and fixparts.8) to /usr/local/man/man8 to make them
available.

Cross-compiling is possible, but is not well-tested, except for compiling
Windows binaries on Linux. (See README.Windows for details.) To
cross-compile, specify the TARGET environment variable when launching make,
as in "TARGET=win64 make" to compile for 64-bit (x86-64, X64, AMD64) Windows
on a non-Windows platform. Supported TARGET values are linux, freebsd,
solaris, macos, win32, and win64.

Caveats
-------

DISK PARTITIONING SOFTWARE IS DANGEROUS! Although the GPT fdisk project has
existed since 2009, I do not claim it is entirely bug-free; in fact a glance
at the revision history shows recent bug fixes. I believe all
data-corruption bugs to be squashed, but I know full well that the odds of
my missing something are high. This is particularly true for large
(over-2TiB) drives and use in exotic environments.

My main development platform is a system running the 64-bit version of
Ubuntu Linux. I've also tested on several other 32- and 64-bit Linux
distributions, Intel-based macOS 10 and 11, 64-bit FreeBSD 7.1, and Windows
7 and 10. Other environments qualify as "exotic," and even macOS and Windows
are borderline exotic in this context, since I use Linux almost exclusively,
and my impression is that GPT fdisk is far more commonly used on Linux than
in other OSes.

Redistribution
--------------

This program is licensed under terms of the GNU GPL (see the file COPYING).

Acknowledgements
----------------

This code is mostly my own; however, I've used three functions from two
other GPLed programs:

- The code used to generate CRCs is taken from the efone program by
  Krzysztof Dabrowski and ElysiuM deeZine. (See the crc32.h and
  crc32.cc source code files.)

- A function to find the disk size is taken from Linux fdisk by A. V. Le
  Blanc. This code has subsequently been heavily modified.

Additional code contributors include:

- Yves Blusseau (1otnwmz02@sneakemail.com)

- David Hubbard (david.c.hubbard@gmail.com)

- Justin Maggard (justin.maggard@netgear.com)

- Dwight Schauer (das@teegra.net)

- Florian Zumbiehl (florz@florz.de)

- Guillaume Delacour (contributed the gdisk_test.sh script)
