In this brief post we will take a look at how to expand a Logical Volume (LVM) that your Ubuntu Server operating system is installed in. This worked for me on Ubuntu Server 20.04. When you install Ubuntu Server it creates an LVM and is designed to use up the least amount of space required so as to minimize the amount of space taken up by the volume. This way you have more control over this in the future and can expand it if you would like per your own requirements (rather than assuming you want to use up all the available space from the start). Unfortunately this behavior is not made very clear when you install Ubuntu. This post on askUbuntu.com discusses this confusion and is also a helpful guide in how to expand the LVM after Ubuntu has been installed.

Tutorial

The first thing that you will likely want to do is get a list of the drives available on your system to see what is mounted at root “/”. In order to do this you can execute the following on the command line:

df -h

This will display something that looks as follows, notice that /dev/mapper/ubuntu–vg-ubuntu-lv is mounted at root “/”. My server is setup with a total capacity of 6TB but we can see here that only 175GB has been allocated to the Ubuntu Server LVM so we will want to expand this to take advantage of the full capacity:

Filesystem                         Size  Used Avail Use% Mounted on
udev                               126G     0  126G   0% /dev
tmpfs                               26G  2.6M   26G   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  196G   12G  175G   7% /
tmpfs                              126G     0  126G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              126G     0  126G   0% /sys/fs/cgroup
/dev/sda2                          976M  203M  707M  23% /boot
/dev/loop0                          56M   56M     0 100% /snap/core18/2128
/dev/loop1                          62M   62M     0 100% /snap/core20/1081
/dev/loop3                          68M   68M     0 100% /snap/lxd/21545
/dev/loop2                          72M   72M     0 100% /snap/lxd/16099
/dev/loop4                          33M   33M     0 100% /snap/snapd/13170
/dev/loop6                          30M   30M     0 100% /snap/snapd/8542
/dev/loop5                          55M   55M     0 100% /snap/core18/1880
//192.168.1.3/ris-data              14T   22G   14T   1% /mnt/ris-data
tmpfs                               26G     0   26G   0% /run/user/1000

Next you may want to check and see what additional space is actually available in the volume group for your current mapped drive. You can do this by executing the following on the command line:

sudo vgdisplay -A

You should see something with the following result, notice that the Alloc PE/Size is listed as 200TGiB and that the Free PE/Size is listed as 6.35TiB, this means there is roughly 6.35TB of available space that is not allocated to the LVM that your Ubuntu install is currently on and we want to expand it:

  --- Volume group ---
  VG Name               ubuntu-vg
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <6.55 TiB
  PE Size               4.00 MiB
  Total PE              1716223
  Alloc PE / Size       51200 / 200.00 GiB
  Free  PE / Size       1665023 / 6.35 TiB
  VG UUID               XDRpII-cxO9-jqAV-83eC-Ukea-aV4y-OHXWW1

In order to change the size utilized by your Ubuntu Server install you’ll need to use a tool called Logical Volume Manager (LVM). In order to start this tool enter the following in the command line, this should open the lvm tool and you should see an lvm> prompt waiting for you to type:

sudo lvm

When the LVM prompt enter the following command to extend your LVM to utilize the full amount of space available on your drive. The command as displayed in the following code block should work on most Ubuntu Server base installs as it is the default unless you have configured your installation differently the the defaults available. For further details on the lvextend command please refer to the man page.

 lvm> lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv

When this is complete you should have output similar to to following:

> Size of logical volume ubuntu-vg/ubuntu-lv changed from 200.00 GiB (51200 extents) to <6.55 TiB (1716223 extents).
> ?Logical volume ubuntu-vg/ubuntu-lv successfully resized.

Type exit to quite the LVM tool:

lvm> exit

You’re not quite finished yet, lvextend increases the size of the Logical Volume to 100% but the file system still needs to be updated to utilizes the newly available capacity. You do this using resize2fs with the following command, for further details on how the resize2fs command works please refer to the man page:

sudo resize2fs /dev/ubuntu-vg/ubuntu-lv

The following is an example of what the output looks like when this completes successfully, note on my system this took a few minutes to complete:

> resize2fs 1.45.5 (07-Jan-2020)
> Filesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required
> old_desc_blocks = 25, new_desc_blocks = 838
> The filesystem on /dev/ubuntu-vg/ubuntu-lv is now 1757412352 (4k) blocks long.

Once this has completed you can re-run the df -h command to confirm that the full capacity is now being used by your LVM. The output should look similar to the following with the LVM which is mounted on root indicating the newly available capacity as the full drive capacity, in my case 6.2 TB.

Filesystem                         Size  Used Avail Use% Mounted on
udev                               126G     0  126G   0% /dev
tmpfs                               26G  2.6M   26G   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  6.5T   12G  6.2T   1% /
tmpfs                              126G     0  126G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              126G     0  126G   0% /sys/fs/cgroup
/dev/sda2                          976M  203M  707M  23% /boot
/dev/loop0                          56M   56M     0 100% /snap/core18/2128
/dev/loop1                          62M   62M     0 100% /snap/core20/1081
/dev/loop3                          68M   68M     0 100% /snap/lxd/21545
/dev/loop2                          72M   72M     0 100% /snap/lxd/16099
/dev/loop4                          33M   33M     0 100% /snap/snapd/13170
/dev/loop6                          30M   30M     0 100% /snap/snapd/8542
/dev/loop5                          55M   55M     0 100% /snap/core18/1880
//192.168.1.3/ris-data              14T   22G   14T   1% /mnt/ris-data
tmpfs                               26G     0   26G   0% /run/user/1000

Conclusion

This might seem daunting at first but it is actually really easy to do. What’s more, you can perform this whole task while the drive is in use which is amazing. I hope that this has been helpful and if you have any thoughts to add feel free to commend below