LVM Basic Operations
In the following sections is provided information about the most used LVM related operations and basic concepts. There are much more capabilities of the Logical Volume Manager – you can get familiar with them by reading the main source of this article Red Hat Docs > [9] > Configuring and managing logical volumes .
Overview of Logical Volume Management (LVM)
Logical volume management (LVM) creates a layer of abstraction over physical storage, which helps you to create logical storage volumes. This provides much greater flexibility in a number of ways than using physical storage directly.
In addition, the hardware storage configuration is hidden from the software so it can be resized and moved without stopping applications or unmounting file systems. This can reduce operational costs.
The following are the components of LVM – they are illustrated on the diagram shown at Figure 1:
- Physical volume: A physical volume (PV) is a partition or whole disk designated for LVM use. For more information, see Managing LVM physical volumes.
- Volume group: A volume group (VG) is a collection of physical volumes (PVs), which creates a pool of disk space out of which logical volumes can be allocated. For more information, see Managing LVM volume groups.
- Logical volume: A logical volume represents a mountable storage device. For more information, see Managing LVM logical volumes.
Requirements: the package lvm2
must be installed.
apt install lvm2
Physical Volumes (PV)
The physical volume (PV) is a partition or whole disk designated for LVM use. To use the device for an LVM logical volume, the device must be initialized as a physical volume.
If you are using a whole disk device for your physical volume, the disk must have no partition table. For DOS disk partitions, the partition id should be set to 0x8e using the fdisk
or cfdisk
command or an equivalent. If you are using a whole disk device for your physical volume, the disk must have no partition table. Any existing partition table must be erased, which will effectively destroy all data on that disk. You can remove an existing partition table using the wipefs ‑a <PhysicalVolume>`
command as root.
Display PV
pvdisplay
– Display various attributes of physical volume(s). pvdisplay
shows the attributes of PVs, like size, physical extent size, space used for the VG descriptor area, etc.
pvdisplay
--- Physical volume ---
PV Name /dev/nvme0n1p3
VG Name vg_name
PV Size <930.54 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 238216
Free PE 155272
Allocated PE 82944
PV UUID BKK3Cm-CAzY-rNah-o3Ox-L7FY-aNIY-ysUSIL
pvs
– Display information about physical volumes. pvs
is a preferred alternative of pvdisplay
that shows the same information and more, using a more compact and configurable output format.
pvs
PV VG Fmt Attr PSize PFree
/dev/nvme0n1p3 vg_name lvm2 a-- 930.53g 626.53g
The command lsblk
also outputs useful information about PV-VG-LV relations.
lsblk -M
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 931.5G 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /boot/efi
├─nvme0n1p2 259:2 0 488M 0 part /boot
└─nvme0n1p3 259:3 0 930.5G 0 part
┌─> ├─vg-lv_1-real 254:0 0 60G 0 lvm
│ │ └─vg-lv_1 254:1 0 60G 0 lvm /
┌─>│ ├─vg-lv_2-real 254:2 0 60G 0 lvm
│ │ │ └─vg-lv_2 254:7 0 60G 0 lvm /home
└┬>│ ├─vg-lv_2_ss_at_date_220912-cow 254:3 0 60G 0 lvm
│ └┬> ├─vg-lv_1_ss_at_date_220908-cow 254:4 0 60G 0 lvm
│ │ └─vg-swap_1 254:6 0 4G 0 lvm [SWAP]
│ └──vg-lv_1_ss_at_date_220908 254:5 0 60G 0 lvm
└─────vg-lv_2_ss_at_date_220912 254:9 0 60G 0 lvm
pvscan
– List all physical volumes. The pvscan
command scans all supported LVM block devices in the system for physical volumes. You can define a filter in the lvm.conf
file so that this command avoids scanning specific physical volumes.
pvscan
PV /dev/nvme0n1p3 VG vg_name lvm2 [930.53 GiB / 566.53 GiB free]
Total: 1 [930.53 GiB] / in use: 1 [930.53 GiB] / in no VG: 0 [0 ]
Create PV
The physical volume could be created on the entire drive or on a partition. It is preferable to partition the disk – create a single partition that covers the whole disk to label as an LVM physical volume, – otherwise some tools like CloneZilla wont handle the drive correctly when LVM is installed directly on the drive (without partitioning), etc.. How to partition the disk from the CLI is described in the article Linux Basic Partitioning.
Create Physicals volume by the partition /dev/nvme0n1p3
.
pvcreate /dev/nvme0n1p3
Physical volume "/dev/nvme0n1p3" successfully created.
Another example: Create Physicals volume by the partition /dev/vda1
and /dev/vdb1
.
pvcreate /dev/vda1 /dev/vdb1
Physical volume "/dev/vda1" successfully created.
Physical volume "/dev/vdb1" successfully created.
Remove PV
If a device is no longer required for use by LVM, you can remove the LVM label by using the pvremove
command. Executing the pvremove
command zeroes the LVM metadata on an empty physical volume.
pvremove /dev/nvme0n2p1
Labels on physical volume "/dev/nvme0n2p1" successfully wiped.
Then use pvs
and verify if the required volume is removed. If the physical volume you want to remove is currently part of a volume group, you must remove it from the volume group with the vgreduce
command. For more information, see Removing physical volumes from a volume group.
Volume Groups (VG)
A volume group (VG) is a collection of physical volumes (PVs), which creates a pool of disk space out of which logical volumes (LVs) can be allocated.
Within a volume group, the disk space available for allocation is divided into units of a fixed-size called extents. An extent is the smallest unit of space that can be allocated. Within a physical volume, extents are referred to as physical extents.
A logical volume is allocated into logical extents of the same size as the physical extents. The extent size is thus the same for all logical volumes in the volume group. The volume group maps the logical extents to physical extents.
Display VG
vgdisplay
– Display volume group information. The vgdisplay
command displays volume group properties such as size, extents, number of physical volumes, and other options in a fixed form. If you do not specify a volume group, all existing volume groups are displayed.
vgdisplay
--- Volume group ---
VG Name vg_name
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 19
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 6
Open LV 4
Max PV 0
Cur PV 1
Act PV 1
VG Size 930.53 GiB
PE Size 4.00 MiB
Total PE 238216
Alloc PE / Size 93184 / 364.00 GiB
Free PE / Size 145032 / 566.53 GiB
VG UUID NWWfr6-xxfN-0d22-muPn-Rgqj-vAcA-z5P5jV
The following example shows the output of the vgdisplay
command for the volume group vg_name
.
vgdisplay vg_name
vgs
– Display information about volume groups. It is a preferred alternative of vgdisplay
that shows the same information and more, using a more compact and configurable output format.
vgs
VG #PV #LV #SN Attr VSize VFree
vg_name 1 6 2 wz--n- 930.53g 566.53g
vgscan
– Search for all volume groups. vgscan
scans all supported LVM block devices in the system for VGs.
vgscan
Found volume group "vg_name" using metadata type lvm2
Create VG
Create Volume group named vg_name
by using the /dev/nvme0n1p3
Physical volume.
vgcreate vg_name /dev/nvme0n1p3
Volume group "vg_name" successfully created.
Another example: Create Volume group named another_vg
by using /dev/vda1
and /dev/vdb1
Physical volumes.
vgcreate another_vg /dev/vda1 /dev/vdb1
Volume group "another_vg" successfully created.
Another example: Create a new physical volume and then a new volume group on newly attached block device – in this case /dev/sdc
.
lsblk # check
pvcreat /dev/sdbc # crate phisical volume
vgcreate vg_name /dev/sdbc # create volume group
vgdisplay # check
Extend VG
vgextend
– Add physical volumes to a volume group. vgextend
adds one or more PVs to a VG. This increases the space available for LVs in the VG. Also, PVs that have gone missing and then returned, e.g. due to a transient device failure, can be added back to the VG without re-initializing them (see --restoremissing
).
If the specified PVs have not yet been initialized with pvcreate
, vgextend
will initialize them. In this case pvcreate
options can be used, e.g. --labelsector
, --metadatasize
, --metadataignore
, --pvmetadatacopies
, --dataalignment
, --dataalignmentoffset
.
Example 1: Occupy a partition that is not yet defined as Physical volume.
vgextend vg_name /dev/nvme0n2p1
Physical volume "/dev/nvme0n2p1" successfully created.
Volume group "vg_name" successfully extended.
Example 2: Create a new Physical volume and then extend an existing Volume group named another_vg
.
lsblk # Check the devices
pvcreat /dev/sdb # Create a Phisical volume at /dev/sdb
pvdisplay # Check the list of the Phisical volumes
vgextend another_vg /dev/sdb # Extend the existing VG to occupy the new PV
df -hT # Check the list of the available devices
vgdisplay # Check the VGs information
Merge VG: Combine VGs
vgmerge
– Merge volume groups. To combine two volume groups into a single volume group, use the vgmerge
command. You can merge an inactive "source" volume with an active or an inactive "destination" volume if the physical extent sizes of the volume are equal and the physical and logical volume summaries of both volume groups fit into the destination volume groups limits.
Merge the inactive volume group another_vg
into the active or inactive volume group vg_name
giving verbose runtime information.
vgmerge -v vg_name another_vg
Reduce VG: Remove PVs from a VG
vgreduce
– Remove physical volume(s) from a volume group. The vgreduce
command shrinks a volume group’s capacity by removing one or more empty physical volumes. This frees those physical volumes to be used in different volume groups or to be removed from the system.
1. If the Physical volume is still being used, migrate the data to another Physical volume from the same Volume group by pvmove
.
pvmove /dev/vdb3
/dev/vdb3: Moved: 2.0%
...v/vdb3: Moved: 79...
/dev/vdb3: Moved: 100.0%
2. If there are no enough free extents on the other physical volumes in the existing volume group.
pvcreate /dev/vdb4 # Create a new physical volume from /dev/vdb4
vgextend vg_name /dev/vdb4 # Add the newly created PV to the vg_name VG
pvmove /dev/vdb3 /dev/vdb4 # Move the data from /dev/vdb3 to /dev/vdb4
3. Remove the physical volume /dev/vdb3
from the volume group.
pvmove /dev/vdb3
4. Verify if the /dev/vdb3
physical volume is removed from the vg_name
volume group by the help of pvs
.
Split VG
vgsplit
– Move physical volumes into a new or existing volume group. More details at Red Hat's manual – section Splitting a LVM volume group.
vgsplit myvg yourvg /dev/vdb3
Volume group "yourvg" successfully split from "myvg"
Rename VG
vgrename
– Rename a volume group. vgchange
– Change volume group attributes.
vgchange --activate n vg_name # Deactivate the volume group
vgrename vg_name new_vg_name # Rename an existing volume group
vgrename /dev/vg_name /dev/new_vg_name # Rename by specifying the full paths to the devices
Rename volume group by UUID: This is useful when you have attached to the system a device that have a VG with the same name as one already existing. Use vgdisplay
to identify the target volume group and its UUID.
vgdisplay
vgrename ZTIHAQ-rFck-3IEK-V2mx-mckk-R1zJ-nNKWox old_pve
WARNING: VG name "pve" is used by VGs "ZTIHAQ-rFck-3IEK-V2mx-mckk-R1zJ-nNKWox" and "hXgkkq-MdYE-dobE-VPrC-0c6f-p5Oi-L4XEZu".
Fix duplicate VG names with vgrename uuid, a device filter, or system IDs.
Processing VG pve because of matching UUID ZTIHAQ-rFck-3IEK-V2mx-mckk-R1zJ-nNKWox
Volume group "ZTIHAQ-rFck-3IEK-V2mx-mckk-R1zJ-nNKWox" successfully renamed to "old_pve"
Remove VG
vgremove
– Remove volume group(s). vgremove
removes one or more VGs. If LVs exist in the VG, a prompt is used to confirm LV removal.
If one or more PVs in the VG are lost, consider vgreduce --removemissing
to make the VG metadata consistent again. Repeat the force option (-ff
) to forcibly remove LVs in the VG without confirmation.
Logical Volumes (LV)
- Source: Red Hat Docs > [9] > Configuring and managing LVs > Ch.4: Managing LVM LV
- Source: Red Hat Docs > [9] > Configuring and managing LVs > Ch.5: Modifying the size of a LV
A logical volume is a virtual, block storage device that a file system, database, or application can use. To create an LVM logical volume, the physical volumes (PVs) are combined into a volume group (VG). This creates a pool of disk space out of which LVM logical volumes (LVs) can be allocated.
An administrator can grow or shrink logical volumes without destroying data, unlike standard disk partitions. If the physical volumes in a volume group are on separate drives or RAID arrays, then administrators can also spread a logical volume across the storage devices.
The following are the different types of logical volumes (more details):
- Linear volumes
- Striped logical volumes
- RAID logical volumes
- Thin-provisioned logical volumes (thin volumes) – Using thin-provisioned logical volumes, you can create logical volumes that are larger than the available physical storage…
- Snapshot volumes
- Thin-provisioned snapshot volumes
- Cache volumes
Create LV
lvcreate – Create LVM logical volume at lvm-vm-group
:
lvcreate -n vm-win-01 -L 60g lvm-vm-group
Logical volume "vm-win-01" created.
vm-win-01
is the name of the logical volume (device), it is mater of your choice.
Check the result:
lsblk | grep -P 'sdb|lvm'
├─sdb1 8:17 0 1G 0 part
└─sdb2 8:18 0 231.9G 0 part
└─lvm--vm--group-vm--win--01 253:0 0 60G 0 lvm
Another example: For Recovering PVE from grub "disk not found" error when booting from LVM by creating 4MiB LV.
vgscan
lvcreate -L 4M pve -n grubtemp
- Assume you have
pve
volume group. grubtemp
is the name of the new logical volume (LV).
Another example: Create a new logical volume and format it as Ext4, and mount it permanently via /etc/fstab
by its UUID.
lvcreate vg_name -L 50G -n lv_name # create 50GB logical volume
lvdisplay # check
mkfs.ext4 /dev/mapper/vg_name-lv_name # format the logical folume as Ext4
mount /dev/mapper/vg_name-lv_name /mnt/volume # Mount it manually
df -h /mnt/volume # Check
umount /mnt/volume
blkid /dev/mapper/vg_name-lv_name
/dev/mapper/vg_name-lv_name: UUID="6cb60ea8-d45e..." BLOCK_SIZE="4096" TYPE="ext4"
nano /etc/fstab
UUID=6cb60ea8-d4... /mnt/volume ext4 defaults 0 2
Another example: Create a new logical volume and format it as Swap, and mount it permanently via /etc/fstab
. by vg_name/lv_name
.
lvcreate vg_name -L 16G -n swap_1 # create 16GB logical volume
lvdisplay # check
mkswap /dev/mapper/vg_name-swap_1 # format the logical folume as Swap
swapon /dev/mapper/vg_name-swap_1
nano /etc/fstab
/dev/vg_name/swap_1 none swap sw 0 0
Rename LV
lvrename
– Rename a logical volume.
umount /mnt/my-lv-mount-point
lvrename my-volume-group my-lv-prev my-lv-new
Alternatively you can rename LV by its full path.
lvrename /dev/my-volume-group/my-lv-prev /dev/my-volume-group/my-lv-new
Remove LV
lvremove
– Remove logical volume(s) from the system.
If the logical volume is currently mounted, unmount the volume.
umount /mnt/my-lv-name-mount-point
If the logical volume exists in a clustered environment, deactivate the logical volume on all nodes where it is active. Use the following command on each such node.
lvchange --activate n my-volume-group/my-lv-name
Remove the logical volume using the lvremove
utility.
lvremove /dev/my-volume-group/my-lv-name
Do you really want to remove active logical volume my-volume-group/my-lv-name? [y/n]: y
Logical volume "my-lv-name" successfully removed
Resize LV (extend|reduce)
lvresize
– Resize a logical volume. lvresize
resizes an LV in the same way as lvextend
and lvreduce
.
Example 0: Resize (Extend) an LV by 16MB using specific physical extents.
lvresize -L+16M vg1/lv1 /dev/sda:0-1 /dev/sdb:0-1
Example 1: Extend a logical volume by 10GiB and resize the file-system manually. (note there mus have enough free space in the volume group where the existing LV is located.
lvextend -L +10G /dev/mapper/vg_name-lv_name
rsize2fs /dev/mapper/vg_name-lv_name
df -h # To see the changes if the LV is mounted
Example 2: Extend a logical volume, occupy 100% of the available space in the VG and resize the file-system in the same time.
lvextend --reziefs -l +100%FREE /dev/mapper/vg_name-lv_name
df -h # To see the changes if the LV is mounted
Example 3: Reduce (Resize|Shrink) the LV and its file-system (from larger size) to exactly 60GiB. Note this may be dangerous an you may need to take a backup of the file-system before do it.
lvreduce --resizefs -L 60G vg_name/lv_name
df -h # To see the changes if the LV is mounted
Snapshots of Logical Volumes
Using the LVM snapshot feature, you can create virtual images of a volume, for example, /dev/sda, at a particular instant without causing a service interruption.
When you modify the original volume (the origin) after you take a snapshot, the snapshot feature makes a copy of the modified data area as it was prior to the change so that it can reconstruct the state of the volume. When you create a snapshot, full read and write access to the origin stays possible.…
Create a Snapshot
lvcreate
– Create a logical volume.
-s
,--snapshot
– Create a snapshot. Snapshots provide a "frozen image" of an origin LV. The snapshot LV can be used, e.g. for backups, while the origin LV continues to be used. This option can create a COW (copy on write) snapshot, or a thin snapshot (in a thin pool.) Thin snapshots are created when the origin is a thin LV and the size option is NOT specified.-n
,--name
– Specifies the name of a new LV. When unspecified, a default name oflvol#
is generated, where#
is a number generated by LVM.
Create 5GB snapshot of a logical volume named lv_name
from volume group named vg_name
.
lvcreate /dev/mapper/vg_name-lv_name -L 5G -s -n lv_name_ss_at_date_$(date +%y%m%d)
lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_name vg_name owi-aos--- 60.00g
lv_name_ss_at_date_220908 vg_name swi-a-s--- 5.00g lv_name 0.01
Mount a Snapshot
The snapshot could be mounted in order to fetch files in their snapshot state. In this case it is good to mount them in read only mode.
mkdir /mnt/snapshot
mount -r /dev/mapper/vg_name-lv_name_ss_at_date_220908 /mnt/snapshot
You can use a mounted snapshot (of the root filesystem) to create a backup while the OS is running.
Restore a Snapshot
Note after the restoring of a snapshot with merge option in use the snapshot will be removed, so you must create another snapshot for a later use of the same state of the logical volume.
For restoring a snapshot we will need to use the commands lvconvert
and lvchange
.
LvConvert: Convert-merge the snapshot with the source LV
lvconvert
– Change logical volume layout.
--merge
– An alias for--mergethin
,--mergemirrors
, or--mergesnapshot
, depending on the type of LV (logical volume).--mergesnapshot
– Merge COW snapshot LV into its origin. When merging a snapshot, if both the origin and snapshot LVs are not open, the merge will start immediately. Otherwise, the merge will start the first time either the origin or snapshot LV are activated and both are closed. Merging a snapshot into an origin that cannot be closed, for example a root filesystem, is deferred until the next time the origin volume is activated. When merging starts, the resulting LV will have the origin's name, minor number and UUID. While the merge is in progress, reads or writes to the origin appear as being directed to the snapshot being merged. When the merge finishes, the merged snapshot is removed. Multiple snapshots may be specified on the command line or a @tag may be used to specify multiple snapshots be merged to their respective origin.
umount /lv_name-mountpoint
lvconvert --merge /dev/mapper/vg_name-lv_name_ss_at_date_220908
If it is a root filesystem, and the source logical volume is not operational at all, we need to boot in live Linux session in order to perform the steps, because it must be unmounted. It it is not a root filesystem, we need to unmount the logical volume first.
LvChange: Deactivate, reactivate and remount the LV
lvchange
– Change the attributes of logical volume(s).
-a|
,--activate y|n|ay
– Change the active state of LVs. An active LV can be used through a block device, allowing data on the LV to be accessed.y
makes LVs active, or available.n
makes LVs inactive, or unavailable…
lvchange -an /dev/mapper/vg_name-lv_name
lvchange -ay /dev/mapper/vg_name-lv_name
lvchange -ay /dev/mapper/vg_name-lv_name -K
If we are working within a live Linux session – i.e. we are restoring a root filesystem, – these steps will be performed at the next reboot. Otherwise we need to run the following steps in order to apply the changes without reboot.
mount -a # remount via /etc/fstab
df -h # list the mounted devices
Remove a Snapshot
lvremove
– Remove logical volume(s) from the system.
lvremove /dev/vg_name/lv_name_ss_at_date_220908
lvremove /dev/mapper/vg_name-lv_name_ss_at_date_220908
Thin Volumes, Enable Caching and Create Methods…
References:
- Red Hat Docs > [9] > Configuring and managing LVs > Ch.8: Creating and managing thin provisioned volumes (thin volumes)
- Red Hat Docs > [9] > Configuring and managing LVs > Ch.9: Enabling caching to improve logical volume performance
References
- Red Hat Docs: Red Hat > [9] > Configuring and managing LVs
- Learn Linux TV: Linux Logical Volume Manager (LVM) Deep Dive Tutorial
- Learn Linux TV at YouTube: Linux Logical Volume Manager (LVM) Deep Dive Tutorial
- Linux Hint: LVM: How to List and Selectively Remove Snapshots
- DigitalOcean: How To Use LVM To Manage Storage Devices on Ubuntu 18.04
- Ubuntu Community Wiki: Ubuntu Desktop LVM
- SleepLessBeastie's notes: How to fix device excluded by a filter