HOWTO: Resize a Linux VM's LLVM Virtual Disk on a ZVOL | TrueNAS Community
If you have a Linux VM, which uses the LLVM filesystem, you can easily increase the disk space available to the VM.
Linux Logical Volume Manager allows you to have logical volumes (LV) on top of logical volume groups (VG) on top of physical volumes (PV) (ie partitions).
This is conceptually similar to zvols on pools on vdevs in zfs.
This was tested with TrueNAS-CORE 12 and Ubuntu 20.04.
Firstly, there are some useful commands:
pvs
- list physical volumes
lvs
- list logical volumes
lvdisplay
- logical volume display
pvdisplay
- physical volume display
df
- disk free space
So, to start
df -h
- show disk free space, human readable
and you should see something like this
Code:
Filesystem Size Used Avail Use% Mounted on
dev 2.9G 0 2.9G 0% /dev
tmpfs 595M 61M 535M 11% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 8.4G 8.1G 0 100% /
tmpfs 3.0G 0 3.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
This is the interesting line:
Code:
/dev/mapper/ubuntu--vg-ubuntu--lv 8.4G 8.1G 0 100% /
it gives you the hint of which LV and VG the root drive is using.
you can list the logical volumes lvs
Code:
root@ubuntu:/# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
ubuntu-lv ubuntu-vg -wi-ao---- <8.50g
and physical volumes pvs
Code:
root@ubuntu:/# pvs
PV VG Fmt Attr PSize PFree
/dev/vda3 ubuntu-vg lvm2 a-- <8.50g 0
Now you can see that the ubuntu-lv LV is on the ubuntu-vg VG is on the PV /dev/vda3
(that's partition 3 of device vda)
Shutdown the VM. Edit the ZVOL to change the size. Restart the VM.
Once you get back, run parted with the device id, repair the GPT information and resize the partition, as per below.
launch parted on the disk parted /dev/vda
Code:
root@ubuntu:~# parted /dev/vda
GNU Parted 3.3
Using /dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.
view the partitions
print
Code:
(parted) print
Warning: Not all of the space available to /dev/vda appears to be used, you can fix the GPT to use all of the space (an extra 188743680
blocks) or continue with the current setting?
Parted will offer to fix the GPT. Fix it. f
Code:
Fix/Ignore? f
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 107GB
Sector size (logical/physical): 512B/16384B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 538MB 537MB fat32 boot, esp
2 538MB 1612MB 1074MB ext4
3 1612MB 10.7GB 9125MB
The disk is resized, but the partition is not.
Resize partition 3 to 100%, resizepart 3 100%
Code:
(parted) resizepart 3 100%
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 107GB
Sector size (logical/physical): 512B/16384B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 538MB 537MB fat32 boot, esp
2 538MB 1612MB 1074MB ext4
3 1612MB 107GB 106GB
(parted)
And the partition is resized. You can exit parted with quit
now we need to resize the physical volume
pvresize /dev/vda3
Code:
root@ubuntu:~# pvresize /dev/vda3
Physical volume "/dev/vda3" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
You can check the result with pvdisplay
Code:
root@ubuntu:~# pvdisplay
***
Physical volume
***
PV Name /dev/vda3
VG Name ubuntu-vg
PV Size <98.50 GiB / not usable 1.98 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 25215
Free PE 23040
Allocated PE 2175
PV UUID IGdmTf-7Iql-V9UK-q3aD-BdNP-VfBo-VPx1Hs
Then you can use lvextend to resize the LV and resize the the filesystem, over the resized pv.
lvextend --resizefs ubuntu-vg/ubuntu-lv /dev/vda3
Code:
root@ubuntu:~# lvextend --resizefs ubuntu-vg/ubuntu-lv /dev/vda3
Size of logical volume ubuntu-vg/ubuntu-lv changed from <8.50 GiB (2175 extents) to <98.50 GiB (25215 extents).
Logical volume ubuntu-vg/ubuntu-lv successfully resized.
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 13
The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 25820160 (4k) blocks long.
root@ubuntu:~#
and finally... you can check the freespace again.
df -h
Code:
root@ubuntu:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 2.9G 0 2.9G 0% /dev
tmpfs 595M 1.1M 594M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 97G 8.2G 85G 9% /
85G free instead of 0 much better.