# Logical Volume Manager (Linux)

LVM es una implementación de un gestor de volúmenes lógicos para el núcleo Linux. Se escribió originalmente en 1998 por Heinz Mauelshagen, que se basó en el administrador de volúmenes de Veritas usado en sistemas HP-UX.
LVM incluye muchas de las características que se esperan de un administrador de volúmenes, incluyendo:
* Redimensionado de grupos lógicos
* Redimensionado de volúmenes lógicos
* Instantáneas de sólo lectura (LVM2 ofrece lectura y escritura)
* RAID de volúmenes lógicos.
En la imagen mostrada podemos observar cómo trabaja LVM. Los volúmenes lógicos agrupan particiones físicas de disco, y estos a su vez, aunque no está representado en la figura, se engloban en un grupo lógico. De esta forma, /home se compone de hda3, hda4 y hdb3, y a su vez, /usr engloba a hda1, hda2, hdb1 y hdb2.

## Introducción

* La gestión de volúmenes lógicos proporciona una vista de alto nivel sobre el almacenamiento en un ordenador, en vez de la tradicional vista de discos y particiones.
* Los volúmenes de almacenamiento bajo el control de LVM pueden ser redimensionados y movidos a voluntad, aunque esto quizá necesite actualizar las herramientas del sistema.
* LVM también permite la administración en grupos definidos por el usuario, permitiendo al administrador del sistema tratar con volúmenes llamados, por ejemplo, "ventas" o "desarrollo", en vez de nombres de dispositivos físicos, como "sda" o "sdb".

## Ventajas de usar LVM en un sistema pequeño

Una de las decisiones que afronta un usuario instalando GNU/Linux es cómo particionar el disco duro. La necesidad de estimar cuanto espacio será necesario para el sistema, para los temporales o para los datos personales, puede convertirse en algo problemático, por lo que muchos usuarios optan por crear una partición que ocupe todo el disco y allí introducir los datos. Aun habiendo estimado correctamente cuánto espacio se necesita para /home, /usr, /tmp, o cualquier otro directorio importante, es bastante común que nos quedemos sin espacio en estas particiones, cuando tenemos espacio de sobra en alguna otra.
* Con el uso de un administrador de volúmenes lógicos, el disco completo puede ser asignado a un único grupo lógico y definir distintos volúmenes lógicos para almacenar /home u otros directorios. En el caso de que nos quedemos sin espacio, por ejemplo, en /home, y tenemos espacio en /opt, podríamos redimensionar /home y /opt y usar el espacio que le hemos quitado a /opt y añadírselo a /home. Hay que tener en cuenta, que para realizar esto, nuestro sistema de ficheros debe soportar el redimensionado por arriba y por abajo, como ReiserFS.
* Otra alternativa sería dejar una cierta cantidad de espacio del disco sin asignar y cuando fuera necesario, expandir el volumen.

## Ventajas de usar LVM en un sistema grande

* Administrar un sistema con muchos discos es un trabajo que consume tiempo, y se hace particularmente complejo si el sistema contiene discos de distintos tamaños. Equilibrar los requerimientos de almacenamiento de distintos usuarios (a menudo conflictivos) puede ser una tarea muy laboriosa y compleja.
* Los grupos de usuarios (llamémosles por ejemplo administración, desarrollo, etc.) pueden tener sus volúmenes lógicos y estos pueden crecer lo que sea necesario, y el administrador puede realizar las operaciones oportunas sobre dichos volúmenes.
Cuando un nuevo disco se añade al sistema, no es necesario mover los datos de los usuarios. Simplemente se añade el nuevo disco al grupo lógico correspondiente y se expanden los volúmenes lógicos todo lo que se considere adecuado. También se pueden migrar los datos de discos antiguos a otros nuevos, de forma totalmente transparente al usuario.

## Anatomía de un LVM

* Un LVM se descompone en tres partes:
** Volúmenes físicos (PV): Son las particiones del disco duro con sistema de archivos LVM. (raid's)
** Volúmenes lógicos (LV): es el equivalente a una partición en un sistema tradicional. El LV es visible como un dispositivo estándar de bloques, por lo que puede contener un sistema de archivos (por ejemplo /home)
** Grupos de volúmenes (VG): es la parte superior de la LVM. Es la "caja" en la que tenemos nuestros volúmenes lógicos (LV) y nuestros volúmenes físicos (PV). Se puede ver como una unidad administrativa en la que se engloban nuestros recursos. Hay que hacer notar que mientras un PV no se añada al VG, no podemos comenzar a usarlo.
* A su vez, un PV se divide en chunks de datos, que se conocen como PE (physical extents), que son del mismo tamaño que los PE del VG. Además, un LV se divide también en LE (logical extents), cuyo tamaño es el mismo para todos los LV del VG. Por ejemplo, teniendo como referencia la imagen del comienzo del artículo, supongamos que tenemos un VG llamado CASA, con 4MB de PE, al que queremos añadir un LV para /tmp/. Añadimos dos particiones de disco, /dev/sda4 y /dev/sdb3, que se llamarán PV1 y PV2 (se las puede renombrar a discreción del usuario). Los PV's pueden ser de distinto tamaño y por lo tanto, tendrán un número distinto de PE, por lo que supongamos que tenemos para PV1 99 PE's y para PV2 248 PE's. Ahora, podemos crear el LV que necesitamos, que puede ser de cualquier tamaño entre 1 y 347 (99+248) PE. De esta forma se crea una tabla que relaciona PE's y LE's y si, por ejemplo, escribimos 4 MB en el LE número 1 del LV, se corresponderán con el PE 51 de la PV1.
* La tabla que relaciona PE's y LE's, se llama tabla de mapeo, y la correspondencia puede ser de dos tipos:
** Directo: se asigna un rango de PE's a otro rango de LE's en orden. Por ejemplo, las LE's del número 1 al 99 se mapean sobre las PE's del 100 al 347 de PV2.
** Entrelazado: las LE's se entrelazan sobre las PE's de los volúmenes físicos, por ejemplo:
| Destino | Origen |
| Primer chunk de la LE1 | Primer chunk de la PV1 |
| Segundo chunk de la LE1 | Primer chunk de la PV2 |
| Tercer chunk de la LE1 | Segundo chunk de la PV1 |

## Instantáneas (snapshots)

Las instantáneas (snapshots) permiten al administrador crear un nuevo dispositivo que será una copia exacta del LV, congelada en algún punto del tiempo. Normalmente esto se realiza de forma automática, para no alterar el funcionamiento normal del sistema. Cuando la instantánea ha terminado, el administrador puede quitar el dispositivo sin mayor complicación. Además, no es necesario que los datos en el LV se encuentren en un estado consistente, ya que muchos sistemas de ficheros en el núcleo 2.6 lo realizan de forma automática. Una diferencia importante entre la versión 1 de LVM (LVM1 a partir de ahora) y la versión 2 (LVM2) es que en la primera, los snapshots eran de sólo lectura, mientras que en LVM2 son de lectura y escritura. ¿Cuál es la diferencia? En LVM1, se crea lo que se llama una tabla de excepciones, que se usa para mantener una lista de qué bloques en disco han cambiado. Si un bloque va a ser modificado en el origen, primero se copia en la instantánea, se marca como copiado en la tabla de excepciones y luego los nuevos datos se copian al volumen original. En LVM2, las instantáneas funcionan como en LVM1, pero con la característica de que si los datos se escriben en el snapshot (una vez montado), ese bloque se marca como usado en la tabla de excepciones y no se copia al volumen original. Esta característica es muy útil debido a que podemos crear nuestra instantánea, montarla y probar un programa o un nuevo navegador de ficheros. Si ocurre algo desastroso, la desmontamos, la borramos y volvemos a colocar el volumen original.

## Ejemplos

* Ya que podemos crear un PV sobre un dispositivo cualquiera de bloques, ya bien sean discos USB, raids, discos internos, cintas, etc., en esta serie de ejemplos nos centraremos en dispositivos del tipo /dev/sdaX, y bajo la versión 2 de LVM. No entraremos en la sintaxis de los comandos, ya que la ayuda que proporciona man es muy extensa y completa.

### Inicialización del dispositivo lógico

* Primero borramos la tabla de particiones e inicializamos las particiones de disco.
En este paso, tenemos creados dos volúmenes físicos (PVs).

### Creación de la VG

* Creamos el grupo lógico (VG) de nombre vg_wikipedia que contendrá las dos particiones que hemos creado anteriormente:

### Creación del LV

* Ahora crearemos un volumen lógico que llamaremos lv1_wikipedia:

### Creación del sistema de ficheros

* En este apartado, debemos crear el sistema de ficheros sobre el LV que acabamos de definir. En este ejemplo, crearemos un sistema de ficheros JFS:
* Recuerde agregar la entrada en /etc/fstab, de modo que al reiniciar, /mnt/wikipedia vuelva a estar disponible.