| 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. Under Windows, Microsoft Visual C++ 2008 can |
| be used instead. In addition, note these requirements: |
| |
| * On Linux, FreeBSD, OS X, and Solaris, libuuid must be installed. This is |
| the standard for Linux and OS X, 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 not 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 OS X, but you may need to |
| install the development headers (libicu-dev or something similar in |
| Linux; or the libicu36-dev Fink package in OS X). 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. These files were installed |
| already on my Mac OS X development system; however, they may have been |
| installed as dependencies of other programs I've installed. 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. Mac OS 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). Alternatively, you |
| can compile gdisk and/or cgdisk alone, without sgdisk; gdisk doesn'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. (You may need to type "make -f Makefile.mac" on Mac OS |
| X, "make -f Makefile.freebsd" on FreeBSD, "make -f Makefile.solaris" on |
| Solaris, or "make -f Makefile.mingw" to compile using MinGW for Windows.) |
| 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. 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. |
| |
| Caveats |
| ------- |
| |
| THIS SOFTWARE IS BETA SOFTWARE! IF IT WIPES OUT YOUR HARD DISK OR EATS YOUR |
| CAT, DON'T BLAME ME! To date, I've tested the software on several USB flash |
| drives, physical hard disks, and virtual disks in the QEMU and VirtualBox |
| environments. Many others have now used the software on their computers, as |
| well. 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; my only direct testing with such disks is with |
| virtual QEMU and VirtualBox disks. I've received user reports of success with |
| RAID arrays over 2TiB in size, though. |
| |
| 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 Mac OS X 10.6 and several later versions, 64-bit |
| FreeBSD 7.1, and Windows 7 and 10. |
| |
| 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 (dschauer@ti.com) |
| |
| - Florian Zumbiehl (florz@florz.de) |
| |
| - Guillaume Delacour (contributed the gdisk_test.sh script) |