288 lines
14 KiB
Plaintext
288 lines
14 KiB
Plaintext
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)
|