Linux Creating a Partition Size Larger Than 2TB

Posted on in Categories CentOS, Debian Linux, File system, Hardware, Howto, Linux, Linux Scalability, RedHat/Fedora Linux, Storage, Sys admin, Tips last updated August 7, 2016

Frankly speaking, you cannot create a Linux partition larger than 2 TB using the fdisk command. The fdisk won’t create partitions larger than 2 TB. This is fine for desktop and laptop users, but on server you need a large partition. For example, you cannot create 3TB or 4TB partition size (RAID based) using the fdisk command. It will not allow you to create a partition that is greater than 2TB. In this tutorial, you will learn more about creating Linux filesystems greater than 2 Terabytes to support enterprise grade operation under any Linux distribution.

To solve this problem use GNU parted command with GPT. It supports Intel EFI/GPT partition tables. Partition Table (GPT) is a standard for the layout of the partition table on a physical hard disk. It is a part of the Extensible Firmware Interface (EFI) standard proposed by Intel as a replacement for the outdated PC BIOS, one of the few remaining relics of the original IBM PC. EFI uses GPT where BIOS uses a Master Boot Record (MBR).

GUID Partition Table
(Fig.01: Diagram illustrating the layout of the GUID Partition Table scheme. Each logical block (LBA) is 512 bytes in size. LBA addresses that are negative indicate position from the end of the volume, with −1 being the last addressable block. Imaged Credit Wikipedia)

Linux GPT Kernel Support

EFI GUID Partition support works on both 32bit and 64bit platforms. You must include GPT support in kernel in order to use GPT. If you don’t include GPT support in Linux kernelt, after rebooting the server, the file system will no longer be mountable or the GPT table will get corrupted. By default Redhat Enterprise Linux / CentOS comes with GPT kernel support. However, if you are using Debian or Ubuntu Linux, you need to recompile the kernel. Set CONFIG_EFI_PARTITION to y to compile this feature.

File Systems
   Partition Types
     [*] Advanced partition selection
     [*] EFI GUID Partition support (NEW)

Find Out Current Disk Size

Type the following command:
# fdisk -l /dev/sdb
Sample outputs:

Disk /dev/sdb: 3000.6 GB, 3000592982016 bytes
255 heads, 63 sectors/track, 364801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

Linux Create 3TB partition size

To create a partition start GNU parted as follows:
# parted /dev/sdb

GNU Parted 2.3
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.

Creates a new GPT disklabel i.e. partition table:

(parted) mklabel gpt

Sample outputs:

Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes

Next, set the default unit to TB, enter:

(parted) unit TB

To create a 3TB partition size, enter:

(parted) mkpart primary 0 0


(parted) mkpart primary 0.00TB 3.00TB

To print the current partitions, enter:

(parted) print

Sample outputs:

Model: ATA ST33000651AS (scsi)
Disk /dev/sdb: 3.00TB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      0.00TB  3.00TB  3.00TB  ext4         primary

Quit and save the changes, enter:

(parted) quit

Sample outputs:

Information: You may need to update /etc/fstab.

Use the mkfs.ext3 or mkfs.ext4 command to format the file system, enter:
# mkfs.ext3 /dev/sdb1
# mkfs.ext4 /dev/sdb1
Sample outputs:

mkfs.ext4 /dev/sdb1 
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
183148544 inodes, 732566272 blocks
36628313 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
22357 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000, 214990848, 512000000, 550731776, 644972544

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

Type the following commands to mount /dev/sdb1, enter:
# mkdir /data
# mount /dev/sdb1 /data
# df -H

Sample outputs:

Filesystem             Size   Used  Avail Use% Mounted on
/dev/sdc1               16G   819M    14G   6% /
tmpfs                  1.6G      0   1.6G   0% /lib/init/rw
udev                   1.6G   123k   1.6G   1% /dev
tmpfs                  1.6G      0   1.6G   0% /dev/shm
/dev/sdb1              3.0T   211M   2.9T   1% /data

Make sure you replace /dev/sdb1 with actual RAID or Disk name or Block Ethernet device such as /dev/etherd/e0.0. Do not forget to update /etc/fstab, if necessary. Also note that booting from a GPT volume requires support in your BIOS / firmware. This is not supported on non-EFI platforms. I suggest you boot server from another disk such as IDE / SATA / SSD disk and store data on /data.

Further readings:

Updated for accuracy!

75 comment

  1. Typically with Linux and large disks, I prefer just to use LVM directly on the disk, no partitioning at all. I find this to be very stable and manageable.

  2. Using the default distro kernel in Debian 4.0 (etch):

    $ uname -a

    Linux video-server 2.6.18-4-amd64 #1 SMP Mon Mar 26 11:36:53 CEST 2007 x86_64 GNU/Linux
    $ zgrep _EFI_ /proc/config.gz


  3. Another tip, instead of doing

    # mkpart primary 0 3001G


    # mkpart primary 0 -0

    This will tell parted to fill up the entire drive with one volume.

  4. when i’m booting my own build debian kernel,
    it stocks when the system want’s to mount to root filesystem.

    it says somthing like
    the following disks found
    0800 sd sda
    0810 sd sdb

  5. the error is

    VFS: cannot open root device “sda2” or unknown-block(8,2)
    Please append a correct “root=” boot option; here are the available partitions:
    0800 244129792 sda driver: sd
    0810 9765519360 sdb driver: sd

  6. Since recent versions of Ubuntu and Debian have CONFIG_EFI_PARTITION compiled into their stock kernels, you should remove the part about having to recompile the kernel so that readers don’t needlessly recompile their kernels.

  7. What tripped me up is mkpart gpt is actually a lone command followed by a sub-command.
    Don’t type them both at once, wait for the next prompt before typing gpt.

  8. With EXT3 on most systems the max block size is 4096 bytes, which will still limit you to ~8TB for your filesystem.

  9. Hi,

    How to Create a Partition Size Larger than 2TB in Freebsd 7.2 64-bit and 32-bit OS. I have a hardware raid 5 disk contains total 8TB of size and want to create a partition like one 5TB and one 3TB.

    How I can get it done in FreeBsd.

    Thank you

  10. i don’t understand the premise.

    since i can’t buy a > 2tb drive, i don’t see the problem.

    fdisk /dev/sda
    (make a partition of type fd, that spans the entire 2tb drive)
    fdisk /dev/sdb
    ditto sdc
    ditto sdd

    mdadm (assemble sda through sdd into a raid 5 of size 6 terabytes)

    then mkfs /dev/md0

    show me where with the biggest drives you can buy as of today, that you’ll have to run “fdisk” against something larger then 2tb????

  11. Thanks for the great tut. There is 1 basic part I could not understand, once you create a single 3 TB partition using “mkpart primary 0 3001G”, how do you create partitions for OS, swap and other stuff.

  12. Great Post!!!

    Prior to this article, I was having trouble partitioning a 6TB Raid 5 Array (4 x 2TB disks).
    I’m running CentOS (2.6.18-164.10.1.el5) and used the following commands from this article and comments. Thanks!

    parted /dev/sda
    mklabel gpt
    mkpart primary 0 -0
    mkfs.ext3 /dev/sda

    * Note: I first tried using “gparted” but something with the data types in the graphical interface didn’t like the size of the raid array and was displaying negative values. Stupid gui.

    1. Just for people who get search hits on this page…I suggest the commands:

      parted /dev/sda
      mklabel gpt
      mkpart primary 0 -0
      mkfs.ext3 /dev/sda1

      SassyZ needs to understand that file systems are created within partitions while GPT are applied to disks. In other words, “parted mklabel gpt /dev/sda” writes a partition table to the first few sectors of a disk drive. The “mkpart” command creates a partition entry in that GPT. The first partition is named “/dev/sda1”. So the mistake in the last command is specifying the wrong device special file name. The command should be “mkfs.ext3 /dev/sda1” to create a file system in the first partition. The command “mkfs.ext3” will create a file system starting at sector zero and overwrite the GPT. (Note I’ve never tried a size of -0, so use print to verify the partition that was created.)

  13. [quote]show me where with the biggest drives you can buy as of today, that you’ll have to run “fdisk” against something larger then 2tb????[/quote]

    Try a hardware RAID for a change. The RAID controller will report a single huge drive to your OS. I just skip partitioning the RAID device altogether. *shrug*. Just mkfs /dev/sdb.
    No fiddling with exotic partitions. Not the prettiest of solutions, but very reliable nontheless.

  14. This isnt working for me.

    (parted) mklabel
    New disk label type? gpt
    Error: Invalid argument during write on /dev/sdb

    Would this have anything to do with it…

    Warning: Device /dev/sdb has a logical sector size of 4096. Not all parts of
    GNU Parted support this at the moment, and the working code is HIGHLY

    If so, how can I get around this? I’m using four 2TB drives in RAID5 – volume size is 5.9TB – it is ISCSI.

  15. [QUOTE]I just skip partitioning the RAID device altogether. *shrug*. Just mkfs /dev/sdb[/QUOTE]

    I tried that but if I run fdisk -l i get….

    Disk /dev/sdb doesn’t contain a valid partition table.

    Will this cause any problems?

  16. I tried that but if I run fdisk -l i get….
    Disk /dev/sdb doesn’t contain a valid partition table.
    Will this cause any problems?

    No. Not unless you try to read the drive with a different operating system or reinstall the operating system. Without the partition table, other OSes will think the drive is unpartitioned (blank). As long as you keep using Linux or perhaps BSD, just tell the system that the drive is a big single partition (mount /dev/sdb -t ext3 /mnt/bigdrive -o noatime) and it should work fine.

    If you want to protect the drive from another OS (I don’t know why you’d dual boot with a massive RAID like that) or make it more portable then you should follow the instructions in the article for creating a GPT instead.

  17. The BIOS does NOT use the MBR. It simply loads the first sector of the disk into memory at 0x7c00, and runs whatever is there. IBM way back when decided to use an MBR to partition drives. The bios knows nothing about the partitions or how the MBR is layed out, and can perform perfectly without an MBR. So much mis information for such a small article. You can use a GPT with a standard bios, it’s just that EFI is ‘aware’ of the GPT, where a standard bios knows nothing of it, and just loads the first sector of the disk, and lets it do it’s thing. All they did was move some code from the hard drive into the firmware, doesn’t really make any difference where it resides, it’s all software that performs the same function

  18. I thought I setup everything correctly but I am also getting

    Disk /dev/sdb doesn’t contain a valid partition table.

    The drive seems to work correctly but I dont like to see errors even if it is a false positive

    ATL support systems

  19. Disk /dev/sdb doesn’t contain a valid partition table.

    A common message as there is not partition table. This also displayed when you have software raid devices such as /dev/md0

    fdisk -l /dev/md0
    Disk /dev/md0: 58.0 GB, 58004537344 bytes
    2 heads, 4 sectors/track, 14161264 cylinders
    Units = cylinders of 8 * 512 = 4096 bytes
    Disk /dev/md0 doesn't contain a valid partition table

    Nothing to worry. Just ignore warning.

  20. i have an ISCSI 4TB storage, i have partitioned it as needed with GPT label, but suddenly after almost a year of usage when it reached now about 2.5TB i get those messages in the kernel:
    kernel: attempt to access beyond end of device
    its debian lenny, parted looks good, no errors.
    Model: IBM 1726-3xx FAStT (scsi)
    Disk /dev/sdb: 3999GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt

    Number Start End Size File system Name Flags
    1 17.4kB 3999GB 3999GB ext3 primary

    any suggestions?

  21. I used parted as described to work with large arrays, so I am quite happy with it. One question though. What would be the easiest way to copy partition tables between disks (not partitions!). I know in fdisk there was a tool called sfdisk that let you dump / rewrite partition tables from one disk to another…. is there a similar procedure in parted? any hints greatly appreciated! Adrian

    1. GPT stands for GUID Partition Table. This mean that each partition is assigned a unique ID when the partition is created. So, copying the partition table is a BAD IDEA, even if you know to also copy the backup partition table at the end of the disk. You should run parted (or whatever) on each disk that needs the “same” partition table and create a new partition table with the same partition types and sizes, but with new (unique) GUID values.

      Although not well documented, parted will accept starting location and size in sectors, if values in MB are being rounded and causing slightly different values than desired. To repartition the fourth disk sdd (and lose all of its content):
      parted -s /dev/sdd mkpart fat16 34s 1048609s

      Note that I’m worried about duplicating the GUID that uniquely identifies each partition, not the standardized GUID value that identifies the partition type.

  22. Great Tut as always.

    One question though… All this assumes you’ve got a running system to which you plan to add a second >2TB device. When using GPT, most modern linux distro’s will do as you described.

    However, how do you install to such a device?

    Situation = 8x2TB raid6 (hardware), and boot-able debian 6.0 cd -> The installer recognizes a 500 GB disk (I previously GPT’ed the device & partitioned it to my liking with gparted livecd).



    1. Solution for my original problem: ubuntu install cd (in my case 10.10) will only create GPT when the drive is large enough to require it, otherwise it will stick to msdos mbr.
      So: make you’re raid as you wish it to be and install straight from cd.

      One smaller problem I’m facing now is also GPT-related:
      I installed ubuntu on 3x2TB hw raid whilst there still was a 5X2TB soft raid in the same machine. Next I moved the data from the soft raid to the hw raid and expanded the hw raid to its full 8x2TB in raid 6.
      When now I want to enlarge /dev/sda3 (ext4) to full raid size I get blocked of by the GPT backup table <>

      But I don’t quite see how to do that.


      1. quote missing in previous reply:

        The backup GPT table is not at the end of the disk, as it should be. This might mean that another operating system believes the disk is smaller. Fix, by moving the backup to the end (and removing the old backup)?

  23. If you get this…
    Warning: The resulting partition is not properly aligned for best performance.

    You really should run parted like so…

    parted -a optimal /dev/sdb

    1. Even when starting parted with: parted -a optimal, I was still seeing:
      Warning: The resulting partition is not properly aligned for best performance.
      on a large (3TB) Advanced Format 4k sector drive.

      I found the solution is just to start at 1, not 0:

      (parted) mkpart primary 1 -1

      Will start the partition at the correct sector boundary, and the warning no loner appears. More info.

  24. I running problem on this. I try to mount a 4*2T RAID5 array with USB connect to NAS IOMEGA IX2-200, the IX2-200 is running Debian Lenny. How could I know if GPT is enabled?

    I applied mklabel gpt successfully, but I still see my RAID5 as 2T disk.

  25. When you get ready to format your new huge partition, I recommend using “-m0” with the mkfs command. This will give you the maximum amount of space to use.
    The ‘-m’ sets the reserved block to zero (0).

    If you do not add that to the command, you will loose (i think) either 5 or 10% of the drive to reserved blocks.

    # mkfs.ext3 -m0 /dev/sda1

  26. I’m getting the same errors from Parted as mentioned by Chris above…
    Warning: Device /dev/sdd has a logical sector size of 4096.” and “Error: Invalid argument during write on /dev/sdd Retry/Ignore/Cancel?” At which point only Cancel does anything.

    In my case the drive is a Hitachi XL3000 3TB (external USB 2.0) and I wanted to format it ext3. Since Parted didn’t work for me, I partitioned it under OS X (Disk Utility) as a single 3TB partition. And then mkfs.ext3 and tune2fs -L for the label. Seems to be working now, but if someone smarter than me wanted to explain how to do it without resorting to OS X, that would be awesome.

    Any help?

  27. Sean,

    I seem to have just purchased the same drive you are talking about, and yes I had the same problem. I ended it up there by making an error in following the instructions above. If you look at the drive, you will notice two partitions on it. Both zero in size. Use rm command for each partition and go carefully back to the beginning.
    Note, though, that the above instructions result with some empty space at the beginning of the drive. If you select units as Bytes, the empty space will be moved to the end of the drive.

  28. Hi Nick,

    Thanks for the reply. While in Parted, I still can’t get anywhere because the disk’s label remains unrecognized, and the mklabel command simply returns the above-mentioned error (pretty much every command in Parted returns the same error: “unrecognised disk label”). Should I be using a different Linux tool to look at the drive?

  29. Now the other question, how long will it take to fsck one of these 3TB filesystem? This could take many hours. We’ve seen it take over 12 hours for a large filesystem.

    By default the OS will automatically fsck the filesystem “every 25 mounts or 180 days, whichever comes first”. This could be a serious issue if you want to reboot the system 180 days from now, as your 4 minute reboot could turn into a 4+ hour wait for fsck to complete.

    If you want to disable the automatic fsck upon boot, try this command:

    # tune2fs -c 0 /dev/sdb1
    tune2fs 1.41.12 (17-May-2010)
    Setting maximal mount count to -1

    `tune2fs -i 0 /dev/sdb1` will also disable the automatic fsck.

    -= Stefan

  30. Every time i need some tech advise i go to google to find information, every other site is kind of scrambled, no clear information, until i find this page.

    NOTHING needs to be explained…..everything clear as water.
    Thank you so much guys, keep up the GREAT work

  31. I am a little confused. Do I need to perform these steps prior to OS install, during the install or after the install?

    1. Most modern installer will do these steps for you during installation only. If you add a new raid or large disk storage after the install, then you need to boot into os and type the commands.

  32. Typo:
    “(parted) mkpart primary 0 0”
    …should be…
    (parted) mkpart primary 0 3

    And Ubuntu appears to support GPT now (May 2012)

  33. Hi Master,
    i have problem when i create new partition:

    Use the mkfs.ext3

    #mkfs.ext3 /dev/mapper/mpath0
    /dev/mapper/mpath0 is apparently in use by the system; will not make a filesystem here!

    I’ve been working on this issue for almost day and I can’t figure out how to format these partition.

  34. Hello,
    How can I type those commands in the OS install beginning?

    My problem: 2.4Tb Raid5 with oracle Linux 5 U6

    the error message with GPT don’t allow me to do NEXT when I tried to format a layout :(

    Too BAD.

  35. Hi,

    If I got a 20TB device /dev/sdb & I creat a 16TB parition /dev/sdb1

    How do I create a second partition with the remaining space using parted?

  36. @Pete,

    You can use the same command to create a partition:

    mkpart primary 0.00TB 16.00TB
    mkpart primary 16.00TB 20.00TB

    You can do it interactively too. Just type mkpat and it will ask you various questions as follows:

    (parted) mkpart
    Partition type?  primary/extended? primary
    File system type?  [ext2]? ext4
    Start? 16TB
    End? 20TB
    (parted) print free
  37. Yeah, I should prbboaly wipe it clean and start over I just don’t feel like reinstalling everything. There was a time when reinstalling windows felt exciting a new beginning, and all that shit. Now it just feels like work.I think I’m gonna get one of those external USB drives. I saw dell selling 270 GB LaCie for $100 yesterday which seemed like a decent deal. Then I can back up both drives nightly (80G + 160G). a0|a0

  38. And this is why I hate Linux. Having to use a damned command-line thing for something that should be an easy GUI thing.

    Tried Linux for 3 months-, was pissed off by it, went back to Windows.

  39. Warning: Partition(s) on /dev/sda are being used and after ignoring it another error comes with resource busy, and server got down :( unable to extent partition to 5tb . Please help me

  40. Hi, Am trying to create a partition and i have a 28TB.

    WARNING: GPT (GUID Partition Table) detected on ‘/dev/sdb’! The util fdisk doesn’t support GPT. Use GNU Parted.

    WARNING: The size of this disk is 27.0 TB (26999991042048 bytes).
    DOS partition table format can not be used on drives for volumes
    larger than 2.2 TB (2199023255040 bytes). Use parted(1) and GUID
    partition table format (GPT).

    Disk /dev/sdb: 26999.9 GB, 26999991042048 bytes
    255 heads, 63 sectors/track, 3282561 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sdb1 1 267350 2147483647+ ee EFI GPT

    I followed all the steps on this page but a, stil getting error when ever i try to mount the device. Please note that am still learning linux.
    [[email protected] ~]#mkfs.ext4 /dev/sdb1
    bash: mkfs.ext4: command not found
    [[email protected] ~]# mkfs.ext3 /dev/sdb1
    mke2fs 1.39 (29-May-2006)
    mkfs.ext3: Size of device /dev/sdb1 too big to be expressed in 32 bits
    using a blocksize of 4096.
    Please help?

  41. First, Thanks to everyone for all of the support.

    As a newcomer to the Linux community I have made a firm commitment to making the transition from XP to Linux (14.04 LTS) just as I had to transition from DEC PDP-11’s to Apple and Windows GUI’s long ago.

    While attempting to format my 3TB drive via the previous directions it seems that my drive has mysteriously shrunk – LOL leaving the following:

    (parted) print free
    Model: WDC WD30 EURX-63T0FY0 (scsi)
    Disk /dev/sdb: 802GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt

    Number Start End Size File system Name Flags
    1 17.4kB 802GB 802GB primary

    What I am looking for is how to get access to all of the 3TB I started with and not have the partition change from one to many and lose data in the process.

    Clearly I must have missed a step or someone has assumed that all of us knew what steps were missing somewhere.

    Either that or my drive has fallen victim to the same form of inflation that has befallen the Dollar and Euro – LOL.

    Thank you.

  42. I would like to apply the same technique to a 4TB drive where I would like to have two 2TB partitions. As much traffic as there is on this I would appreciate some clarification on the procedure given.

    The implication is that rather than

    “mkpart primary 0.00TB 3.00TB”

    I can invoke

    mkpart primary 0.00TB 2.00TB and mkpart secondary 2.00TB 4.00TB

    Is it that simple?

    Thank you.

  43. Why don’t they just add this functionality to fdisk so that it can can create partitions larger than 2TB instead that use another tool to get this done.

  44. I’m having a problem creating partitions in CentOS 7 on my raid array
    Model: HP LOGICAL VOLUME (scsi)
    Disk /dev/sdb: 8002GB
    Sector size (logical/physical): 512B/4096B
    Partition Table: gpt

    the command “mkpart primary 0 -0” or mkpart primary 1 -1 throws a warning:
    Warning: You requested a partition from 0.00B to 8002GB (sectors 0..15627941551).
    The closest location we can manage is 17.4kB to 1048kB (sectors 34..2047).
    Any idea why I can’t create partitions?

  45. needded to run dd if=/dev/zero of=/dev/sdb bs=512 count=1 conv=notrunc. After that I could create the partition using your instructions.

Leave a Comment