GPT fdisk (aka gdisk) and FixParts | |
by Roderick W. Smith, rodsmith@rodsbooks.com | |
******************************** IMPORTANT ******************************** | |
Most versions of Windows cannot boot from a GPT disk on BIOS-based | |
computers, and most varieties prior to Vista cannot read GPT disks. GPT | |
fdisk is a partition editor for GPT disks, and it will *AUTOMATICALLY | |
CONVERT* MBR disks to GPT form. Therefore, you should **NOT** use GPT fdisk | |
on a Windows system unless you fully understand what you're doing or are | |
certain that your computer boots in EFI/UEFI mode! If you accidentally use | |
GPT fdisk on a BIOS-mode boot disk, or perhaps even on a data disk, you may | |
find recovery to be very difficult! Pre-installed Windows 8 and later | |
systems almost always use GPT disks and boot in EFI/UEFI mode, but | |
self-installed Windows 8 systems sometimes use BIOS mode. This caveat does | |
not apply to FixParts, though; that tool works only on MBR disks. | |
*************************************************************************** | |
Read the main README file for general information on the program, and read | |
the gdisk.html or fixparts.html documents (the Linux man pages converted to | |
HTML format) for detailed use information. My GPT fdisk Web page, | |
http://www.rodsbooks.com/gdisk/, provides a more tutorial introduction to | |
the software. I originally wrote GPT fdisk on Linux, and some Linux- and | |
Unix-centric language remains in the documentation. | |
Windows Use Notes | |
----------------- | |
The Windows version of GPT fdisk was added with version 0.6.2 of the | |
package. The Windows binary package includes the gdisk.exe interactive | |
text-mode program file as well as the sgdisk program that's available | |
with Linux, FreeBSD, and OS X builds. | |
Beginning with version 0.8.10, I'm distributing both 32-bit and 64-bit | |
binaries, which include the strings "32" or "64" in their names. The 32-bit | |
binaries work fine on most versions of Windows, but some 64-bit | |
installations of Windows 8 lack 32-bit support libraries and so may need | |
the 64-bit binaries. | |
The FixParts program (fixparts32.exe and fixparts64.exe) is new with GPT | |
fdisk 0.7.0. As described in the main README file, this program fixes | |
certain partition table problems that can be created by buggy partitioning | |
software. Windows seems to be unfazed by most such problems, but I've not | |
done an extensive survey of Windows partitioning tools on this score. | |
To install the programs, copy the gdisk32.exe, cgdisk32.exe, sgdisk32.exe | |
and fixparts32.exe (or gdisk64.exe, cgdisk64.exe, sgdisk64.exe and | |
fixparts64.exe) program files to any directory on your path, such as | |
C:\Windows. Alternatively, you can change to the program's directory or type | |
its complete path whenever you use it. | |
To use the programs, first launch a Command Prompt as the Administrator. To | |
do this, locate the Command Prompt program icon, right-click it, and select | |
"Run as Administrator." If you use a non-Administrator Command Prompt, you | |
won't be able to edit hard disk partition tables, although you will be able | |
to edit raw disk image files. | |
The program requires a hard disk identifier as an option. You can specify | |
this in either of two forms. The first way is as a number followed by a | |
colon, as in: | |
gdisk 0: | |
Disks are numbered starting from 0, so the preceding command launches gdisk | |
on the first disk. The second way to specify a disk device is via a | |
harder-to-remember name: | |
gdisk32 \\.\physicaldrive0 | |
This command is equivalent to the earlier one -- it edits the partition | |
table on the first physical disk. Change the number at the end of the | |
device name to change the disk edited. | |
If you pass the "-l" option to gdisk64.exe in addition to the disk | |
identifier, the program displays the current partition table information and | |
then exits. (Alternatively, you can pass "-p" to sgdisk64.exe.) This use | |
entails no risk to MBR disks, since the program never writes data back to | |
the disk when used in this way. | |
As noted above, editing the first disk with GPT fdisk is a Bad Idea on older | |
BIOS-based computers. Newer computers typically use an Extensible Firmware | |
Interface (EFI) and boot from GPT disks. It's safer to edit non-boot disks, | |
which usually have numbers of 1 and above, but only if you run a version of | |
Windows with GPT support. For more information on Windows' support of GPT, | |
see Microsoft's Web page on the topic: | |
http://www.microsoft.com/whdc/device/storage/GPT_FAQ.mspx | |
The Windows binaries I've compiled do not support Unicode UTF-16LE GPT | |
partition names. This feature was added to version 0.7.1 of the software | |
for Linux, FreeBSD, and OS X, and with changes to some #ifndef lines in the | |
source files, it can be compiled for Windows; however, it seems to do | |
little good in Windows because of Command Prompt window and/or ICU library | |
limitations. Thus, I've omitted this support in the interests of | |
simplifying the binary distribution, since including it would mean | |
distributing the ICU libraries. | |
Source Code and Compilation Issues | |
---------------------------------- | |
I have successfully compiled GPT fdisk using three different Windows | |
compilers: | |
- MinGW (https://www.mingw-w64.org/), using either a Linux-hosted | |
cross-compiler or under Windows using the original MinGW or MSYS2 | |
(https://www.msys2.org). This is my only GPT fdisk development environment | |
for Windows in 2022. | |
- Microsoft Visual C++ 2008 Express | |
(http://www.microsoft.com/express/Windows/) -- This compiler requires a | |
third-party stdint.h file (I used the one from | |
http://web.archive.org/web/20130317001712/http://msinttypes.googlecode.com/svn/trunk/stdint.h), | |
but it otherwise worked fine the last time I tried it. A project is easily | |
created by adding all the *.h files and all the *.cc files except | |
diskio-unix.cc, sgdisk.cc, and whichever program file you intend to NOT | |
build (gdisk.cc or fixparts.cc). | |
- Microsoft Visual C++ 2010 Express -- This compiler works much like the | |
2008 version, although I didn't need to add a third-party stdint.h file. | |
Although I used Microsoft Visual C++ in the past, I haven't tried using | |
these compilers recently and so I can't promise they would work today (in | |
2022). | |
If you modify GPT fdisk to get it to compile under another compiler, I | |
welcome submission of patches. | |
The following instructions focus on use of MinGW to compile GPT fdisk for | |
Windows. | |
My primary development environment is Ubuntu Linux, using the MinGW | |
cross-compiler. This system can compile the gdisk and fixparts binaries with | |
no need for additional libraries; after installing MinGW (via the | |
g++-mingw-w64 package in Ubuntu, or the equivalent in another distribution), | |
you can type "TARGET=win32 make" to compile 32-bit binaries, and | |
"TARGET=win64 make" to compile 64-bit binaries. This will attempt to build | |
gdisk, sgdisk, and fixparts; but the sgdisk build will fail until you | |
install the popt libraries, as described shortly. You can build the other | |
binaries by specifying them, as in "TARGET=win64 make gdisk" to build the | |
64-bit gdisk binary alone. | |
If you use Windows, your best bet is likely to be to install the MSYS2 | |
package (https://www.msys2.org). This package provides MinGW and a package | |
management system based on pacman (used by Arch Linux) for installing | |
additional libraries. To install the libraries needed to compile sgdisk and | |
cgdisk, type "pacman -S mingw-w64-x86_64-popt mingw-w64-x86_64-gettext | |
mingw-w64-x86_64-ncurses" if you want to compile 64-bit binaries; change | |
'x86_64' to 'i686' for 32-bit packages. This command will install the popt | |
library needed by sgdisk and the ncurses library needed by cgdisk, along | |
with gettext, which is needed by popt. With these libraries installed, you | |
should be able to compile all four Linux programs -- gdisk, cgdisk, sgdisk, | |
and fixparts. Typing "make" alone in the MSYS2 shell should build all four | |
programs for the host architecture (x86-64 or i686); to compile for the | |
other architecture, you must specify it with a "TARGET=" specification, as | |
under Linux. (The Makefile does not currently support ARM64 targets for | |
Windows.) | |
If you want to compile sgdisk for Windows under Linux, you can do so; | |
however, you must copy the relevant header and library files from a Windows | |
installation to Linux. Specifically, you must copy: | |
Windows File Linux Directory | |
------------ --------------- | |
/mingw64/include/popt.h /usr/x86_64-w64-mingw32/include/ | |
/mingw64/lib/libpopt.a /usr/x86_64-w64-mingw32/lib/ | |
/mingw64/lib/libintl.a /usr/x86_64-w64-mingw32/lib/ | |
/mingw64/lib/libiconv.a /usr/x86_64-w64-mingw32/lib/ | |
For 32-bit binaries, change /mingw64 to /mingw32 on the Windows source and | |
x86_64-w64-mingw32 to i686-w64-mingw32 on the Linux destination. | |
In theory, you should be able to do something similar to compile cgdisk. The | |
relevant files are: | |
Windows File Linux Directory | |
------------ --------------- | |
/mingw64/include/ncursesw/curses.h /usr/x86_64-w64-mingw32/include/ncursesw/ | |
/mingw64/include/ncursesw/ncurses.h /usr/x86_64-w64-mingw32/include/ncursesw/ | |
/mingw64/include/ncursesw/ncurses_dll.h /usr/x86_64-w64-mingw32/include/ncursesw/ | |
/mingw64/include/ncursesw/unctrl.h /usr/x86_64-w64-mingw32/include/ncursesw/ | |
/mingw64/lib/libncurses.a /usr/x86_64-w64-mingw32/lib/ | |
In practice, this has not worked for me; the compilation fails with a | |
complaint about an undefined reference to 'nanosleep'. My guess is that the | |
ncurses version installed in Windows is too new to work with the MinGW | |
libraries in Ubuntu (20.04 or 22.04). It's conceivable it would work with | |
another distribution, though. | |
The Makefile is configured to create statically-linked binaries so as to | |
simplify installation of the binaries. If you want smaller binaries, you can | |
remove the various static options from the Makefile. You can also strip the | |
binaries ("make strip") to remove unused code. |