LVM: Difference between revisions

From Leo's Notes
This page was last edited on 22 April 2021, at 21:57.
snapshot
snapshot extend size
Line 31: Line 31:
|<code>lvcreate -n lv_name -l 50%FREE vg_name</code>
|<code>lvcreate -n lv_name -l 50%FREE vg_name</code>
<code>lvcreate -n lv_name -L 50G vg_name</code>
<code>lvcreate -n lv_name -L 50G vg_name</code>
|-
|Create a snapshot capable of holding 10G of deltas
|<code>lvcreate -s -n snap_lv_name --size 10G /dev/vg_name/lv_name</code>
|-
|-
|Resize a logical volume, <code>+Size</code> to increase, <code>-Size</code> to decrease.
|Resize a logical volume, <code>+Size</code> to increase, <code>-Size</code> to decrease.
Line 43: Line 46:
LVM allows the creation of volumes which functionally is similar to partitions. This is done by allocating storage into a volume group (VG) which can then be broken up into separate logical volumes (LV).
LVM allows the creation of volumes which functionally is similar to partitions. This is done by allocating storage into a volume group (VG) which can then be broken up into separate logical volumes (LV).


Unlike a traditional partition scheme, LVM breaks down the backing storage into many small chunks called physical extents (PE) which are typically 4MB in size. These physical extents are assigned to their respective logical volumes (referred to as Logical Extents) and can be added or removed after creation allowing for volumes to grow or shrink as needed. One of the added benefits with this design allows for the ability to implement copy-on-write (CoW) allowing for quick and space-efficient snapshotting.
Unlike a traditional partition scheme, LVM breaks down the backing storage into many small chunks called physical extents (PE) which are typically 4MB in size. These physical extents are assigned to their respective logical volumes (referred to as Logical Extents) and can be added or removed after creation allowing for volumes to grow or shrink as needed. One of the added benefits with this design allows for the ability to implement copy-on-write (COW) allowing for quick and space-efficient snapshotting.


=== Creating a volume group and logical volume ===
===Creating a volume group and logical volume===


To quickly get a filesystem up and running using LVM, we will need to create a volume group and then a logical volume within the volume group.{{highlight|lang=terminal|code=
To quickly get a filesystem up and running using LVM, we will need to create a volume group and then a logical volume within the volume group.{{highlight|lang=terminal|code=
Line 94: Line 97:
}}
}}


=== Using snapshots ===
===Using snapshots===
A snapshot creates a point-in-time copy of a volume. Unlike ZFS, a LVM snapshot creates a separate volume which appears as a separate block device which needs to be mounted separately.  There is no need to worry about creating an unclean filesystem with the snapshot because LVM will make the necessary system calls and work so that the filesystem is synced and checkpointed so that the snapshot copy is consistent and clean.
A snapshot creates a point-in-time copy of a volume. Unlike ZFS, a LVM snapshot creates a separate volume which appears as a separate block device which needs to be mounted separately.  There is no need to worry about creating an unclean filesystem with the snapshot because LVM will make the necessary system calls and work so that the filesystem is synced and checkpointed so that the snapshot copy is consistent and clean.


==== Creating, listing, and deleting snapshots ====
To create a new snapshot of an existing volume, use the <code>lvcreate</code> command with the <code>-s</code> or <code>--snapshot</code> option. You will need to specify the size of the snapshot. More on this later. Once created, the snapshot will appear in <code>lvs</code> with a <code>s</code> attribute and can be removed with the <code>lvremove</code> command.
To create a new snapshot of an existing volume, use the <code>lvcreate</code> command with the <code>-s</code> or <code>--snapshot</code> option. You will need to specify the size of the snapshot. More on this later. Once created, the snapshot will appear in <code>lvs</code> with a <code>s</code> attribute and can be removed with the <code>lvremove</code> command.
{{Highlight
{{Highlight
Line 111: Line 115:
| lang = terminal
| lang = terminal
}}
}}
A new snapshot takes nearly no additional space. Any changes that are made to the origin volume or the snapshotted volume will need to be tracked in order for the snapshot to function. This is done transparently through the copy-on-write feature of LVM, but unlike ZFS, the size requirement of this copy-on-write is deducted from the snapshot volume rather than the whole storage pool as a whole. In other words, as the source volume or snapshot volume changes, the size requirement of the snapshot volume will grow in tandem to a maximum of the source volume size. On a busy filesystem or for snapshots that you intend to keep around for a long time, the snapshot size should match the source volume size. The snapshot will become corrupt when the snapshot volume runs out of space.  
 
==== Snapshot volume size ====
A new snapshot takes nearly no additional space. Any changes that are made to the origin volume or the snapshotted volume will need to be tracked in order for the snapshot to function. This is done transparently through the copy-on-write feature of LVM, but unlike ZFS, the size requirement of this copy-on-write is deducted from the snapshot volume rather than the whole storage pool as a whole. In other words, as the source volume or snapshot volume changes, the size requirement of the snapshot volume will grow in tandem to a maximum of the source volume size.
 
On a busy filesystem or for snapshots that you intend to keep around for a long time, the snapshot size should match the source volume size. '''The snapshot will become corrupt when the snapshot volume runs out of space.''' 
 
If you have a snapshot that is about to run out of space, increase the snapshot volume size with <code>lvextend</code>:
{{Highlight
| code = # lvextend -L +10G /dev/volgroup/logicalvol_snap
| lang = terminal
}}
You may also configure LVM to automatically extend snapshot volumes by editing <code>/etc/lvm/lvm.conf</code> and setting the <code>snapshot_autoextend_threshold</code> value.  


===Recovering Volumes===
===Recovering Volumes===

Revision as of 21:57, 22 April 2021

The Logical Volume Manager or LVM is a volume manager available on Linux. Functionally, volumes are similar to traditional partitions but with the following benefits:

  • Resizable volumes
  • Snapshots, A point-in-time copy of data useful for making consistent backups
  • Ability for a volume to span multiple disks

Cheet Sheet

Action Command
Show volume groups vgs

vgdisplay

Create a volume group (with name and backing device) vgcreate vg_name /dev/disk
Deactivate a volume group vgchange -a n vg_name
Remove a volume group vgremove vg_name
Show logical volumes lvs

lvdisplay

Create a logical volume

% of free space in vg with -l, or specific size with -L

lvcreate -n lv_name -l 50%FREE vg_name

lvcreate -n lv_name -L 50G vg_name

Create a snapshot capable of holding 10G of deltas lvcreate -s -n snap_lv_name --size 10G /dev/vg_name/lv_name
Resize a logical volume, +Size to increase, -Size to decrease. lvresize -L +10G /dev/vg_name/lv_name
Remove a logical volume lvremove lv_name

Introduction

Logical Volume Manager, showing disks to physical extents to volume groups to logical volumes
Logical Volume Manager, showing disks to physical extents to volume groups to logical volumes

LVM allows the creation of volumes which functionally is similar to partitions. This is done by allocating storage into a volume group (VG) which can then be broken up into separate logical volumes (LV).

Unlike a traditional partition scheme, LVM breaks down the backing storage into many small chunks called physical extents (PE) which are typically 4MB in size. These physical extents are assigned to their respective logical volumes (referred to as Logical Extents) and can be added or removed after creation allowing for volumes to grow or shrink as needed. One of the added benefits with this design allows for the ability to implement copy-on-write (COW) allowing for quick and space-efficient snapshotting.

Creating a volume group and logical volume

To quickly get a filesystem up and running using LVM, we will need to create a volume group and then a logical volume within the volume group.

# vgcreate ug_vg /dev/sdb
  Volume group "ug_vg " successfully created
  
  
# vgdisplay ug_vg 
  --- Volume group ---
  VG Name               ug_vg 
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               836.62 GiB
  PE Size               4.00 MiB
  Total PE              214175
  Alloc PE / Size       0 / 0
  Free  PE / Size       214175 / 836.62 GiB
  VG UUID               WeggQU-zQf3-j3mk-OAFd-iUCQ-EDTo-ezxhcb

# lvcreate -n ug -l 90%FREE ug_vg
  Logical volume "ug" created.

## After creating a LV, the available free PEs decrease as expected
# vgdisplay ug_vg
...
  VG Size               836.62 GiB
  PE Size               4.00 MiB
  Total PE              214175
  Alloc PE / Size       192757 / 752.96 GiB
  Free  PE / Size       21418 / 83.66 GiB

# LVM volumes are placed under /dev with the VG name and LV name.
# mkfs.ext4 /dev/ug_vg/ug

## If a VG needs to be renamed, use the vgrename command:
# vgrename uga ug_vg

Using snapshots

A snapshot creates a point-in-time copy of a volume. Unlike ZFS, a LVM snapshot creates a separate volume which appears as a separate block device which needs to be mounted separately. There is no need to worry about creating an unclean filesystem with the snapshot because LVM will make the necessary system calls and work so that the filesystem is synced and checkpointed so that the snapshot copy is consistent and clean.

Creating, listing, and deleting snapshots

To create a new snapshot of an existing volume, use the lvcreate command with the -s or --snapshot option. You will need to specify the size of the snapshot. More on this later. Once created, the snapshot will appear in lvs with a s attribute and can be removed with the lvremove command.

# lvcreate --size 1G -s -n logicalvol_snap /dev/mapper/volgroup-logicalvol
  Logical volume "logicalvol_snap" created.

# lvs
  LV              VG       Attr       LSize   Pool Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  logicalvol      volgroup owi-aos--- 220.00g
  logicalvol_snap volgroup swi-a-s---   1.00g      logicalvol 29.54

# lvremove -f /dev/volgroup/logicalvol_snap
  Logical volume "metrics_snap" successfully removed

Snapshot volume size

A new snapshot takes nearly no additional space. Any changes that are made to the origin volume or the snapshotted volume will need to be tracked in order for the snapshot to function. This is done transparently through the copy-on-write feature of LVM, but unlike ZFS, the size requirement of this copy-on-write is deducted from the snapshot volume rather than the whole storage pool as a whole. In other words, as the source volume or snapshot volume changes, the size requirement of the snapshot volume will grow in tandem to a maximum of the source volume size.

On a busy filesystem or for snapshots that you intend to keep around for a long time, the snapshot size should match the source volume size. The snapshot will become corrupt when the snapshot volume runs out of space.

If you have a snapshot that is about to run out of space, increase the snapshot volume size with lvextend:

# lvextend -L +10G /dev/volgroup/logicalvol_snap

You may also configure LVM to automatically extend snapshot volumes by editing /etc/lvm/lvm.conf and setting the snapshot_autoextend_threshold value.

Recovering Volumes

# vgscan                                  # Generates /etc/lvm/backup/VolGroup01
# cd /etc/lvm/backup
# vgcfgrestore -f VolGroup01 VolGroup01   # Restore VG using /etc/lvm/backup/VolGroup01
# vgscan                                  # verifies volume groups
# pvscan                                  # Looks for physical volumes
# vgchange VolGroup01 -a y                # Activates the volume group
# lvscan                                  # Looks for logical volumes
# mount /dev/VG01/LV00 /mnt/foo           # LVM volumes should be in /dev/vg/lv and should be mountable

Use vgscan to rescan for volume groups. This will create a file of the same name as the volume in /etc/lvm/backup/. To restore a volume, use the vgcfgrestore command. With the volume groups restored, use pvscan to look for physical volumes. Activate the volume using vgchange VolGroup01 -a y

With the volume activated, look for logical volumes using lvscan. Logical volumes should show up in /dev/VolGroup01/LogVol00 for example and can be mounted.

See also:

Mounting / Unmounting Volumes

If you have a LVM partition, you can see what physical volumes there are under the LVM by running:

# pvs
PV               VG                Fmt    Attr    PSize       PFree
/dev/hda2        VolGroup01        lvm2   a-      148.94G     32.00M

The volume group (VG) is VolumeGroup01. To view the logical volumes under this volume group, run:

# lvdisplay /dev/VolumeGroup01

Once you have located the logical volume you want to mount, say LogVol00, run:

# mount /dev/VolumeGroup01/LogVol00 /mnt/disk


Expanding Volume

Here's a quick guide on expanding a virtual disk that is using LVM.

  1. Expand the virtual disk
  2. The OS might not be aware of the disk size change until a reboot. Reboot if the size is still incorrect.
  3. Resize the partition that LVM is using using fdisk.
    1. Delete the partition
    2. Recreate the partition with the same starting location but with a larger size
    3. Run partprobe to update the partition size
  4. Resize the LVM physical volume with pvresize /dev/sda1
  5. pvscan should show the LVM having free space
  6. Resize the LV. Eg: Add 1GB with lvresize -L +1G /dev/centos/root
  7. Resize the filesystem.

An example from a virtual machine where the disk was expanded from 20GB to 40GB.

## Expand the partition <code>/dev/sda2</code> using <code>fdisk</code>. Then do the following.
# pvresize /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized
  
## Verify
# pvscan
  PV /dev/sda2   VG centos          lvm2 [<39.00 GiB / 20.00 GiB free]
  Total: 1 [<39.00 GiB] / in use: 1 [<39.00 GiB] / in no VG: 0 [0   ]
  
## Resize the LVs as required
# lvresize -L +1G /dev/centos/root
  Size of logical volume centos/root changed from <17.00 GiB (4351 extents) to <18.00 GiB (4607 extents).
  Logical volume centos/root successfully resized.

# lvs
  LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root centos -wi-ao---- <18.00g
  swap centos -wi-ao----   2.00g
  
## Expand your filesystems. If using XFS:
# xfs_growfs /
meta-data=/dev/mapper/centos-root isize=512    agcount=4, agsize=1113856 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=4455424, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 4455424 to 4717568
# xfs_info /
meta-data=/dev/mapper/centos-root isize=512    agcount=5, agsize=1113856 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=4717568, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

## If using ext4, use resize2fs
# resize2fs /dev/mapper/vg-lv


See Also