How can I tell whether my harddrive is laid out using an MBR or GPT format?
9 Answers
You can use parted -l
to determine the type of partition table. Eg:
$ sudo parted -l
Model: ATA TOSHIBA THNSNS25 (scsi)
Disk /dev/sda: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 4194kB 32.2GB 32.2GB primary ext4 boot
2 32.2GB 256GB 224GB primary ext4
Model: ATA Hitachi HDT72101 (scsi)
Disk /dev/sdb: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 32.2GB 32.2GB primary ext4 boot
2 32.2GB 996GB 964GB primary ext4
3 996GB 1000GB 4295MB primary linux-swap(v1)
The Partition Table
field shows that I am using a msdos
MBR partition table (the one still commonly used for Linux and Windows) on both disks. From the man
page parted
can create (and thus hopefully identify) the following types of partition table (or more broadly `disk label'):
bsd
dvh
gpt - this is a GPT partition table
loop - this is raw disk access without a partition table
mac
msdos - this is a standard MBR partition table
pc98
sun
Update
It is worth adding the command for listing a single partition since this is not obvious without some knowledge of parted
and it can be a pain finding the data you need if there are multiple drives. For /dev/sda
you would do:
parted /dev/sda print
-
That is a great command, Graeme. Although I've been using Linux for several years, I had never really noticed it. Thanks!– TimCommented Mar 18, 2014 at 15:59
-
3
-
On linux, you can check this via the gdisk
tool which should be available for any distro.
gdisk -l /dev/sda
Here, /dev/sda
is the device node of the physical drive, not a partition (/dev/sda1
, /dev/sda2
, etc. are partitions).
If you see something that includes:
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory.
***************************************************************
You have a MBR style disk. Don't worry, this did not do any harm.
If you don't see this warning, you have a GPT disk, or a hybrid GPT/MBR disk. The later are used mostly on Apple machines intended to dual-boot versions of MS Windows which do not support GPT. gdisk
will indicate this with:
Found valid GPT with hybrid MBR; using GPT
They may also be used in other situations where support for both styles is required.
-
1Or the reverse - trying to use
cfdisk
on a GPT partition will also result in a warning.– orionCommented Mar 18, 2014 at 14:54 -
If not installed and not in a
gdisk
package, it can be found in thegptfdisk
package... at least on Gentoo.– user44370Commented Mar 18, 2014 at 15:22 -
2@orion I would not recommend that as some versions of tools like
fdisk
orcfdisk
may support GPT and therefore not show an error. Commented Mar 18, 2014 at 15:37 -
For me
gdisk
detects a hybrid GPT+MBR partition table and givesFound valid GPT with hybrid MBR; using GPT.
. This seems to be the only method which will detect a hybrid table.– GraemeCommented Mar 18, 2014 at 19:11 -
@Graeme : Thanks. I was unaware of these (the original hybrid reference was edited in by Stephane Chazelas), but I did a bit of reading and added some details. Commented Mar 18, 2014 at 20:34
As the OS was not specified, here is FreeBSD way of doing things.
All is done through the gpart
command (short for GEOM partioner - nothing to do with GNU).
A simple gpart show
would show you all the available partitions of all the disks, but you can specify the device to have a more precise look on one:
legacy partition layout with MBR (aka "msdos") and BSD partition schemes (a 2-level partitioning was usually required for BSD systems, unless using the full disk):
$
gpart show
=> 63 67108801 ada0 MBR (32G) 63 67108545 1 freebsd [active] (32G) 67108608 256 - free - (128k) => 0 67108545 ada0s1 BSD (32G) 0 2097152 2 freebsd-swap (1.0G) 2097152 65011393 1 freebsd-ufs (31G)
modern partition layout using GPT:
$
gpart show /dev/ada2
=> 34 976773101 ada2 GPT (465G) 34 6 - free - (3.0k) 40 128 1 freebsd-boot (64k) 168 67108864 2 freebsd-swap (32G) 67109032 901775360 3 freebsd-zfs (430G)
To know more, all is in the gpart
manual.
Use
$ sudo fdisk -l
Disk /dev/sda: 119.2 GiB, 128035676160 bytes, 250069680 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x987c1a05
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 999423 997376 487M 83 Linux
/dev/sda2 1001470 250068991 249067522 118.8G 5 Extended
/dev/sda5 1001472 250068991 249067520 118.8G 8e Linux LVM
See the Disklabel type: dos. If it shows dos that means it is MBR schema else GPT schema
With udisks
on Linux:
$ sudo /lib/udev/udisks-part-id /dev/sda
using device_file=/dev/sda syspath=/sys/devices/pci0000:00/0000:00:0b.0/ata1/host0/target0:0:0/0:0:0:0/block/sda, offset=0 ao=0 and number=0 for /dev/sda
Entering MS-DOS parser (offset=0, size=500107862016)
MSDOS_MAGIC found
found partition type 0xee => protective MBR for GPT
Exiting MS-DOS parser
Entering EFI GPT parser
GPT magic found
partition_entry_lba=2
num_entries=128
size_of_entry=128
Leaving EFI GPT parser
EFI GPT partition table detected
UDISKS_PARTITION_TABLE=1
UDISKS_PARTITION_TABLE_SCHEME=gpt
UDISKS_PARTITION_TABLE_COUNT=4
Above, I've got a drive with hybrid GPT+MS-DOS partitioning. In that case, the Linux kernel ignores the MS-DOS partitioning, which is why udisks
sets UDISKS_PARTITION_TABLE_SCHEME to gpt.
That udisks-part-id tool is used to populate the udev database. So if you've got udisks
installed, you should be able to query that information even as a non-priviledged user with:
$ udevadm info -q property -n sda | grep UDISKS_PARTITION_TABLE_SCHEME
UDISKS_PARTITION_TABLE_SCHEME=gpt
-
2Note that you will get similar output regardless of whether there is a hybrid GPT+MBR or not. GPT requires a fake MBR with a single full disk partition of type
0xee
. In a hybrid this is a normal MBR with one0xee
partition (and potential for major problems if the MBR data goes out of sync with the GPT data).– GraemeCommented Mar 18, 2014 at 18:55 -
On one of the CentOS systems where I tried this, it prints ID_PART_TABLE_TYPE=dos, so grep fails to find the line. Commented Jan 16, 2021 at 12:55
You can use blkid
. But you may need to run it as root or as sudo blkid
.
Examples with output:
# blkid /dev/sdc
/dev/sdc: PTUUID="92f03b9b-7402-4ad2-8316-08a991c237b3" PTTYPE="gpt"
# blkid -o export /dev/sdc
DEVNAME=/dev/sdc
PTUUID=92f03b9b-7402-4ad2-8316-08a991c237b3
PTTYPE=gpt
Or in a script, with the -o value
option :
disk=$1
part_type=$(blkid -o value -s PTTYPE $disk)
case $part_type in
gpt) echo "GPT";;
dos) echo "MBR";;
*) echo "partition is $part_type";;
esac
Alternatively as a $USER
you could check for the existence of an EFI Partition (which would indicate a gpt
partition scheme):
$ lsblk | grep -i efi
├─nvme0n1p1 259:2 0 100M 0 part /boot/efi
-
Which blkid version is this? When I try with 2.17.0, it doesn't print anything for the whole disk, it only shows information for individual partitions. Commented Jan 16, 2021 at 12:53
-
1@MilanBabuškov : Indeed, version 2.27 in Ubuntu 16 doesn't show it. Version 2.33.1 in Debian 10 does show it.– mivkCommented Jan 16, 2021 at 14:36
In my Alpine Linux Partition scripts I use:
check_scheme() {
fdisk -l $1 |grep "Disklabel type:" |awk '{ print $3 }'
}
With lsblk
from util-linux
v. 2.33 and later, one can print only the partition table type via
lsblk /dev/nvme0n1 -dno pttype
gpt
d
omits children/slaves, n
omits headers and o
prints only the specified field.
It's quite handy since it doesn't need post-processing the output and doesn't require root access.
-
-
@goldilocks - afaik the concept of
mbr
was first introduced with IBM PC-DOS 2.0 and most likely that's why almost all disk management tools call this type of partition tabledos
(rarelymsdos
) instead ofmbr
(the only exception beinggdisk
which is a fairly new app) Commented Nov 20, 2023 at 20:52 -
o_O I know. Just indicating it for posterity. I think "DOS MBR" is/was used often as well, but that fact that there aren't any other widespread flavours of mbr led to one or the other being sufficient. Commented Nov 21, 2023 at 14:41
You can do this with fdisk and awk
fdisk -l | awk '/Disklabel type:/ {print $3}'