• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1GPT fdisk (aka gdisk, cgdisk, and sgdisk) and FixParts
2by Roderick W. Smith, rodsmith@rodsbooks.com
3
4Introduction
5------------
6
7This package includes the source code for four related disk partitioning
8programs:
9
10- gdisk -- This program is modeled after Linux fdisk, but it operates on
11  GUID Partition Table (GPT) disks rather than the Master Boot Record (MBR)
12  disks that fdisk modifies. As such, gdisk is an interactive text-mode
13  tool for manipulating partitions, but it does nothing to the contents of
14  those partitions (usually filesystems, but sometimes swap space or other
15  data).
16
17- cgdisk -- This program is modeled after Linux cfdisk, but it operates on
18  GPT disks rather than the MBR disks that cfdisk modifies. As such, cgdisk
19  is a curses-based text-mode tool for manipulating partitions, which is to
20  say that it uses an interface that relies on arrow keys and a dynamic
21  display rather than the command letters and a scrolling display like
22  gdisk uses.
23
24- sgdisk -- This program is conceptually similar to the Linux sfdisk and
25  FreeBSD gpt programs, but its operational details differ. It enables
26  manipulation of GPT disks using command-line options, so it's suitable
27  for use in scripts or by experts to perform specific tasks that might
28  take several commands in gdisk to accomplish.
29
30- fixparts -- This program, unlike the preceding three, operates on MBR
31  disks. It's intended to fix certain problems that can be created by
32  various utilities. Specifically, it can fix mis-sized extended partitions
33  and primary partitions located in the middle of extended partitions. It
34  also enables changing primary vs. logical partition status (within limits
35  of what's legal in the MBR scheme) and making a few other minor changes.
36  It does NOT support creating new partitions; for that, you should use
37  fdisk, parted, or some other tool.
38
39More details about the abilities of these tools follows.
40
41All four programs rely on the same set of underlying code base; they differ
42only in their control interfaces (defined in gdisk.cc, cgdisk.cc,
43sgdisk.cc, and fixparts.cc, respectively) and in which support code they
44use.
45
46GPT fdisk (gdisk, cgdisk, and sgdisk) Details
47---------------------------------------------
48
49The gdisk program is intended as a (somewhat) fdisk-workalike program for
50GPT-partitioned disks, cgdisk is similarly a workalike for fdisk, and
51sgdisk provides most of gdisk's functionality in a more script-friendly
52program. Although libparted and programs that use it (GNU Parted, gparted,
53etc.) provide the ability to handle GPT disks, they have certain
54limitations that gdisk overcomes. Specific advantages of gdisk, cgdisk, and
55sgdisk include:
56
57* The ability to convert MBR-partitioned disks in-place to GPT format,
58  without losing data
59
60* The ability to convert BSD disklabels in-place to create GPT
61  partitions, without losing data
62
63* The ability to convert from GPT format to MBR format without data loss
64  (gdisk and sgdisk only)
65
66* More flexible specification of filesystem type code GUIDs, which
67  GNU Parted tends to corrupt
68
69* Clear identification of the number of unallocated sectors on a
70  disk
71
72* A user interface that's familiar to long-time users of Linux
73  fdisk and cfdisk (gdisk and cgdisk only)
74
75* The MBR boot loader code is left alone
76
77* The ability to create a hybrid MBR, which permits GPT-unaware OSes to
78  access up to three GPT partitions on the disk (gdisk and sgdisk only)
79
80Of course, GPT fdisk isn't without its limitations. Most notably, it lacks
81the filesystem awareness and filesystem-related features of GParted. You
82can't resize a partition's filesystem or create a partition with a
83filesystem already in place with gdisk, for instance. There's no GUI
84version of gdisk.
85
86The GPT fdisk package provides three program files: the interactive
87text-mode gdisk, the curses-based interactive cgdisk, and the
88command-line-driven sgdisk. The first two are intended for use in manually
89partitioning disks or changing partitioning details; sgdisk is intended for
90use in scripts to help automate tasks such as disk cloning or preparing
91multiple disks for Linux installation.
92
93FixParts Details
94----------------
95
96This program's creation was motivated by cries for help I've seen in online
97forums from users who have found their partition tables to be corrupted by
98various buggy partitioning tools. Although most OSes can handle the
99afflicted disks fine, libparted-based tools (GParted, parted, most Linux
100installers, etc.) tend to flake out when presented with these disks.
101Typically, the symptom is a disk that appears to hold no partitions;
102however, sometimes the libparted tool presents partitions other than those
103that the OS sees.
104
105I've observed four causes of these symptoms, three of which FixParts can
106correct:
107
108* Old GPT data -- If a disk is used as a GPT disk and then re-used as an
109  MBR disk, the GPT data may be incompletely erased. This happens if the
110  disk is repartitioned with fdisk or the Microsoft Windows installer, for
111  instance. (Tools based on libparted correctly remove the old GPT data
112  when converting from GPT to MBR format.) FixParts checks for this problem
113  when it starts and offers to correct it. If you opt to erase the GPT
114  data, this erasure occurs immediately, unlike other changes the program
115  makes.
116
117* Mis-sized extended partitions -- Some tools create an extended partition
118  that's too large, typically ending after the last sector of the disk.
119  FixParts automatically corrects this problem (if you use the 'w' option
120  to save the partition table).
121
122* Primary partitions inside an extended partition -- Some utilities create
123  or move primary partitions to within the range covered by the extended
124  partition. FixParts can usually correct this problem by turning the
125  primary partition into a logical partition or by changing one or more
126  other logical partitions into primaries. Such corrections aren't always
127  possible, though, at least not without deleting or resizing other
128  partitions.
129
130* Leftover RAID data -- If a disk is used in a RAID array and then re-used
131  as a non-RAID disk, some utilities can become confused and fail to see
132  the disk. FixParts can NOT correct this problem. You must destroy the old
133  RAID data, or possibly remove the dmraid package from the system, to fix
134  this problem.
135
136When run, FixParts presents an fdisk-like interface, enabling you to adjust
137partition types (primary, logical, or omitted), change type codes, change
138the bootable flag, and so on. Although you can delete a partition (by
139omitting it), you can't create new partitions with the program. If you're
140used to partitioning disks, particularly with Linux fdisk, two unusual
141features of FixParts require elaboration:
142
143* No extended partitions -- Internally, FixParts reads the partition table
144  and discards data on any extended partition(s) it finds. When you save
145  the partition table, the program generates a new extended partition. This
146  design means that the program automatically corrects many problems
147  related to the extended partition. It also means that you'll see no
148  evidence of extended partitions in the FixParts user interface, although
149  it keeps track of the requirements and prevents you from creating illegal
150  layouts, such as a primary between two logicals.
151
152* Partition numbering -- In most Linux tools, partitions 1-4 are primaries
153  and partitions 5 and up are logicals. Although a legal partition table
154  loaded into FixParts will initially conform to this convention, some
155  types of damaged table might not, and various changes you make can also
156  cause deviations. When FixParts writes the partition table, its numbering
157  will be altered to conform to the standard MBR conventions, but you
158  should use the explicit labeling of partitions as primary or logical
159  rather than the partition numbers to determine a partition's status.
160
161Installing
162----------
163
164To compile GPT fdisk, you must have appropriate development tools installed,
165most notably the GNU Compiler Collection (GCC) and its g++ compiler for C++.
166I've also tested compilation with Clang, which seems to work; however, I've
167not done extensive testing of the resulting binaries, beyond checking a few
168basics. See the README.Windows files for additional notes on compiling the
169software for Windows. In addition, note these requirements:
170
171* On Linux, FreeBSD, macOS, and Solaris, libuuid must be installed. This is
172  the standard for Linux and macOS, although you may need to install a
173  package called uuid-dev or something similar to get the headers. On
174  FreeBSD, the e2fsprogs-libuuid port must be installed.
175
176* The ICU library (http://site.icu-project.org), which provides support for
177  Unicode partition names, is optional on all platforms except Windows, on
178  which it's not supported. Using this library was required to get proper
179  UTF-16 partition name support in GPT fdisk versions prior to 0.8.9, but
180  as of that version it should no longer be required. Nonetheless, you can
181  use it if you're having problems with the new UTF-16 support. This
182  library is normally installed in Linux and macOS, but you may need to
183  install the development headers (libicu-dev or something similar in
184  Linux; or the libicu36-dev Fink package in macOS). To compile with ICU
185  support, you must modify the Makefile: Look for commented-out lines that
186  refer to USE_UTF16, -licuuc, -licudata, or -licucore. Uncomment them and
187  comment out the equivalents that lack these lines.
188
189* The cgdisk program requires the ncurses library and its development files
190  (headers). Most Linux distributions install ncurses by default, but you
191  may need to install a package called libncurses5-dev, ncurses-devel, or
192  something similar to obtain the header files. On my macOS development
193  system, I installed the nurses Homebrew ("brew") package; however, other
194  Unix-style software repositories are available and may work for you (see
195  the next item). If you're having problems installing ncurses, you can
196  compile gdisk and/or sgdisk without cgdisk by specifying only the targets
197  you want to compile to make.
198
199* The sgdisk program requires the popt library and its development files
200  (headers). Most Linux distributions install popt by default, but you may
201  need to install a package called popt-dev, popt-devel, or something
202  similar to obtain the header files. MacOS users can find a version of
203  popt for Mac OS from Darwin Ports (http://popt.darwinports.com), MacPorts
204  (https://trac.macports.org/browser/trunk/dports/devel/popt/Portfile), Fink
205  (http://www.finkproject.org), or brew (http://macappstore.org/popt/);
206  however, you'll first need to install the relevant environment
207  (instructions exist on the relevant projects' pages). When I re-built my
208  Mac build environment in February of 2020, I found that brew was, by far,
209  the easiest of these to install. Some of the others seem to have been
210  abandoned, but I didn't investigate thoroughly. I'm leaving the references
211  in case they might be useful in the future. Instead of installing one of
212  These ports, you can compile gdisk and/or cgdisk alone, without sgdisk;
213  gdisk and cgdisk don't require popt.
214
215When all the necessary development tools and libraries are installed, you
216can uncompress the package and type "make" at the command prompt in the
217resulting directory. (Beginning with version 1.0.9, GPT fdisk provides a
218consolidated Makefile for all supported OSes. Earlier versions used
219OS-specific Makefiles, such as Makefile.mac and Makefile.freebsd, which are
220still provided, but are deprecated.) You must use GNU make (gmake on
221FreeBSD) with this Makefile. You may also need to add header (include)
222directories or library directories by setting the CXXFLAGS environment
223variable or by editing the Makefile. The result should be program files
224called gdisk, cgdisk, sgdisk, and fixparts (or variants with "32.exe" or
225"64.exe" added for Windows binaries). Typing "make gdisk", "make cgdisk",
226"make sgdisk", or "make fixparts" will compile only the requested programs.
227You can use these programs in place or copy the files to a suitable
228directory, such as /usr/local/sbin. You can copy the man pages (gdisk.8,
229cgdisk.8, sgdisk.8, and fixparts.8) to /usr/local/man/man8 to make them
230available.
231
232Cross-compiling is possible, but is not well-tested, except for compiling
233Windows binaries on Linux. (See README.Windows for details.) To
234cross-compile, specify the TARGET environment variable when launching make,
235as in "TARGET=win64 make" to compile for 64-bit (x86-64, X64, AMD64) Windows
236on a non-Windows platform. Supported TARGET values are linux, freebsd,
237solaris, macos, win32, and win64.
238
239Caveats
240-------
241
242DISK PARTITIONING SOFTWARE IS DANGEROUS! Although the GPT fdisk project has
243existed since 2009, I do not claim it is entirely bug-free; in fact a glance
244at the revision history shows recent bug fixes. I believe all
245data-corruption bugs to be squashed, but I know full well that the odds of
246my missing something are high. This is particularly true for large
247(over-2TiB) drives and use in exotic environments.
248
249My main development platform is a system running the 64-bit version of
250Ubuntu Linux. I've also tested on several other 32- and 64-bit Linux
251distributions, Intel-based macOS 10 and 11, 64-bit FreeBSD 7.1, and Windows
2527 and 10. Other environments qualify as "exotic," and even macOS and Windows
253are borderline exotic in this context, since I use Linux almost exclusively,
254and my impression is that GPT fdisk is far more commonly used on Linux than
255in other OSes.
256
257Redistribution
258--------------
259
260This program is licensed under terms of the GNU GPL (see the file COPYING).
261
262Acknowledgements
263----------------
264
265This code is mostly my own; however, I've used three functions from two
266other GPLed programs:
267
268- The code used to generate CRCs is taken from the efone program by
269  Krzysztof Dabrowski and ElysiuM deeZine. (See the crc32.h and
270  crc32.cc source code files.)
271
272- A function to find the disk size is taken from Linux fdisk by A. V. Le
273  Blanc. This code has subsequently been heavily modified.
274
275Additional code contributors include:
276
277- Yves Blusseau (1otnwmz02@sneakemail.com)
278
279- David Hubbard (david.c.hubbard@gmail.com)
280
281- Justin Maggard (justin.maggard@netgear.com)
282
283- Dwight Schauer (das@teegra.net)
284
285- Florian Zumbiehl (florz@florz.de)
286
287- Guillaume Delacour (contributed the gdisk_test.sh script)
288