| 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) |