Adding a new hard drive to a Linux instance involves the following steps
- Add physical / virtual drive to the instance
- Scan for and identify new drive
- Prepare new drive for use
Adding the new drive is outside of the scope of this article, as it can be done in many different ways depending on the instance – either a new physical disk needs to be added, or a virtual drive created using your virtual machine hypervisor GUI or Cloud console added to the virtual machine.
Scanning for the new drive
After the new drive has been added to the instance, it needs to be presented to the operating system for configuration. There are two ways of doing this, by either reboot
ing the instance or by scanning all of the drive busses for new devices.
# ls -1 /sys/class/scsi_host/*/scan
/sys/class/scsi_host/host0/scan
/sys/class/scsi_host/host1/scan
/sys/class/scsi_host/host2/scan
/sys/class/scsi_host/host3/scan
# for i in `ls /sys/class/scsi_host/*/scan`; do echo "- - -" > ${i}; done
Once the new drive has been recognised by the operating system, it should be visible to the lsblk
statement – in this example it is sdb
which we can see has no partitions defined. It’s best to have an example of the following output before adding the drive for comparison.
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 88.5M 1 loop /snap/core/7270
loop1 7:1 0 89.1M 1 loop /snap/core/8268
sda 8:0 0 10G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 9G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 4G 0 lvm /
sdb 8:16 0 10G 0 disk
sr0 11:0 1 1024M 0 rom
Preparing the new drive for use
Now that the new drive has been presented to the operating system and is accessible, we need to make the drive available for use. I find that the best and most flexible way to use this new drive is to allocate all of the drive to the logical volume manager LVM
– do this by first creating the new physical volume
# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
Once the physical volume has been recognised by the operating system, we can either create a new volume group as shown below, or add this new physical volume to an existing volume group.
# vgcreate data-vg /dev/sdb
Volume group "data-vg" successfully created
The next step is to create a new logical volume or extend an existing logical volume. You can only extend a logical volume if you have extended the volume group it belongs to.
# lvcreate -l 100%FREE -n data data-vg
Logical volume "data" created.
Which will create a new logical volume called data
inside the data-vg
volume group. The details for this new logical volume can be displayed with the lvdisplay
command
# lvdisplay /dev/data-vg/data
--- Logical volume ---
LV Path /dev/data-vg/data
LV Name data
VG Name data-vg
LV UUID Fv1q0Y-F1Bt-HLBY-sKWk-svvJ-W9WE-eMasO5
LV Write Access read/write
LV Creation host, time abd-template, 2019-12-27 16:39:00 +0000
LV Status available
# open 0
LV Size <10.00 GiB
Current LE 2559
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
The new logical volume can be formatted with a filesystem, and for most general applications the ext4
filesystem is well suited
# mkfs.ext4 /dev/data-vg/data
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 2620416 4k blocks and 655360 inodes
Filesystem UUID: 018b2220-6e10-4f46-9f06-233b68acf4f3
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
Then mount the new volume to the filesystem – by adding an entry to the /etc/fstab
file, we can ensure this volume is automatically mounted after a reboot
# mkdir /data
# echo "/dev/data-vg/data /data ext4 defaults 0 0" >> /etc/fstab
# mount /data
# df /data
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/data--vg-data 10251540 36888 9674188 1% /data
The new drive is now available to the operating system under the /data
path.
In summary, the commands required are as follows, assuming you are adding the drive sdb
and creating the logical volume /dev/data-vg/data
for i in `ls /sys/class/scsi_host/*/scan`; do echo "- - -" > ${i}; done
pvcreate /dev/sdb
vgcreate data-vg /dev/sdb
lvcreate -l 100%FREE -n data data-vg
mkfs.ext4 /dev/data-vg/data
mkdir /data
echo "/dev/data-vg/data /data ext4 defaults 0 0" >> /etc/fstab
mount /data