I’m running an Ubuntu workstation and when setting it up simply went the “next-next-next” route when setting up the encrypted disk via LVM. The default is to create a 1G swap partition which is just not enough when you attempt to run too many things and locks up and/or crashes the machine.
My goal was to reduce my /root
partition and then use that space to extend my swap
partition.
Ensure that you back up your data first! There is no guarantee when executing the following operations, even correctly, that you will not lose your data.
Decreasing the size of an LVM partition
Because I need to modify the /root
partition I first needed to boot to a live image or rescue image. I happened to have a Debian 12 iso on a flash drive and after sorting out how to get my laptop to boot from it chose the rescue option when booting.
One of the unexpected options during boot to the rescue image was to decrypt the filesystem so I simply entered the passphase to decrypt it. If you are using a rescue image that does not include that feature checkout this post for details on how to decrypt it.
An overview of the steps is as follows
- Run a filesystem check on your filesystem
- Resize the filesystem contained in the logical volume
- Resize the logical volume
Run a filesystem check
Since you have booted from a rescue disk you first need to activate the volume group to work with it
vgchange -ay
Enter the following to the details for the volume group
root@marge:~# vgdisplay
--- Volume group ---
VG Name marge-vg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size <465.27 GiB
PE Size 4.00 MiB
Total PE 119108
Alloc PE / Size 119108 / <465.27 GiB
Free PE / Size 0 / 0
VG UUID m06QqY-lQ3N-Y0be-j7nw-V1jo-hHwK-1OrE6U
Then use lvdisplay
to see the details of all of the logical volumes contained within that group
root@marge:~# lvdisplay
--- Logical volume ---
LV Path /dev/marge-vg/root
LV Name root
VG Name marge-vg
LV UUID 820Zm6-zOcV-9gMu-efCr-jnVv-nmzX-T04zFq
LV Write Access read/write
LV Creation host, time marge, 2022-12-15 14:58:30 -0500
LV Status available
# open 1
LV Size <464.31 GiB
Current LE 118863
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
--- Logical volume ---
LV Path /dev/marge-vg/swap_1
LV Name swap_1
VG Name marge-vg
LV UUID MHyNcx-ASX7-bsDd-Wto3-k9u8-QjZA-Z85yIR
LV Write Access read/write
LV Creation host, time marge, 2022-12-15 14:58:30 -0500
LV Status available
# open 2
LV Size 980.00 MiB
Current LE 245
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2
Run the filesystem check as you cannot resize a filesystem that in a bad state. The LV Path
is the path to the underlying file system.
e2fsck -fy /dev/marge-vg/root
Shrink the filesystem
Just to be safe, we will shrink the filesystem to be smaller than the target logical volume size. If we accidentally shrink the logical volume to be smaller than the filesystem that it contains this can result in corruption of your data. Once the operation is complete, we can reclaim that “lost” space. The last argument in the command specifies the desired target size of the filesystem.
resize2fs /dev/marge-vg/root 430G
Shrink the logical volume
Once the filesystem is shrunk we can now shrink the logical volume. Again, we will specify a specific target size for the logical volume of 434G
. You will get a warning that the operation could result in data loss. If we have performed the previous steps successfully we are (relatively) safe to proceed.
lvreduce -L 434G /dev/marge-vg/root
lvdisplay
should now show the smaller logical volume
root@marge:~# lvdisplay
--- Logical volume ---
LV Path /dev/marge-vg/root
LV Name root
VG Name marge-vg
LV UUID 820Zm6-zOcV-9gMu-efCr-jnVv-nmzX-T04zFq
LV Write Access read/write
LV Creation host, time marge, 2022-12-15 14:58:30 -0500
LV Status available
# open 1
LV Size <434.00 GiB <-- New LV Size
Current LE 118863
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
Now that the logical volume has been reduced we can reclaim the additional space (the difference between the reduced filesystem size and the new logical volume size) by extending the filesystem to use all available space in the logical volume.
resize2fs /dev/marge-vg/root
Extend the other logical volume
Verify the amount of free space now available in the volume group
root@marge:~# vgdisplay
--- Volume group ---
VG Name marge-vg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size <465.27 GiB
PE Size 4.00 MiB
Total PE 119108
Alloc PE / Size 111427 / <435.27 GiB
Free PE / Size 7618 / 30.00 GiB <-- Free space
VG UUID m06QqY-lQ3N-Y0be-j7nw-V1jo-hHwK-1OrE6U
Run the following command to extend the logical volume. In this case, we will extend the swap volume by 30 G
lvextend -L +30G /dev/marge-vg/swap_1
Resize the filesystem for the extended logical volume
We have only resized the logical volume. The filesystem contained therein has not yet been resized to use the additional space
Because we are resizing a swap partition we need to do things a little differently. Run the following to recreate the swap partition in this logical volume
mkswap /dev/marge-vg/swap_1
For a “normal” partition you would run the following to extend the filesystem to the size of the logical volume.
resize2fs /dev/<vol-group>/<lv>
From here you should be able to reboot your system with your new LVM configuration.