How to install a new drive in Linux larger than 2TB with proper alignment

Let's assume that we already have a primary physical drive in our system (HDD or SDD), and have added a second drive to our box, which we need to partition and mount automatically on boot.

Here's how to that:

Let's see what physical drives we have installed in our server:

ls /dev/sd*

Since this is our 2nd drive, you should see /dev/sdb.

Example:

/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sdb

Let see the currently mounted drives and partition layout:

lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL

Here's a full list of all available lsblk options:

       NAME  device name
      KNAME  internal kernel device name
    MAJ:MIN  major:minor device number
     FSTYPE  filesystem type
 MOUNTPOINT  where the device is mounted
      LABEL  filesystem LABEL
       UUID  filesystem UUID
         RO  read-only device
         RM  removable device
      MODEL  device identifier
       SIZE  size of the device
      STATE  state of the device
      OWNER  user name
      GROUP  group name
       MODE  device node permissions
  ALIGNMENT  alignment offset
     MIN-IO  minimum I/O size
     OPT-IO  optimal I/O size
    PHY-SEC  physical sector size
    LOG-SEC  logical sector size
       ROTA  rotational device
      SCHED  I/O scheduler name
    RQ-SIZE  request queue size
       TYPE  device type
   DISC-ALN  discard alignment offset
  DISC-GRAN  discard granularity
   DISC-MAX  discard max bytes
  DISC-ZERO  discard zeroes data

(optional) If your initial attempt failed, and you want to start from scratch

We can do the following; otherwise skip this step:

In case the new drive is mounted, let's unmount it:

umount /NAMEOFPARTITION

Note: the above command is spelled "umount" and NOT "unmount". This gets a lot of people.

Let's delete all partitions on the new drive:

fdisk /dev/sdb

Once in fdisk type the following:

d
# this deletes the partition
w
# this saves the new partition structure and exist

How to partition a drive if it's LARGER than 2TB

If this drive is larger than 2TB, then we need to use parted and not fdisk--fdisk has a 2TB partition limit:

parted /dev/sdb

Now do following in parted, (confirming everything):

 	mklabel gpt
 	unit TB
 	mkpart primary 0 100%
    
    # Or to align properly see here:
    # http://h10025.www1.hp.com/ewfrf/wc/document?docname=c03479326&cc=us&dlc=en&lc=en
    # Example this is what I used for my 3TB HDD
    # mkpart primary 4096s 100% 
    
    # Let's check to see if it is created:
    list
    # If everything looks good:
    quit

Now, go to the next step to create the new filesystem.

How to partition a drive if it's SMALLER than 2TB

Let's partition the new drive (/dev/sdb).

fdisk /dev/sdb

Now enter the following in fdisk, (confirming everything):

# Turn off DOS compatible mode switch units to sectors
c u # View the current partition (there should be none) p # Create the new partition n 1 # Now save/write the parition to disk and exit w

And that should create the new < 2TB partition all properly aligned, and ready to be formatted.

Let's create the new filesystem and format it.

(you can replace "private" with whatever you want):

mkfs.ext4 -L /private /dev/sdb1

Let's create the directory/location (mount point) where we'll mount the new drive partition to:

mkdir /private

Now we mount it to test to see if there are no error:

mount /dev/sdb1 /private

Check that everything is cool using lsblk--plus we can now get the UUID of the new drive, which we'll need for our fstab:

lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,UUID

You should see your new drive listed (here is my 3TB, sdb1) along with it's UUID:

NAME   FSTYPE   SIZE MOUNTPOINT LABEL    UUID
sdb             2.7T                     
└─sdb1 ext4     2.7T /private   /private d5d7f5c6-70b7-42ea-b6f6-bd1372632eb9
sda           476.4G                     
├─sda1 ext4       1G /boot               59a3441c-a7f7-4ab4-aad6-5e06fadbd244
├─sda2 ext4   473.4G /                   562f20cb-e210-4e71-b50b-b6c5c2de39dc
└─sda3 swap       2G [SWAP]              e3b2e9d2-d074-4036-8e42-152753037ecd

Mount your new drive automatically on boot

Finally, we add our new partion to /etc/fstab so it mounts automatically on every reboot.

Let's double check our new drive's UUID

blkid

This will show a listing of UUIDs, select the /dev/sdb1

/dev/sdb1: LABEL="/private" UUID="d5d7f5c6-70b7-42ea-b6f6-bd1372632eb9" TYPE="ext4"

So using the above, we can now add this to our /etc/fstab:

vi /etc/fstab

Enter the following:

UUID=d5d7f5c6-70b7-42ea-b6f6-bd1372632eb9 /private      ext4    defaults        1 2

This is what it looks like in my fstab:

#
# /etc/fstab
#
UUID=562f20cb-e210-4e71-b50b-b6c5c2de39dc /            ext4    noatime,nodiratime,discard,usrquota,grpquota,errors=remount-ro   1 1
UUID=59a3441c-a7f7-4ab4-aad6-5e06fadbd244 /boot        ext4    defaults        1 2
# LABEL=/private                            /private     ext4    defaults        1 2
UUID=d5d7f5c6-70b7-42ea-b6f6-bd1372632eb9 /private     ext4    defaults        1 2
UUID=e3b2e9d2-d074-4036-8e42-152753037ecd swap         swap    defaults        0 0
tmpfs                                     /tmp         tmpfs   noexec,nosuid,noatime,rw,mode=1777 0 0
# NOTICE: If you uncomment the below line, user crontabs will be deleted on each reboot.
# tmpfs                                     /var/spool   tmpfs   defaults,noatime,mode=1777 0 0
tmpfs                                     /var/tmp     tmpfs   noexec,nosuid,noatime,rw,mode=1777 0 0
tmpfs                                     /dev/shm     tmpfs   defaults        0 0
devpts                                    /dev/pts     devpts  gid=5,mode=620  0 0
sysfs                                     /sys         sysfs   defaults        0 0
proc                                      /proc        proc    defaults        0 0

And that should do it...

Tags: Linux HDD ssd admin fdisk parted performance