How to manage logical volumes

The Ubuntu Server installer has the ability to set up and install to LVM partitions, and this is the supported way of doing so. If you would like to know more about any of the topics in this page, refer to our explanation of logical volume management (LVM).

Create the physical volume

First, you need a physical volume. Typically you start with a hard disk, and create a regular partition whose type is “LVM” on it. You can create it with gparted or fdisk, and usually only want one LVM-type partition in the whole disk, since LVM will handle subdividing it into logical volumes. In gparted, you need to check the lvm flag when creating the partition, and with fdisk, tag the type with code 8e.

Once you have your LVM partition, you need to initialise it as a physical volume. Assuming this partition is /dev/sda1:

sudo pvcreate /dev/sda1

Create the volume group

After that, you can create a volume group; in our example, it will be named foo and uses only one physical volume:

sudo vgcreate foo /dev/sda1

Create a logical volume

Now you want to create a logical volume from some of the free space in foo:

sudo lvcreate --name bar --size 5g foo

This creates a logical volume named bar in volume group foo using 5 GB of space. You can find the block device for this logical volume in /dev/foo/bar or dev/mapper/foo-bar.

You might also want to try the lvs and pvs commands, which list the logical volumes and physical volumes respectively, and their more detailed variants; lvdisplay and pvdisplay.

Resize a partition

You can extend a logical volume with:

sudo lvextend --resizefs --size +5g foo/bar

This will add 5 GB to the bar logical volume in the foo volume group, and will automatically resize the underlying filesystem (if supported). The space is allocated from free space anywhere in the bar volume group. You can specify an absolute size instead of a relative size if you want by omitting the leading +.

If you have multiple physical volumes you can add the names of one (or more) of them to the end of the command to limit which ones are used to fulfil the request.

Move a partition

If you only have one physical volume then you are unlikely to ever need to move, but if you add a new disk, you might want to. To move the logical volume bar off of physical volume /dev/sda1, you can run:

sudo pvmove --name bar /dev/sda1

If you omit the --name bar argument, then all logical volumes on the /dev/sda1 physical volume will be moved. If you only have one other physical volume then that is where it will be moved to. Otherwise you can add the name of one or more specific physical volumes that should be used to satisfy the request, instead of any physical volume in the volume group with free space.

This process can be resumed safely if interrupted by a crash or power failure, and can be done while the logical volume(s) in question are in use. You can also add --background to perform the move in the background and return immediately, or --interval s to have it print how much progress it has made every s seconds. If you background the move, you can check its progress with the lvs command.

Create a snapshot

When you create a snapshot, you create a new logical volume to act as a clone of the original logical volume.

The snapshot volume does not initially use any space, but as changes are made to the original volume, the changed blocks are copied to the snapshot volume before they are changed in order to preserve them. This means that the more changes you make to the origin, the more space the snapshot needs. If the snapshot volume uses all of the space allocated to it, then the snapshot is broken and can not be used any more, leaving you with only the modified origin.

The lvs command will tell you how much space has been used in a snapshot logical volume. If it starts to get full, you might want to extend it with the lvextend command. To create a snapshot of the bar logical volume and name it lv_snapshot, run:

sudo lvcreate --snapshot --name lv_snapshot --size 5g foo/bar

This will create a snapshot named lv_snapshot of the original logical volume bar and allocate 5 GB of space for it. Since the snapshot volume only stores the areas of the disk that have changed since it was created, it can be much smaller than the original volume.

While you have the snapshot, you can mount it if you wish to see the original filesystem as it appeared when you made the snapshot. In the above example you would mount the /dev/foo/lv_snapshot device. You can modify the snapshot without affecting the original, and the original without affecting the snapshot. For example, if you take a snapshot of your root logical volume, make changes to your system, and then decide you would like to revert the system back to its previous state, you can merge the snapshot back into the original volume, which effectively reverts it to the state it was in when you made the snapshot. To do this, you can run:

sudo lvconvert --merge foo/lv_snapshot

If the origin volume of foo/lv_snapshot is in use, it will inform you that the merge will take place the next time the volumes are activated. If this is the root volume, then you will need to reboot for this to happen. At the next boot, the volume will be activated and the merge will begin in the background, so your system will boot up as if you had never made the changes since the snapshot was created, and the actual data movement will take place in the background while you work.