# The LVM plug-in

The LVM plug-in combines storage objects into groups called containers. From these containers, new storage objects can be created, with a variety of mappings to the consumed objects. Containers allow the storage capacity of several objects to be combined, allow additional storage to be added in the future, and allow for easy resizing of the produced objects.

## How LVM is implemented

The Linux LVM plug-in is compatible with volumes and volume groups from the original Linux LVM tools from Sistina Software. The original LVM is based on the concept of volume groups. A volume group (VG) is a grouping of physical volumes (PVs), which are usually disks or disk partitions. The volume group is not directly usable as storage space; instead, it represents a pool of available storage. You create logical volumes (LVs) to use this storage. The storage space of the LV can map to one or more of the group's PVs.

The Linux LVM concepts are represented by similar concepts in the EVMS LVM plug-in. A volume group is called a container, and the logical volumes that are produced are called regions. The physical volumes can be disks, segments, or other regions. Just as in the original LVM, regions can map to the consumed objects in a variety of ways.

## Container operations

### Creating LVM containers

Containers are created with an initial set of objects. In the LVM plug-in, the objects can be disks, segments, or regions. LVM has two options for creating containers. The value of these options cannot be changed after the container has been created. The options are:

name

  The name of the new container.

pe_size

  The physical extent (PE) size, which is the granularity with which regions can be created. The default is 16 MB. Each region must have a whole number of extents. Also, each region can have only up to 65534 extents. Thus, the PE size for the container limits the maximum size of a region in that container. With the default PE size, an LVM region can be, at most 1 TB. In addition, each object consumed by the container must be big enough to hold at least five extents. Thus, the PE size cannot be arbitrarily large. Choose wisely.

### Adding objects to LVM containers

You can add objects to existing LVM containers in order to increase the pool of storage that is available for creating regions. A single container can consume up to 256 objects. Because the name and PE size of the containers are set when the container is created, no options are available when you add new objects to a container. Each object must be large enough to hold five physical extents. If an object is not large enough to satisfy this requirement, the LVM plug-in will not allow the object to be added to the container.

### Removing objects from LVM containers

You can remove a consumed object from its container as long as no regions are mapped to that object. The LVM plug-in does not allow objects that are in use to be removed from their container. If an object must be removed, you can delete or shrink regions, or move extents, in order to free the object from use.

No options are available for removing objects from LVM containers.

### Expanding consumed objects in LVM containers

In addition to adding new objects to an LVM container, you can also expand the space in a container by expanding one of the existing consumed objects (PVs). For example, if a PV is a disk-segment with freespace immediately following it on the disk, you can expand that segment, which will increase the amount of freespace in the container. Likewise, if a PV is a RAID-0 or RAID-5 region, you can expand that region by adding additional objects, which in turn increases the freespace in the container.

When using the GUI or text-mode UIs, PV-expand is performed by expanding the container. If any of the existing PVs are expandable, they will appear in the expand-points list. Choose the PV to expand, and then the options for expanding that object. After the PV has expanded, the container's freespace will reflect the additional space available on that PV.

When using the CLI, PV-expand is performed by expanding the appropriate object directly. The CLI and the EVMS engine will route the necessary commands so the container is expanded at the same time.

The options for expanding a PV are dependent on the plug-in that owns that PV object. Please see the appropriate plug-in's appendix for more details on options for that object.

### Shrinking consumed objects in LVM containers

In addition to removing existing objects from an LVM container, you can also reduce the size of a container by shrinking one of the existing consumed objects (PVs). This is only allowed if the consumed object has physical extents (PEs) at the end of the object that are not allocated to any LVM regions. In this case, LVM2 will allow the object to shrink by the number of unused PEs at the end of that object.

For example, if a PV is a desk-segment, you can shrink that segment, which will decrease the amount of freespace in the container. Likewise, if a PV is a RAID-0 or RAID-5 region, you can shrink that region by removing one of the objects, which in turn decreases the freespace in the container.

When using the GUI or text-mode UIs, PV-shrink is performed by shrinking the container. If any of the existing PVs are shrinkable, they will appear in the shrink-points list. Choose the PV to shrink, and then the options for shrinking that object. After the PV has shrunk, the container's freespace will reflect the reduced space available on that PV.

When using the CLI, PV-shrink is performed by shrinking the appropriate object directly. The CLI and the EVMS engine will route the necessary commands so the container is shrunk at the same time.

The options for shrinking a PV are dependent on the plug-in that owns that PV object. Please see the appropriate plug-in's appendix for more details on options for that object.

### Deleting LVM containers

You can delete a container as long as the container does not have any produced regions. The LVM plug-in does not allow containers to be deleted if they have any regions. No options are available for deleting LVM containers.

### Renaming LVM containers

You can rename an existing LVM container. When renaming an LVM container, all of the regions produced from that container will automatically have their names changed as well, because the region names include the container name. In the EVMS GUI and text-mode UIs, this is done using the `modify properties` command, which is available through the "Actions" menu or the context-sensitive pop-up menus. In the EVMS CLI, this is done using the `set` command.

See for more information about the effects of renaming the regions.

## Region operations

### Creating LVM regions

You create LVM regions from the freespace in LVM containers. If there is at least one extent of freespace in the container, you can create a new region.

The following options are available for creating LVM regions:

name

  The name of the new region.

extents

  The number of extents to allocate to the new region. A new region must have at least one extent and no more than the total available free extents in the container, or 65534 (whichever is smaller). If you use the `extents` option, the appropriate value for the size option is automatically calculated. By default, a new region uses all available extents in the container.

size

  The size of the new region. This size must be a multiple of the container's PE size. If you use the `size` option, the appropriate value for the extents options is automatically calculated. By default, a new region uses all available freespace in the container.

stripes

  If the container consumes two or more objects, and each object has unallocated extents, then the new region can be striped across multiple objects. This is similar to RAID-0 striping and achieves an increased amount of I/O throughput across multiple objects. This option specifies how many objects the new region should be striped across. By default, new regions are not striped, and this value is set to 1.

stripe_size

  The granularity of striping. The default value is 16 KB. Use this option only if the `stripes` option is greater than 1.

contiguous

  This option specifies that the new region must be allocated on a single object, and that the extents on that object must be physically contiguous. By default, this is set to false, which allows regions to span objects. This option cannot be used if the `stripes` option is greater than 1.

pv_names

  A list of names of the objects the new region should map to. By default, this list is empty, which means all available objects will be used to allocate space to the new region.

### Expanding LVM regions

You can expand an existing LVM region if there are unused extents in the container. If a region is striped, you can expand it only by using free space on the objects it is striped across. If a region was created with the contiguous option, you can only expand it if there is physically contiguous space following the currently allocated space.

The following options are available for expanding LVM regions:

add_extents

  The number of extents to add to the region. If you specify this option, the appropriate value for the add_size option is automatically calculated. By default, the region will expand to use all free extents in the container.

add_size

  The amount of space to add to the region. If you specify this option, the appropriate value for the add_extents option is automatically calculated. By default, the region will expand to use all freespace in the container.

pv_names

  A list of names of the objects to allocate the additional space from. By default, this list is empty, which means all available objects will be used to allocate new space to the region.

### Shrinking LVM regions

You can shrink an existing LVM region by removing extents from the end of the region. Regions must have at least one extent, so regions cannot be shrunk to zero.

The following options are available when shrinking LVM regions. Because regions are always shrunk by removing space from the end of the region, a list of objects cannot be specified in this command.

remove_extents

  The number of extents to remove from the region. If you specify this option, the appropriate value for the `remove_size` option is automatically calculated. By default, one extent is removed from the region.

remove_size

  The amount of space to shrink the region by. If you specify this option, the appropriate value for the `remove_extents` option is automatically calculated.

### Deleting LVM regions

You can delete an existing LVM region as long as it is not currently a compatibility volume, an EVMS volume, or consumed by another EVMS plug-in. No options are available for deleting LVM regions.

### Moving LVM regions

The LVM plug-in lets you change the logical-to-physical mapping for an LVM region and move the necessary data in the process. This capability is most useful if a PV needs to be removed from a container. There are currently two LVM plug-in functions for moving regions: `move_pv` and `move_extent`.

#### move_pv

When a PV needs to be removed from a container, all PEs on that PV that are allocated to regions must be moved to other PVs. The `move_pv` command lets you move PEs to other PVs. `move_pv` is targeted at the LVM container and the desired PV is used as the selected object. The following options are available:

target_pvs

  By default, all remaining PVs in the container are used to find available extents to move the PEs. You can specify a subset of the PVs with this option.

maintain_stripes

  When the target PV contains striped regions, there are three choices for handling moving extents that belong to those regions:

  no

    Don't bother to maintain true striping. This choice allows extents to be moved to PVs that the region already uses for other stripes. This means that the performance will not be as optimal as it is with true striping, but allows the most flexibility in performing the move operation. This choice is the default for the `maintain_stripes` option.

  loose

    Ensure that moved extents do not end up on any PVs that the striped region already uses. However, this does not ensure that all moved extents end up on the same PV. For example, a region with three stripes may end up mapping to four or more PVs.

  strict

    Ensure that all moved extents end up on the same PV, thus ensuring true striping with the same number of PVs that the striped region originally used. This is the most restricted choice, and may prevent the `move_pv` operation from proceeding (depending on the particular configuration of the container).

  If the target PV has no striped regions, the `maintain_stripes` option is ignored.

#### move_extent

In addition to moving all the extents from one PV, the LVM plug-in provides the ability to move single extents. This allows a fine-grain tuning of the allocation of extents. This command is targeted at the region owning the extent to move. There are three required options for the `move_extent` command:

le

  The number of the logical extent to move. LE numbers start at 0.

pv

  The target object to move the extent to.

pe

  The target physical extent on the target object. PE numbers also start at 0.

To determine the source LE and target PE, it is often helpful to view the extended information about the region and container in question. The following are command-line options that can be used to gather this information:

To view the map of LEs in the region, enter this command:

    query:ei,<region_name>,Extents

To view the list of PVs in the container, enter this command:

    query:ei,<container_name>,Current_PVs

To view the current PE map for the desired target PV, enter this command:

    query:ei,<container_name>,PEMapPV#

# is the number of the target PV in the container.

This information is also easily obtainable in the GUI and Text-Mode UIs by using the "Display Details" item in the context-popup menus for the desired region and container.

### Renaming LVM regions

You can rename an existing LVM region. In the EVMS GUI and text-mode UIs, this is done using the `modify properties` command, which is available through the "Actions" menu or the context-sensitive pop-up menus. In the EVMS CLI, this is done using the `set` command.

If the renamed LVM region has a compatibility volume on it, then the name of that compatibility volume will also change. In order for this to work correctly, that volume must be unmounted before the name is changed. Also, be sure to update your `/etc/fstab` file if the volume is listed, or the volume won't be mounted properly the next time the system boots.

If the renamed LVM region has an EVMS volume or another storage object built on it, then the region's name change will be transparent to the upper layers. In this case, the rename can be done while the volume is mounted.