[[chapter_lvm]]
Logical Volume Manager (LVM)
----------------------------
ifdef::wiki[]
:pve-toplevel:
endif::wiki[]

Most people install {pve} directly on a local disk. The {pve}
installation CD offers several options for local disk management, and
the current default setup uses LVM. The installer let you select a
single disk for such setup, and uses that disk as physical volume for
the **V**olume **G**roup (VG) `pve`. The following output is from a
test installation using a small 8GB disk:

----
# pvs
  PV         VG   Fmt  Attr PSize PFree  
  /dev/sda3  pve  lvm2 a--  7.87g 876.00m

# vgs
  VG   #PV #LV #SN Attr   VSize VFree  
  pve    1   3   0 wz--n- 7.87g 876.00m
----

The installer allocates three **L**ogical **V**olumes (LV) inside this
VG:

----
# lvs
  LV   VG   Attr       LSize   Pool Origin Data%  Meta%
  data pve  twi-a-tz--   4.38g             0.00   0.63
  root pve  -wi-ao----   1.75g
  swap pve  -wi-ao---- 896.00m     
----

root:: Formatted as `ext4`, and contains the operating system.

swap:: Swap partition

data:: This volume uses LVM-thin, and is used to store VM
images. LVM-thin is preferable for this task, because it offers
efficient support for snapshots and clones.

For {pve} versions up to 4.1, the installer creates a standard logical
volume called ``data'', which is mounted at `/var/lib/vz`.

Starting from version 4.2, the logical volume ``data'' is a LVM-thin pool,
used to store block based guest images, and `/var/lib/vz` is simply a
directory on the root file system.

Hardware
~~~~~~~~

We highly recommend to use a hardware RAID controller (with BBU) for
such setups. This increases performance, provides redundancy, and make
disk replacements easier (hot-pluggable).

LVM itself does not need any special hardware, and memory requirements
are very low.


Bootloader
~~~~~~~~~~

We install two boot loaders by default. The first partition contains
the standard GRUB boot loader. The second partition is an **E**FI **S**ystem
**P**artition (ESP), which makes it possible to boot on EFI systems.


Creating a Volume Group
~~~~~~~~~~~~~~~~~~~~~~~

Let's assume we have an empty disk `/dev/sdb`, onto which we want to
create a volume group named ``vmdata''.

CAUTION: Please note that the following commands will destroy all
existing data on `/dev/sdb`.

First create a partition.

 # sgdisk -N 1 /dev/sdb


Create a **P**hysical **V**olume (PV) without confirmation and 250K
metadatasize.

 # pvcreate --metadatasize 250k -y -ff /dev/sdb1


Create a volume group named ``vmdata'' on `/dev/sdb1`

 # vgcreate vmdata /dev/sdb1


Creating an extra LV for `/var/lib/vz`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This can be easily done by creating a new thin LV.

 # lvcreate -n <Name> -V <Size[M,G,T]> <VG>/<LVThin_pool>

A real world example:

 # lvcreate -n vz -V 10G pve/data

Now a filesystem must be created on the LV.

 # mkfs.ext4 /dev/pve/vz

At last this has to be mounted.

WARNING: be sure that `/var/lib/vz` is empty. On a default
installation it's not.

To make it always accessible add the following line in `/etc/fstab`.

 # echo '/dev/pve/vz /var/lib/vz ext4 defaults 0 2' >> /etc/fstab


Resizing the thin pool
~~~~~~~~~~~~~~~~~~~~~~

Resize the LV and the metadata pool can be achieved with the following
command.

 # lvresize --size +<size[\M,G,T]> --poolmetadatasize +<size[\M,G]> <VG>/<LVThin_pool>

NOTE: When extending the data pool, the metadata pool must also be
extended.


Create a LVM-thin pool
~~~~~~~~~~~~~~~~~~~~~~

A thin pool has to be created on top of a volume group.
How to create a volume group see Section LVM.

 # lvcreate -L 80G -T -n vmstore vmdata
