GPT is the acronym for GUID Partition Table: it is the new standard for storage devices: it is part of the UEFI firmware specifications and the successor of MBR, of which it overcomes several limitations. MBR for example, allows a maximum of 4 primary partitions (GPT supports up to 128 of them), and works only with drives up to 2TB in size. On Linux there are several tools we can use to create and manipulate GPT partition tables. In this tutorial we focus on the usage of the gdisk and sgdisk utilities.
In this tutorial you will learn:
- How to list the partition table of a device with gdisk
- How to create a GPT partition table
- How to create a new partition
- How to remove a partition
- How to resize a partition
- How to work non-interactively with sgdisk

Software requirements and conventions used
Category | Requirements, Conventions or Software Version Used |
---|---|
System | Distribution independent |
Software | gdisk/sgdisk |
Other | Root privileges |
Conventions | # – requires given linux-commands to be executed with root privileges either directly as a root user or by use of sudo command$ – requires given linux-commands to be executed as a regular non-privileged user |
Gdisk vs sgdisk
In this tutorial we will use two different tools: gdisk and sgdisk. They let us perform the same operations, with a big difference: the former works interactively, provides confirmation prompts and a question-based interface. Changes we perform with it are written to the disk only when we use the dedicated command, in order to minimize mistakes.
The latter, instead, works in a non-interactive way: it is meant to be used inside shell scripts, or more generally directly from the command line. Sgdisk commands are applied immediately, therefore it should be used very carefully. In the first part of this tutorial we focus on how to perform the basic operations with gdisk, in the second we see how to perform the same operations with sgdisk.
Listing the partition table of a device
To start using gdisk, all we have to do is to invoke the program passing the path of the device we want to manipulate as argument. To list the partition table of a device, we call the program with the -l
option:
$ sudo gdisk -l /dev/sdc
The following is what the above command returns on a device which is completely uninitialized:
GPT fdisk (gdisk) version 1.0.8 Partition table scan: MBR: not present BSD: not present APM: not present GPT: not present Creating new GPT entries in memory. Disk /dev/sdc: 15122432 sectors, 7.2 GiB Model: SD/MMC/MS PRO Sector size (logical/physical): 512/512 bytes Disk identifier (GUID): 32A31D98-1500-4FE5-836A-69F289D048A7 Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 15122398 Partitions will be aligned on 2048-sector boundaries Total free space is 15122365 sectors (7.2 GiB)
Creating a new GPT partition table
The device we are working with, as we saw, is completely empty; it doesn’t contain any partition table. To create a new GPT partition table on it, we pass it as argument when invoking gdisk, without providing any options:
$ sudo gdisk /dev/sdc
As soon as we launch the command above, we will be prompted to enter a command command:
Command (? for help):
To create a new GPT partition table, we must use the o
command (we type o
, and press enter). We will be warned that the action will destroy all existing partitions on the disk, and we will be prompted to confirm our choice:
Command (? for help): o This option deletes all partitions and creates a new protective MBR. Proceed? (Y/N): Y
As we already said, when using gdisk, the changes we make to the disk are not immediately written: this is a security measure. To make them effective we must use the w
command:
Command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): y OK; writing new GUID partition table (GPT) to /dev/sdc. The operation has completed successfully.
We will be prompted to provide a last confirmation. After we provide it, changes will become effective, and (hopefully) we will be notified of the operation success.
Creating a new partition
We initialized our device, now we can start creating partitions; let’s see how to do it. To create a new partition we must use the n
command. We will be prompted to answer a series of questions; as an answer for each of them we can provide a value or just press enter to accept the default one, displayed
between parenthesis.
The first thing we should decide is the number which should be used for the partition, in the range from 1 to 128. Here we usually want to use the default value, which is progressive.
As a second thing, we should decide at what sector of the disk the partition should start. For the first partition, the default starting sector is 2048
. The default value is what we want to use for this parameter in the vast majority of cases.
The next thing we should decide, is at what sector the partition should end: this, as you can imagine, determines the partition size. Instead of specifying a sector, we can provide the partition size directly, with an integer followed by one of the available suffixes: K
,M
,G
,T
,P
. To create a partition of 500 MiB in size, for example, we would enter +500M
as a value.
As a last thing, we will be prompted to decide what HEX code to use for the partition. Here the default value is 8300 (Linux filesystem)
. To obtain the list of all the available codes, all we have to do is to enter the L
command, and then press <enter>
again:
0700 Microsoft basic data 0701 Microsoft Storage Replica 0702 ArcaOS Type 1 0c01 Microsoft reserved 2700 Windows RE 3000 ONIE boot 3001 ONIE config 3900 Plan 9 4100 PowerPC PReP boot 4200 Windows LDM data 4201 Windows LDM metadata 4202 Windows Storage Spaces 7501 IBM GPFS 7f00 ChromeOS kernel 7f01 ChromeOS root 7f02 ChromeOS reserved 8200 Linux swap 8300 Linux filesystem 8301 Linux reserved 8302 Linux /home 8303 Linux x86 root (/) 8304 Linux x86-64 root (/) 8305 Linux ARM64 root (/) 8306 Linux /srv 8307 Linux ARM32 root (/) 8308 Linux dm-crypt 8309 Linux LUKS 830a Linux IA-64 root (/) 830b Linux x86 root verity 830c Linux x86-64 root verity 830d Linux ARM32 root verity 830e Linux ARM64 root verity 830f Linux IA-64 root verity 8310 Linux /var 8311 Linux /var/tmp 8312 Linux user's home 8313 Linux x86 /usr 8314 Linux x86-64 /usr 8315 Linux ARM32 /usr 8316 Linux ARM64 /usr 8317 Linux IA-64 /usr 8318 Linux x86 /usr verity Press the <Enter> key to see more codes, q to quit:
The codes are not displayed all at once. To scroll the list we should keep pressing <enter>
. In our example we just confirmed the default HEX code for the partition:
Command (? for help): n Partition number (1-128, default 1): First sector (34-15122398, default = 2048) or {+-}size{KMGTP}: Last sector (2048-15122398, default = 15122398) or {+-}size{KMGTP}:+500M Hex code or GUID (L to show codes, Enter = 8300): Changed type of partition to 'Linux filesystem'
At this point the changes exist only in memory; we enter w
to write them to disk.
Removing a partition
To remove an existing partition using gdisk we have to use the ‘d’ command. Once we enter it, we will be asked to provide the number of the partition we want to delete. For the sake of this example we remove the second partition on our device:
Command (? for help): d Partition number (1-2): 2
To write the changes to the disk, as we already know, we enter the w
command.
Resizing a partition
Resizing a partition is always a dangerous operation which should be performed carefully, and possibly after creating a backup. Performing such operation with gdisk is somewhat counter-intuitive since the process involves the deletion of the current partition (in memory only), and its re-creation with the same starting sector and the new size/end sector.
Enlarging a partition/filesystem
Suppose we want to extend the second partition we created in this tutorial, so that it uses all the available space on the disk. Here is how we would proceed. We first request information about the partition we are about to manipulate using the i
command:
Command (? for help): i Partition number (1-2): 2 Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem) Partition unique GUID: D6FF2779-6F14-4E3E-876C-83E38F3A3FD7 First sector: 1026048 (at 501.0 MiB) Last sector: 3123199 (at 1.5 GiB) Partition size: 2097152 sectors (1024.0 MiB) Attribute flags: 0000000000000000 Partition name: 'Linux filesystem'
Since we have to delete the partition as part of the resizing operation, we want to keep its current information at hand. One thing we may want to do is to apply the current partition unique GUID to the newly created one (by default a random one is generated). As we already know, to delete the partition we have to use the d
command:
Command (? for help): d Partition number (1-2): 2
At this point we recreate the partition with the n
command, using the same partition number and starting point (in this case the default one), and provide the new size. Since in this case we want to use all the available space, we will also use the default value suggested by the application:
Command (? for help): n Partition number (2-128, default 2): 2 First sector (34-15122398, default = 1026048) or {+-}size{KMGTP}: Last sector (1026048-15122398, default = 15122398) or {+-}size{KMGTP}: Current type is 8300 (Linux filesystem) Hex code or GUID (L to show codes, Enter = 8300): Changed type of partition to 'Linux filesystem'
To change the unique GUID of the new partition and use the previous one, we should enter the “advanced operations” menu of gdisk, using the x
command (notice how the prompt changes)
Command (? for help): x Expert command (? for help):
The expert command we want to use is c
. Once we enter it, We will be asked to provide the partition number and the new GUID for it. In this case we enter the one that was used for the “old” partition:
Expert command (? for help): c Partition number (1-2): 2 Enter the partition's new unique GUID ('R' to randomize): D6FF2779-6F14-4E3E-876C-83E38F3A3FD7 New GUID is D6FF2779-6F14-4E3E-876C-83E38F3A3FD7
At this point we can save the changes to disk with the w
command (if for some reasons we want to leave the “expert” menu and return to the main one, we can use m
instead):
Expert command (? for help): w
We now have a much larger partition than before, but if there is a filesystem on it, it should still be enlarged to cover all the available space. The command used to perform the operation varies depending on the filesystem type.
Supposing we have an ext4
filesystem on the partition, we would first run a check using the e2fsck
command with the -f
option (in order to force the check even if the filesystem looks clean), and then proceed with the actual resizing using resize2fs
, which, when it is invoked without any options, extends the filesystem to all the available partition space:
$ sudo e2fsck -f /dev/sdc2 && sudo resize2fs /dev/sdc2
Shrinking a partition
To shrink a partition we should perform the above steps in reverse order: first we shrink the filesystem (if any) to a size which is slightly less than the new size we will use for the partition, or to the minimum possible size (that’s what we do in the example below, with the -M
option), than we shrink the
partition itself, and finally we enlarge the filesystem again, so that it uses all the available space.
Supposing we want to shrink the second partition on the disk to 2 GiB, we would run:
$ sudo e2fsck -f /dev/sdc2 && sudo resize2fs -M /dev/sdc2
At this point we can launch gdisk, and perform the same steps we did in the previous example, this time providing an ending sector or a partition size smaller than the current one. Once the changes are saved and written to the disk, we enlarge the filesystem so that it covers all the available space:
$ sudo e2fsck -f /dev/sdc2 && sudo resize2fs /dev/sdc2
Performing operations non-interactively with sgdisk
As we already said, While gdisk is an interactive program, sgdisk is a command line utility which can be used to perform operations non-interactively. Let’s see how to perform the same operations we performed in the previous examples, directly with sgdisk.
Creating a GPT partition table
To create a GPT partition table with sgdisk
, all we need to do is to run the following command:
$ sudo sgdisk -o /dev/sdc
When invoked with the -o
option (or --clear
), sgdisk clears any existing partition table on the given device, and creates a new GPT partition table. Again, since the program is meant to be used from scripts, no warnings will be issued, and no confirmations will be requested, so it should be used carefully.
Creating a partition
To create a new partition, we invoke sgdisk with the -n
option (short for --new
) and provide the partition number, partition start and partition end with the following syntax:
partition_number:partition_start:partition_end
To create a partition with number 2
which uses the first available start sector, with a size of 1GiB (1024 MiB), therefore we would write:
2::+1G
If we want the partition to cover all the available space on the disk, instead, we would use 0
as partition end value:
2::0
If we want to use one specific HEX code for the partition, we should use the -t
option (short for --typecode
) with the following syntax:
partition_number:hexcode
The complete command to create the partition and assign the 8300
hex code to it explicitly would therefore be:
$ sudo sgdisk --new 2::+1G --typecode 2:8300 /dev/sdc
Removing a partition
To remove a partition from the disk directly from the command line, without any interaction, we have to use sgdisk with the -d
option (--delete
), and provide the partition number as the option argument. To delete the partition number 2, we would write:
$ sudo sgdisk --delete 2 /dev/sdc
Resizing a partition
The process of resizing a partition with sgdisk is the same we used interactively with gdisk, but its performed in one line, for example, to enlarge the second partition of the disk so that it covers all the available space, we would run:
$ sudo sgdisk \ -d 2 \ -n 2:0:0 \ -u 2:D6FF2779-6F14-4E3E-876C-83E38F3A3FD7 \ /dev/sdc
In the example above the -d
option, as we know is used to delete the partition, -n
is used to create a new one with the same number and the default value for start and ending sectors (0, means “use the default”).
Finally, the -u
option is the short for --partition-guid
: we used it to assign the new partition the same GUID of the deleted one.
To request information about a specific partition, we can use the -i
option and provide the partition number. For example:
$ sudo sgdisk -i 2 /dev/sdc
Conclusions
In this tutorial we learned to used the gdisk and sgdisk utilities in order to manipulate GPT partition tables. We saw that the former is a program which is meant to be used interactively, and provides confirmation prompts and other security measures, while the latter is meant to be used directly from the command line or inside shell scripts, and modifications we made with it are immediately effective. We saw how to create a new partition tables and how to create, remove and resize partitions with both tools. Partitions manipulations is a dangerous activity and should be performed with care. For further information about the mentioned tools, please check their respective manuals.