LVM es una implementación de un administrador de volumenes logicos para el kernel Linux. Se escribió originalmente en 1998 por Heinz Mauelshagen, que se basó en el administrador de volumenes 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)
RAID0 de volúmenes lógicos
LVM no implementa RAID1 o RAID5 , por lo que se recomienda usar software específico de RAID para estas operaciones, teniendo las LV por encima del RAID
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. Aún habiendo estimado correctamente cuanto 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 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. Balancear 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 éstos 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 los discos duros, particiones o cualquier otra "cosa" que parezca un disco duro (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 achivos (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 kernel 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.
Juntándolo todo
Un ejemplo concreto ayudará:
Supongamos que tenemos un grupo de volumen llamado VG1, este grupo de volumen tiene una extensión física de 4MB. Dentro de este grupo de volumen metemos 2 particiones, /dev/hda1 y /dev/hdb1. Estas particiones se convertirán en los volúmenes físicos PV1 y PV2 (se les puede dar nombres más significativos dependiendo del administrador). Los PV's son divididos en trozos de 4MB, y este será el tamaño de extensión del grupo de volumen. Los discos son de distintos tamaños y tendremos 99 extensiones en PV1 y 248 en PV2. Ahora podemos crear un volumen lógico, que puede tener el tamaño que queramos entre 1 y 347 (248 + 99) extensiones. Cuando creamos el volumen lógico se define un mapeado entre extensiones lógicas y físicas, ej. extensión lógica 1 podría mapearse en la extensión física 51 de PV1, los datos escritos en los primeros 4 MB del volumen lógico se escribirán en la extensión 51 de PV1.
Tareas Comunes
Inicializar un disco o particion para uso con lvm
pvcreate /dev/sda
pvcreate /dev/sda1
pvcreate /dev/sda5
Volumen de grupo
Como ya sabemos los volumenes de grupos abarcan particiones o discos, por lo tanto, si queremos crear un grupo de volumen llamado fundacion y agregar varias particiones hacemos lo siguiente:
vgcreate fundacion /dev/sda1 /dev/sda2 /dev/sdb1
Luego necesitamos activar el volume de grupo
vgchange -a y fundacion
para desactivarlo seria:
vgchange -a n fundacion
Para borrar el grupo fundacion escribimos:
vgremove fundacion
Nota: Esto borrara el volumen de grupo y todos su volumenes logicos.
Si queremos extender nuestro volumen de grupo, es decir, necesitamos agregar otra particion u otro disco, entonces digitamos
vgextend fundacion /dev/hdc1
Esto agrega la particion /dev/hdc1 a nuestro grupo de volumen fundacion.
Para ver los cambios escribimos:
vgdisplay fundacion
Y para ver las particiones activas y asociadas a un volumen de grupo:
pvdisplay
Borrando volumenes fisicos de un volumen de grupo
Si queremos sacar /dev/sdc1 de nuestro volumen de grupo fundacion, entonces :
vgreduce fundacion /dev/sdc1
Volumenes Logicos
Para crear un volumen logico de 1GB a partir de nuestro volumen de grupo fundacion hacemos:
lvcreate -L+1G -n lv1 fundacion
donde, lv1 es nuestro volumen logico a crear
Si quieres que el volumen logico este ubicado en una particion especifica del volumen de grupo fundacion entonces se hace de la siguiente manera:
lvcreate -L+1G -n lv1 fundacion /dev/sdb1
Luego de esto deberia crearse un volumen logico ubicado en /dev/fundacion/lv1 al cual le dariamos formato y luego montamos en nuestro filesystem:
mkfs.ext3 /dev/fundacion/lv1
Luego esta listo para ser montado donde deseemos
mount /dev/fundacion/lv1 /mnt
Extendiendo un volumen logico
Si necesitamos mas espacio en nuestro volumen logico lvm1 entonces lo extendemos a nuestra manera teniendo siempre en cuenta el espacio del volumen de grupo al que pertenecemos, Es decir, no podemos exceder el tamano de nuestro volumen logico mas alla del espacio libre que tiene nuestro volumen de grupo. Seria :
Primero desmontamos la particion, si esta montada:
umount /mnt/
lvextend -L+1G /dev/fundacion/lv1
Esto incrementa en 1Gb el volumen logico lv1. Adicional a esto, tenemos que decirle al sistema operativo que se cambio ese volumen:
e2fsck -f /dev/fundacion/lv1
para revisar el filesystem. Luego:
resize2fs /dev/fundacion/lv1.
Luego de esto ya podemos montar nuevamente la particion lv1 con los cambios realizados.
Reduciendo un volumen logico:
Nota: Puede ser muy peligroso realizar esta tarea.
Si nuestro volumen logico lv1 tiene 2Gb de espacio y deseamo reducirlo en 1gb, realizamos lo siguiente:
Desmontamos el volumen si esta montado.
umount /mnt
e2fsck -f /dev/fundacion/lv1
Luego le hacemos el resize a nivel del sistema operativo
resize2fs /dev/fundacion/lv1 1G
Esto lo que hace es decirle al SO que el volumen logico lv1 sera ahora de 1Gb
Desactivamos el volumen logico:
lvchange -a n /dev/fundacion/lv1
Finalmente lo reducimos:
lvreduce -L-1G /dev
Para confirmar que se ha hecho efectivo verificamos el size del volumen:
lvdisplay /dev/fundacion/lv1
Y confirmarlo en el sistema operativo
fdisk -s /dev/fundacion/lv1
Finalmente montamos nuevamente el volumen logico con el nuevo size:
mount /dev/fundacion/lv1 /mnt
Bibliografia:
http://es.wikipedia.org/wiki/LVM
http://www.tldp.org/HOWTO/LVM-HOWTO.html