Adding Additional Disk Drives to CentOS 5/6

Adding a new drive to CentOS or RedHat systems.

Making use of a second drive for extra space? Here's a quick run-down:

1) Make sure you know which disk is being formatted. First, second, and third drives will be /dev/sda, /dev/sdb, and /dev/sdc respectively. Check this with fdisk -l

[03:50:04] [root@virt ~]# fdisk -l

Disk /dev/sda: 34.3 GB, 34359738368 bytes
255 heads, 63 sectors/track, 4177 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14        4177    33447330   8e  Linux LVM

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

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

2) You can see that /dev/sdb (our second hard drive) does not have any partitions. We will need to create a partition(s) on the drive and then make a file system on it, then mount it. Let's write partitions to the drive using fdisk /dev/sdb:

[03:53:01] [root@virt ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help):

3) As you can see from the help menu (by using the command "m") we want to add a new partition. Using the defaults will use the entire disk. After it's created, you will want to use the command "w" to "write table to disk and exit".

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
Partition number (1-4): 1
First cylinder (1-1044, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044): 
Using default value 1044

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[03:54:58] [root@virt ~]# 

4) Now you will notice that the output of fdisk -l /dev/sdb shows a partition as /dev/sdb1:

[03:57:08] [root@virt ~]# fdisk -l /dev/sdb

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1044     8385898+  83  Linux

5) Now we need to create a file system on it. I've always used ext3 for general use/purposes. You'll want to use the command mkfs -t ext3 /dev/sdb1 as shown here:

[03:58:38] [root@virt ~]# mkfs -t ext3 /dev/sdb1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1048576 inodes, 2096474 blocks
104823 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

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

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

6) Great, now we have a single partitioned secondary drive using ext3 file system. Now you want to create a directory to mount it in; lets just use "/drive2". You'll need to use the command mount -t [filesystem] [source] [mount directory] to mount it.

[03:59:50] [root@virt ~]# mount -t ext3 /dev/sdb1 /drive2/

7) Now you'll notice, via df, that the drive is mounted:

[03:59:57] [root@virt ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
                       28G  1.4G   25G   6% /
/dev/sda1              99M   19M   76M  20% /boot
tmpfs                1014M     0 1014M   0% /dev/shm
/dev/sdb1             7.9G  147M  7.4G   2% /drive2

8) Last step - you want to make sure the drive automatically mounts itself when the server boots/reboots. You'll need to add the following line to your /etc/fstab file:

/dev/sdb1  /drive2  ext3  defaults 0 0


All done!

You may also like...

14 Responses

  1. Damas says:

    Great, Thank you very much David,


  2. paul says:

    very well explained and super useful, many thanks!!

  3. William says:

    Thank you David,

    This was a huge task for me in the past, and I always missed the last step :) Missing the drive on reboot.

    This was very helpful and book marked!

  4. Cesar Amezcua says:

    at the moment of type fdisk -l
    I got this warning
    WARNING: GPT (GUID Partition Table) detected on '/dev/sdb'! The util fdisk doesn't support GPT. Use GNU Parted.

    • David says:

      HI Cesar,

      You will see this if your hard drive is larger than 2TB or already has partitions. If it's a brand new hard drive and you're creating a partition 2TB in size or less, then you will be fine and you can ignore the message.

      If you're trying to create a partition larger than 2TB, you will need to use gparted/parted.

  5. chetankumar says:

    All 7 steps work fine for me but on the 8th step getting this type of message
    -bash: /dev/xvd5: Permission denied

    • David says:

      Sounds like what ever you are running isn't being run as root user.

      Step 8 is about editing a file so I am not sure why you would be getting a permission denied for a bash command?

      • chetankumar says:

        ya i am being as root user
        any alternative way for step-8
        our server reboot automatically at 12 noon everyday...

  6. chetankumar says:

    Thank you
    I have solved the problem with this link and with the help of my colleages.

  7. Dude I share this at least once a week to customers. Awesome How-To!

  8. Vik says:

    A really nice guide for even a novoice keep up the good work :)

  9. Rafael says:

    Very good tutorial! I did this on a CentOS 7 guest on VMware ESXI server. I also found a VMWare kb that said to reboot the host but found this note about not having to reboot the host helpful as it does a scsi detection:

    Followed your guide with the no reboot option form the other noted site and now have a new sdb1 mounted partition to use for backup on my CPanel server!

    Thanks for the clear and easy tutorial.

  10. Ben says:

    is there a way to add a second drive to be mounted on / ?

    in other words, my / (the root partition) is very small. and i have added a new drive like you explained but its mounted at /disk2
    however when i try to do anything in centos 7, it tells me i am lacking space. that is because nothing is being written to /disk2 instead its being written to / and that has no more space!

    how can i accomplish this?

    thank you

    • David says:

      It depends. Is it on an LVM? Is this being hosted Physically at a datacenter location or is this in the cloud?

      If you're on an LVM, you may be able to shrink or alter the size of another partition (maybe /home?) to give that space to your root partition (/). If you're not on LVM, you may want to use a liveCD like gparted-live ( to adjust partitions and sizes.

      As an alternative, you could always copy, for example, everything under /var/log or /home to the new drive and then have that new drive (with the contents) be mounted at /var/log or /home -- whichever you choose.

Leave a Reply

Your email address will not be published. Required fields are marked *