Table of Contents

Guía rápida y completa de LVM (Logical Volume Manager)

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.

Volúmenes físicos (PV): Son los discos / particiones con sistema de archivos LVM. Se puede usar cualquier dispositivo de bloques.

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).

Áreas / extensiones físicas (PE): Los PV se dividen en bloques de datos conocidos como Áreas Físicas (PE), estas áreas físicas tienen todas el mismo tamaño dentro del Grupo de Volumen (VG) al que pertenecen. 4MB. Cada Área Física tiene un identificador que es único dentro del Volumen Físico (PV) al que pertenece.

Las Áreas / extensiones Lógicas (LE): No es más que una forma de indicar que Áreas Físicas (PE) forman un Volumen Lógico (LV). Son necesarias porque los identificadores de las Áreas Físicas (PE) sólo son únicos dentro del PV al que pertenecen, pudiendo repetirse en el Volumen Lógico (VG), las Áreas Lógicas (LE) sirven precisamente para solventar este problema, existiendo un mapeado 1:1 entre un Área Lógica (LE) y un Área Física (PE) de un Volumen Físico (PV).

Lectura recomendada: Red Hat (Logical Volume Manager Administration)

Crear dos dispositivos de bloque usando loopback

Para practicar sin usar discos / memorias físicas crearemos dispositivos de bloque (ficheros loop).

dd if=/dev/zero of=fichero0 bs=1M count=100
dd if=/dev/zero of=fichero1 bs=1M count=100
losetup /dev/loop1 fichero1
losetup /dev/loop0 fichero0

NOTA: Desactivar completamente un punto de acceso montado mediante ficheros loop. En caso contrario si se quiere reutilizar Linux dirá que ya están en uso y por lo tanto ocupado.

umount /dev/loop0
losetup -d /dev/loop0

Inicializar los dispositivos

Crea un área de descriptor de grupo de volumen (VGDA) al principio de los discos / dispositivos de bloque. Se perderán los datos contenidos en dichos dispositivos.

pvcreate /dev/loop0
pvcreate /dev/loop1

Crear un grupo de volumen

En LVM, el concepto de grupo de volúmenes (VG) incluye a varios volúmenes lógicos y/o físicos. Podemos crear un VG a partir de los dos dispositivos físicos creados anteriormente.

vgcreate mi_vg /dev/loop0 /dev/loop1

Activando/ Desactivando los VG

El comando vgchange puede cambiar varios atributos de los VG, su función principal es activarlos y desactivarlos (mediante el parámetro -a). Sólo cuando un VG está activo, se puede acceder a los volumenes lógicos que contiene. Si está desactivado (n) el VG, puede activarlo (y) de la siguiente manera:

vgchange -a y mi_vg

Si estamos utilizando ficheros de loopback, necesitamos volver a crear los dispositivos de bloque

losetup /dev/loop0 fichero0
losetup /dev/loop1 fichero1
vgchange -a y prueba_vg

Eliminar un VG

No debe tener LV en su interior y primero se debe desactivar.

vgchange -a n my_volume_group
vgremove mi_vg

NOTA: Asegúrate de que el volumen físico no está siendo usado por ningún volumen lógico usando el comando 'pvdisplay'. Si el volumen físico está todavía en uso tendrás que migrar los datos a otro volumen físico usando pvmove.

Eliminar un LV

No tiene que estar montado para poder ser eliminado.

lvremove /dev/prueba_vg/congelado

Información sobre los PV y los LV.

pvdisplay
lvdisplay

Migrar los datos a otro PV para vaciar de contenido un determinado PV.

# Sintaxis: pvmove [-n volumen_lógico] volumen_físico_origen [volumen_fisico_destino ...]
pvmove -n /dev/prueba_vg/primer_LV /dev/loop1 /dev/loop0

volumen_físico_origen: Indica el Volumen Físico que contiene las Áreas Físicas que se desean migrar.

volumen_físico_destino: Designa uno o varios Volúmenes Físicos a los que migrar las Áreas Físicas, si no se indica este último parámetro, entonces pvmove lo pondrá donde considere oportuno.

volumen_lógico: Sirve para concretar que sólo deseamos migrar las Áreas Físicas correspondientes a un determinado Volumen Físico, ya que de lo contrario, intentaría mover todos los Volúmenes Lógicos que haya en el Volumen Físico.

Esto se usa para que un dispositivo o partición pueda salir del PV, entonces, los datos se deben reorganizar primero para que quede limpio, en caso contrario se perderían datos.

NOTA: Para saber si se puede o no mover datos, tenemos que mirar con el comando pvdisplay cada unidad cuantos PE tiene libres y cuantos ocupados. Se recomienda hacer copias de seguridad antes de hacer migraciones.

Eliminar un PV de un VG

Para eliminar un disco o partición de un grupo de volumenes, es necesario que haya las mismas extensiones físicas (PE) libres en el VG como ocupadas en el PV que se quiere retirar. Si no hay extensiones físicas libres, se debe instalar un nuevo disco / partición e inicializarlo dentro del VG para que puedan pasarse los datos del disco que se desea retirar.

Identificamos el PV que se quiere retirar (sdb1).

pvs -o+pv_used
  PV         VG         Fmt  Attr PSize   PFree Used   
  /dev/sda4  Volgroup00 lvm2 a--  736,02g    0  736,02g
  /dev/sdb1  Volgroup00 lvm2 a--  232,88g    0  232,88g
 
pvdisplay
 pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sda4
  VG Name               Volgroup00
  PV Size               736,02 GiB / not usable 564,00 KiB
  Allocatable           yes (but full)
  PE Size               4,00 MiB
  Total PE              188420
  Free PE               0            <-------------------
  Allocated PE          188420
  PV UUID               yBGKWg-scED-yWi9-sTxo-eRxR-NcjE-8UZebC
 
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               Volgroup00
  PV Size               232,88 GiB / not usable 1,18 MiB
  Allocatable           yes (but full)
  PE Size               4,00 MiB
  Total PE              59618
  Free PE               0            <-------------------
  Allocated PE          59618
  PV UUID               2I1VnJ-x9cN-JVc5-43FK-VO1V-Eneu-v7eIb6

Como en este caso no hay extensiones disponibles, se agrega un nuevo disco (sdd) y se crea una partición (sdd1) igual o mayor al tamaño del disco que se desea expulsar del VG, por ejemplo por mal funcionamiento. Crear la partición no es algo obligatorio para obtener extensiones lógicas libres, pero para nuestro caso se usará una partición ya que no está en mente utilizar todo el disco duro para el grupo de volúmenes Volgroup00.

pvcreate /dev/sdd1
vgextend Volgroup00 /dev/sdd1
  Volume group "Volgroup00" successfully extended
 
  pvdisplay 
  ...   
  --- Physical volume ---
  PV Name               /dev/sdd1
  VG Name               Volgroup00
  PV Size               465,00 GiB / not usable 4,00 MiB
  Allocatable           yes 
  PE Size               4,00 MiB
  Total PE              119039
  Free PE               119039            <-------------------
  Allocated PE          0                 <-------------------
  PV UUID               MZNzzT-eGLJ-aWOr-t5O6-jA8J-jkb9-b3fFLJ
 
pvs -o+pv_used
  PV         VG         Fmt  Attr PSize   PFree   Used   
  /dev/sda4  Volgroup00 lvm2 a--  736,02g      0  736,02g
  /dev/sdb1  Volgroup00 lvm2 a--  232,88g      0  232,88g
  /dev/sdd1  Volgroup00 lvm2 a--  465,00g 465,00g      0 

Movemos los datos del PV /dev/sdb1 al nuevo y disponible /dev/sdd1.

pvmove /dev/sdb1 /dev/sdd1
  /dev/sdb1: Moved: 0,0%
  /dev/sdb1: Moved: 0,5%
 
pvs -o+pv_used
  PV         VG         Fmt  Attr PSize   PFree   Used   
  /dev/sda4  Volgroup00 lvm2 a--  736,02g      0  736,02g
  /dev/sdb1  Volgroup00 lvm2 a--  232,88g 232,88g      0 
  /dev/sdd1  Volgroup00 lvm2 a--  465,00g 232,11g 232,88g

Eliminamos el PV /dev/sdb1 del grupo de volúmenes Volgroup00.

vgreduce Volgroup00 /dev/sdb1
  Removed "/dev/sdb1" from volume group "Volgroup00"

pvs -o+pv_used
  PV         VG         Fmt  Attr PSize   PFree   Used   
  /dev/sda4  Volgroup00 lvm2 a--  736,02g      0  736,02g
  /dev/sdb1             lvm2 ---  232,88g 232,88g      0 
  /dev/sdd1  Volgroup00 lvm2 a--  465,00g 232,11g 232,88g

Ya se puede retirar el disco duro sin problemas. Lógicamente, si al apagar el sistema, se intercambian los cables de los discos duros, se puede tener de nuevo el disco que actualmente es /dev/sdd, como /dev/sdb.

Añadiendo volúmenes físicos (PV) inicializados a un grupo de volúmenes (VG)

vgextend mi_vg /dev/loop2

Crear volumen lógico LV

El volumen físico es opcional, pero se puede indicar si queremos, uno o varios.

lvcreate -L 10M -n primer_lv mi_vg /dev/loop1

Crear un LV que use el espacio total de un VG

lvcreate -n mylv --extents 100%FREE testvg

Otra opción es usar vgdisplay para buscar el tamaño total de PE y ejecutar lo siguiente.

vgdisplay testvg | grep "Total PE" --> Total PE              10230
lvcreate -l 10230 testvg -n mylv

Utilizar un LV

Simplemente hay que darle formato con mkfs u otra aplicación.

mkfs.ext3 /dev/mi_vg/primer_lv

Añadiendo volúmenes físicos a un grupo de volumen existente

vgextend my_volume_group /dev/hdc1
Error: Couldn't find device with uuid XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX.
vgextend VolGroup /dev/sdb1
  Couldn't find device with uuid yJ20lV-DQso-EUlv-TNRM-Ud03-Akr6-RPP4HS.
  Cannot change VG VolGroup while PVs are missing.
  Consider vgreduce --removemissing.

Solución: Eliminar el volumen físico “no encontrado” del grupo de volúmenes, para que siga funcionando como anteriormente. Una vez esté como al principio podemos volver a intentar la tarea que fuera.

vgextend VolGroup /dev/sdb1
  Couldn't find device with uuid yJ20lV-DQso-EUlv-TNRM-Ud03-Akr6-RPP4HS.
  Cannot change VG VolGroup while PVs are missing.
  Consider vgreduce --removemissing.
 
pvscan
  Couldn't find device with uuid yJ20lV-DQso-EUlv-TNRM-Ud03-Akr6-RPP4HS.
  PV /dev/sda2        VG VolGroup        lvm2 [19.51 GiB / 0    free]
  PV unknown device   VG VolGroup        lvm2 [4.66 GiB / 4.66 GiB free]    <--------
  PV /dev/sdb1                           lvm2 [4.66 GiB]
  Total: 3 [28.82 GiB] / in use: 2 [24.16 GiB] / in no VG: 1 [4.66 GiB]
 
vgreduce --removemissing --verbose VolGroup
    Finding volume group "VolGroup"
  Couldn't find device with uuid yJ20lV-DQso-EUlv-TNRM-Ud03-Akr6-RPP4HS.
    There are 1 physical volumes missing.
    Trying to open VG VolGroup for recovery...
    Couldn't find device with uuid yJ20lV-DQso-EUlv-TNRM-Ud03-Akr6-RPP4HS.
    There are 1 physical volumes missing.
    Archiving volume group "VolGroup" metadata (seqno 4).
    Removing PV with UUID yJ20lV-DQso-EUlv-TNRM-Ud03-Akr6-RPP4HS from VG VolGroup <--------
    Creating volume group backup "/etc/lvm/backup/VolGroup" (seqno 5).
  Wrote out consistent volume group VolGroup
 
pvscan
  PV /dev/sda2   VG VolGroup        lvm2 [19.51 GiB / 0    free]
  PV /dev/sdb1                      lvm2 [4.66 GiB]
  Total: 2 [24.17 GiB] / in use: 1 [19.51 GiB] / in no VG: 1 [4.66 GiB]

Instantánteas (Snapshots)

Comprobar que se tienen los módulos del núcleo cargados.

dmsetup targets
 mirror           v1.12.0
 striped          v1.4.1
 linear           v1.1.0
 error            v1.0.1
modprobe dm-snapshot
dmsetup targets
 snapshot-merge   v1.1.0 <-----------
 snapshot-origin  v1.7.1 <-----------
 snapshot         v1.10.0
 mirror           v1.12.0
 striped          v1.4.1
 linear           v1.1.0
 error            v1.0.1
lvcreate -L20M -s -n congelado /dev/Volgroup00/lv_root 
  Logical volume "congelado" created.

El concepto de instantánea es similar a los enlaces simbólicos que conocemos, cuando se crea un enlace simbólico a un archivo no se realiza una copia del archivo real, sino sólo una referencia al mismo. Los volúmenes lógicos guardan la información de forma muy similar y se compone de dos partes esenciales: Punteros de metadatos (Información sobre donde están los bloques de datos) y Bloques de datos.

Cuando se crea una instantánea, simplemente se crea una copia de todos los punteros de metadatos de un volumen lógico. Los metadatos no consumen demasiado espacio, por lo que una instantánea de 5 Mb puede referenciar un volumen de 2GB. El volumen de instantánea sólo aumenta cuando los datos del volumen original a los que referencia crece, cada vez que se elimina o se crea un fichero se crea una copia de este en la instantánea. La recomendación es crear instantáneas con un margen del 5 al 10% del tamaño del volumen lógico original.

Por eso, una vez se crea la instantánea, se debe montar, hacer el backup de la misma, desmontarla y eliminarla. No son un proceso de backup, si no una ayuda para hacer copias de seguridad del disco en caliente en un determinado momento.

Fusionar / Restablecer / Restaurar una instantánea (Snapshots)

Para montar la instantanea para consultar o hacer un backup.

mount /dev/Volgroup00/congelado /mnt/XXXX/
# Listar las instantaneas: lvdisplay

Fusionar / Restablecer / Restaurar una instantánea (Snapshots)

umount /dev/Volgroup00/congelado # En el caso de que esté montada
lvconvert --merge /dev/Volgroup00/congelado

Si la instantánea hace referencia al sistema de ficheros raíz, este no se podrá desmontar mientras esté el sistema encendido, por lo que se mostrará un mensaje como el siguiente avisando de que se restablecerá la instantánea después de reiniciar. Este suele ser el mensaje cuando se trata de particiones raíz.

  Logical volume Volgroup00/lv_root contains a filesystem in use.
  Can't merge over open origin volume.
  Merging of snapshot Volgroup00/congelado will occur on next activation of Volgroup00/lv_root.

Problema al fusionar una snapshot (No aplicable a particiones raíz).

Can't merge over open origin volume
Can't merge when snapshot is open
Merging of snapshot XXX will start next activation.

Solución: La causa suele ser que el snapshot está montada, se debe desmontar (umount) y probar de nuevo.

Problema al fusionar una snapshot (No aplicable a particiones raíz).

Can't merge over open origin volume
  Merging of snapshot XXX will start next activation.

Solución:

lvchange -an <logical volume path> # Desactivamos
lvchange -ay <logical volume path> # Activamos
# Ahora se debe intentar de nuevo fusionar la instantánea.

Típico error al querer restaurar una instantánea.

Volume group "XXXX" has insufficient free space (0 extents): XXX required.

Solución: Generar espacio (PE libres) en ese grupo de volúmenes mediante nuevos dispositivos de almacenamiento o bien, reduciendo los volúmenes. Si hiciera referencia a una instantánea del sistema raíz se tendría que usar un LiveCD, ya que los sistemas de ficheros cuando están montados, dependiendo de cuales, se pueden ampliar sin desmontar, pero no reducirlos.

Ejemplo de reducción de volumen con un LiveCD

Primero se debe activar el grupo de volúmenes desde el LiveCD.

LiveCD# pvdisplay                                      (Prestamos especial atención al nombre del grupo de volúmenes "VG Name")
LiveCD# lvchange -ay VolGroup                          (Activamos el VG)
LiveCD# e2fsck -f /dev/VolGroup/lv_root                (En el caso de ser un sistema de ficheros EXT3.)
LiveCD# lvresize -r -L -2G /dev/VolGroup/lv_root       (Reducimos 2Gb de su tamaño)
LiveCD# lvreduce -r -L 2G /dev/VolGroup/lv_root        (Reduce el tamaño de /dev/VolGroup/lv_root a 2 Gb, NO es lo mimso que lo anterior.)

Si intentamos ejecutar el comando lvresize en una unidad montada como puede ser “/” pese al aviso, lo más probable es que el sistema no arranque (kernel panic).

WARNING: Reducing active and open logical volume to 16.76 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv_root? [y/n]:

Extendiendo / Expandiendo un volumen lógico

Si se extiende un volumen lógico instalando / utilizando una nueva unidad de almacenamiento, primero debemos particionarla (cfdisk), asignarle un sistema de ficheros LVM y posteriormente incluirla dentro de nuestro grupo de volúmenes. Una vez realizado ese proceso, ya podremos usar ese espacio para cualquiera de los volumenes lógicos mediante la orden “lxextend”.

cfdisk /dev/sdb
pvcreate /dev/sdb1
vgextend VolGroup /dev/sdb1
lvextend -r -L+500M /dev/prueba_vg/segundo_LV
lvextend -r -l+100%FREE /dev/VolGroup/lv_root

Hay muchas formas de especificar la cantidad de espacio que se quiere extender (Mb, Gb, PE, %FREE, etc…)

NOTA: Se puede extender el directorio raiz con ext3/ext4 en caliente.

Sintaxis lvextend

lvextend -l, --extents [+]LogicalExtentsNumber[%{VG|LV|PVS|FREE|ORIGIN}] 
lvextend -L, --size [+]LogicalVolumeSize[bBsSkKmMgGtTpPeE]

De no usar la opción “-r” se debe extender el sistema de ficheros posteriormente: resize2fs (ext) / xfs_growfs (xfs) / resize_reiserfs (reiserfs) / …

resize2fs /dev/prueba_vg/segundo_LV Ext (Siempre desmontado, ext4 puede hacerse montado)

resize_reiserfs -f /dev/prueba_vg/segundo_LV Reiser (Montado / desmonado)

xfs_growfs /media/puntodemontaje Xfs (Debe estar montado y especificar punto de montaje)

mount -o remount,resize /home Jfs (Debe estar montado y especificar punto de montaje)

NOTA: Al usar resize2fs es probable que nos pida antes de redimensionar el sistema, ejecutar un e2fsck -f sobre el LV.

Extendiendo / Expandiendo un volumen físico (PV)

En LVM cabe la posibilidad de querer aumentar el tamaño de un PV, por ejemplo en los supuestos en los que el disco de una máquina virtual ha sido agrandado o bien porque la partición donde teníamos nuestro sistema LVM ha sido redimensionada. Supongamos un ejemplo donde /dev/sda4 tiene un tamaño limitado pero en el disco hay espacio libre. Si el sistema utiliza MBR, no se podrían poner más particiones, por lo que la única solución sería redimensionar dicha partición, extender el PV y posteriormente extender también el LV o bien crear otro LV dentro del PV previamente extendido.

NOTA: Como es lógico no se pueden tener dos VG en un mismo PV.

Redimensionar una partición en GNU/Linux / disco duro virtual. Una ver redimensionado, la forma más fácil de adaptarlo al nuevo tamaño es borrar la partición que se desea expandir con cfdisk y crear otra nueva que ocupe el nuevo tamaño, seleccionando las mismas opciones que tenía la anterior (boot, tipo, etc). Si se trata de la partición raíz se debe reiniciar el sistema.

Extender el PV para que ocupe ese nuevo tamaño adquirido al redimensionar la partición / VDI (/dev/sda4).

Muy útil cuando se redimensionan particiones o discos duros virtuales, por ejemplo de VirtualBox.

Espacio ocupado por el grupo de volumen PV en /dev/sda4.

pvs
  PV         VG         Fmt  Attr PSize   PFree
  /dev/sda4  Volgroup00 lvm2 a--  186,26g    0

Como hemos redimensionado la partición con cfdisk o cualquier otro software, indicamos al PV que ocupe todo el nuevo espacio físico disponible.

pvresize /dev/sda4 
  Physical volume "/dev/sda4" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

Como podemos ver, ahora el PV sí engloba todo el espacio utilizable en /dev/sda4.

/home/maria pvs
  PV         VG         Fmt  Attr PSize   PFree  
  /dev/sda4  Volgroup00 lvm2 a--  736,02g 549,76g

El siguiente paso sería extender también el LV que queramos (leer) o bien crear otro LV nuevo, el cual incluso podemos cifrar siguiendo las siguientes instrucciones.

Crear un volumen lógico cifrado

# Creamos el LV indicanco que use el espacio libre en el grupo de volumen Volgroup00 (Por ejemplo).
lvcreate -n cifrado --extents 100%FREE Volgroup00 
# Comprobamos que se haya creado.
lsblk 
 
# Ciframos y formateamos: http://www.busindre.com/cifrar_particiones_en_gnu_linux_facil
cryptsetup luksFormat /dev/Volgroup00/cifrado 
cryptsetup luksUUID /dev/Volgroup00/cifrado
cryptsetup luksOpen /dev/Volgroup00/cifrado cifrado
mkfs.xfs /dev/mapper/cifrado 

Reconocer un disco duro / partición instalado en caliente (hotplugged)

NOTA: Esto es independiente de LVM, es decir, se use o no LVM en el disco duro se pueden seguir estos pasos para intentar que el sistema lo reconozca. Se presentan varias opciones a continuación.

##### Usando /sys/class/scsi_host (Util para reconocer nuevos discos / particiones)
 
# Se listan todos los posibles "scan" para revisar.
 ls /sys/class/scsi_host/
host0  host1  host2  host3  host4  host5
 
echo "- - -" > /sys/class/scsi_host/host0/scan
echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan
...
 
# Usando los ficheros rescan
 
echo 1 > /sys/block/sdX/device/rescan
 
##### Comando partprobe (Útil para reconocer particiones cuando no han sido todavía reconocidas por el kernel).
partprobe
 
##### Comando partx (Útil para reconocer particiones cuando no han sido todavía reconocidas por el kernel).
 
# Lista las particiones del disco
partx -s /dev/sdb
# Forzar que el kernel kernel reconozca todas las paticiones de /dev/sdb.
partx -v -a /dev/sdb

Una vez reconocido el disco/partición, si queremos utilizarlo para expandir el espacio de / debemos hacer lo siguiente (Pasos vistos y explicados anteriormente en esta guía).

ls /sys/class/scsi_host
host0 host1 host2
 
echo "- - -" > /sys/class/scsi_host/host0/scan
echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan
fdisk -l # Debemos ver el nuevo disco duro virtual.
 
cfdisk /dev/sdb # Creamos la partición (/dev/sdb1)
lvscan # Se comprueba el espacio actual del LV.
 
pvcreate /dev/sdb1
vgextend VolGroup /dev/sdb1
lvextend -r -l+100%FREE /dev/VolGroup/lv_root
lvscan # Se comprueba el nuevo espacio actual del LV.

Simular retirada / conexión de un disco duro

echo offline > /sys/block/sda/device/state   # Pone el disco inaccesible.
echo running > /sys/block/sda/device/state   # Vuelve a poner el disco accesible.
 
# Borrar un disco (Se usa antes de sacarlo del servidor)
# echo 1 > /sys/block/sda/device/delete

Reduciendo un volumen lógico

Al contrario que al extender no se puede hacer con sistemas de ficheros montados.

Para reducir un volumen lógico se debe antes reducir el tamaño del sistema de ficheros, eso lo podemos hacer de forma manual o bien con la opción “-r” (Utiliza fsdam) para que se encargue lvreduce de reducir el sistema de ficheros (Recomendado)

lvreduce -r -L-5G /dev/myvg/homevol  

De hacerlo manualmente hay que especificar el nuevo tamaño del sistema de ficheros resultante en Kb (1 bloque → 1 kbyte), NO el tamaño que se quiere reducir

resize2fs /dev/prueba_vg/segundo_LV 68157440
# Si era LV de 70, ahora le sistema de ficheros es de 65, debemos quitarle 5 al LV
lvreduce -L-5G /dev/myvg/homevol 

Reiserfs.

lvreduce -r -L-1G /dev/myvg/homevol
resize_reiserfs -s-1G /dev/myvg/homevol
lvreduce -L-1G /dev/myvg/homevol  

XFS / JFS: No se puede reducir actualmente: Leer

NOTA: De hacerlo manualmente, resize2fs nos avisa si hemos puesto un numero demasiado pequeño indicando el mínimo.

resize2fs: New size smaller than minimum (20477). 

Mover grupos de volumenes a otros sistemas

Exportar:

  1. Se desmontan las unidades montadas.
  2. Se desactiva. (vgchange -an design)
  3. Exportamos el volumen. (vgexport design)
  4. Apagamos y sacamos los discos.

Importar:

  1. Conectamos los discos y escribimos el comando pvscan para encontrar el disco con el VG “design
  2. Importamos (indicando el nombre del VG) todo o bien lo que nos interese: vgimport design /dev/sdb1 /dev/sdb2
  3. Activamos: vgchange -ay design
  4. Montamos como queramos / como estaba antes: mount /dev/design/users /mnt/design/users

Dividir un grupo de volumen para crear un nuevo

Útil cuando tenemos todos los discos o particiones ocupados por el mismo. Tenemos que tener el PV limpio, podemos usar pvmove para sacar los datos a otos pv. Se debe desmontar antes el sistemas de ficheros y desactivar.

Supuesto: Mover sdg2 del vg “caracola” a “design”.

Opción 1

vgsplit caracola design /dev/sdg2

Opción 2 (vgsplit nos ahorra el ejecutar estos dos comandos)

vgreduce dev /dev/sdg2       # Elimina el PV
vgextend design /dev/sdg2    # Lo agraga a otro VG

Montar un disco duro con LVM desde un LiveCD

Listamos los volúmenes físicos y grupos de volumenes de los discos duros conectados.

pvscan
PV /dev/sda2 VG VolGroup00 lvm2 [74.41 GB / 32.00 MB free]
Total: 1 [74.41 GB] / in use: 1 [74.41 GB] / in no VG: 0 [0 ]
vgscan
Reading all physical volumes. This may take a while...
Found volume group "VolGroup00" using metadata type lvm2

Activamos todos los grupos de volumenes disponibles.

vgchange -a y
2 logical volume(s) in volume group "VolGroup00" now active

Ejecutamos lvscan para listar todos los volúmenes lógicos existentes para saber cual montar.

lvscan
ACTIVE '/dev/VolGroup00/LogVol00' [72.44 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol01' [1.94 GB] inherit

Montamos por ejemplo el volumen lógico LogVol00 en /mnt/volumen0

mount /dev/VolGroup00/LogVol00 /mnt/volumen0

Comandos útiles que muestran información

pvscan (-u muestra el uuid) # Dice los tamaños usados de los discos / particiones del VG
lvs
lvm
pvdisplay
vgdisplay
lvdisplay
lsblk

Identificar el VG y LV al que pertenece un determinado fichero

df -T /home/maria/jondo_linux.tar.bz2 |tail -n 1 |awk '{print $1}'
/dev/mapper/Volgroup00-lv_root

Conocer el tipo de volumen lógico utilizado (linear / striped)

lvs --segments
  LV      VG         Attr       #Str Type   SSize  
  cifrado Volgroup00 -wi-a-----    1 linear 549,76g
  lv_root Volgroup00 -wi-ao----    1 linear 184,00g
  lv_root Volgroup00 -wi-ao----    1 linear 232,88g
  lv_swap Volgroup00 -wc-ao----    1 linear   2,26g

Conocer el tamaño de las areas (extents)dentro de un grupo de volúmenes

pvdisplay | grep -i "PV Name\|VG Name\|PE Size"
  PV Name               /dev/sda4
  VG Name               Volgroup00
  PE Size               4,00 MiB <-------
  PV Name               /dev/sdb1 
  VG Name               Volgroup00
  PE Size               4,00 MiB <-------

Como sabemos, existen dos sistemas de medidas para representar múltiplos de bits (o bytes). El SI (sistema internacional de unidades) entiende que un kilobyte son 1000 bytes, mientras que en sistema binario se entienden que son 1024. Por ello, a la medida binaria, en este caso, se le llama Kibibyte, para distinguirlos.

Ocurre lo mismo con los MiB (mebibytes) y Gib (gibibytes), que no son exactamente iguales a los MB (megabytes) y GB (gigabytes).

Identificar y ubicar las areas lógicas y físicas de los volúmenes lógicos

Conocer el número y ubicación física de las áreas (extents) lógicas y físicas de los LVs.

lvdisplay --maps |egrep 'Physical|LV Name|Type'
...
--- Segments ---
  Logical extents 0 to 47103:
    Type		linear
    Physical volume	/dev/sda4
    Physical extents	0 to 47103
   
  Logical extents 47104 to 106721:
    Type		linear
    Physical volume	/dev/sdb1
    Physical extents	0 to 59617

Identificar los bloques / áreas que forman un fichero en disco

Si el volumen fue definido como linear y no “striping”, es muy difícil encontrar ficheros que tengan partes en más de un dispositivo físico.

Obtener la disposición de bloques de un archivo concreto utilizando la utilidad hdparm.

hdparm --fibmap /home/maria/Desktop/World_of_Goo_JC4D2G-1.41_Linux.zip 

/home/maria/Desktop/World_of_Goo_JC4D2G-1.41_Linux.zip:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0  186384384  186400767      16384
     8388608  187678720  187826175     147456
    83886080  187858944  187891711      32768
   100663296  188104704  188186623      81920
   142606336  188203008  188268543      65536
   176160768  188334080  188378919      44840

Interpretando y entendiendo correctamente los campos, se puede calcular el tamaño del fichero en bytes de manera simple: “(44840 x 512)+176160768”.

Calcular los byte_offset también sería una tarea trivial, “176160768 = 65536 x 512” y ya tenemos los bytes que ocupa esa parte, ahora se debe sumar los bytes que ocupaban las partes anteriores y ya tenemos el byte donde comienza dicha parte “142606336 + (65536 x 512)”.

Obtener la disposición de áreas de un archivo concreto utilizando la utilidad hdparm.

debugfs 1.42.13 (17-May-2011)
debugfs:  stat /home/cacas/Desktop/World_of_Goo_JC4D2G-1.41_Linux.zip 
Inode: 270599   Type: regular    Mode:  0600   Flags: 0x80000
Generation: 3352783085    Version: 0x00000000:00000001
User:  1000   Group:  1000   Size: 199116706
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 388912
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x55c3c0c0:2b8593ac -- Thu Aug  6 22:17:04 2015
 atime: 0x55c3c08f:e4ee4cf0 -- Thu Aug  6 22:16:15 2015
 mtime: 0x55c3c0c0:2b8593ac -- Thu Aug  6 22:17:04 2015
crtime: 0x55c3c08f:e4ee4cf0 -- Thu Aug  6 22:16:15 2015
Size of extra inode fields: 28
EXTENTS:
(ETB0):1081694, (0-2047):23298048-23300095, (2048-20479):23459840-23478271, (20480-24575):23482368-23486463, (24576-34815):23513088-23523327, (34816-43007):23525376-23533567, (43008-48612):23541760-23547364
/home/maria/Desktop/World_of_Goo_JC4D2G-1.41_Linux.zip:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0  186384384  186400767      16384   ---> 186400767 - 186384384 + 1 = 16384   ----> ((23300095 x 8) +8) - (23298048 x 8) ----> ((2047 - 0) x 8 ) + 8  -------> (8388608 - 0) / 512 
     8388608  187678720  187826175     147456   ---> 187826175 - 187678720 + 1 = 147456  ----> ((23478271 x 8) +8) - (23459840 x 8) ----> ((20479 - 2048) x8 ) + 8  ----> (83886080 - 8388608) / 512
    83886080  187858944  187891711      32768   ---> 187891711 - 187858944 + 1 = 32768   ----> ((23486463 x 8) +8) - (23482368 x 8) ----> ((24575 - 20480) x 8 ) +8 ----> (100663296 - 83886080) / 512
   100663296  188104704  188186623      81920   ---> 188186623 - 188104704 + 1 = 81920   ----> ((23523327 x 8) +8) - (23513088 x 8) ----> ((34815 - 24576) x 8 ) +8 ----> (142606336 - 100663296) / 512
   142606336  188203008  188268543      65536   ---> 188268543 - 188203008 + 1 = 65536   ----> ((23533567 x 8) +8) - (23525376 x 8) ----> ((43007 - 34816) x 8 ) +8 ----> (176160768 - 142606336) / 512
   176160768  188334080  188378919      44840   ---> 188378919 - 188334080 + 1 = 44840   ----> ((23547364 x 8) +8) - (23541760 x 8) ----> ((48612 - 43008) x 8 ) +8

NOTA: Se debe sumar 1 ya que el sector final debe ser también contabilizado. En el caso de utilizar sectores físicos, se debe sumar 8 por ese mismo motivo. El valor 8 se debe a que “debugfs” utiliza el tamaño de sector físico (4096 bytes) y no el lógico (512 bytes), por tanto 8 es el resultado de dividir 4096 entre 512.

Comentar que es perfectamente posible que las partes que conforman un determinado fichero, ni tienen que ser decuenciales ni tienen por qué estar ordenadas de manera ascendente. Veamos un ejemplo.

hdparm --fibmap /home/cacas/archivo.txt 

/home/mamria/archivo.txt:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0     933888     966655      32768
    16777216     884736     917503      32768 <----------
    33554432     983040    1015807      32768
    50331648    1097728    1163263      65536

Ubicar ficheros cuando el volumen lógico ocupa múltiples discos

Para averiguar en que PV se encuentra un determinado fichero, se puede identificar mediante un hash alguna de sus partes y luego buscar una coincidencia en cada disco físico que ocupado por el volumen.

Lo primero, es identificar qué volumenes físicos están en uso por el volumen lógico. Para el ejemplo, el volumen lógico “lv_root” está repartido entre sda4 y sdb1, por los que deberemos buscar en esos dos VPs.

lvs -o +seg_pe_ranges,vg_extent_size
  LV      VG         Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert PE Ranges              Ext  
  cifrado Volgroup00 -wi-a----- 549,76g                                                     /dev/sda4:47682-188419 4,00m
  lv_root Volgroup00 -wi-ao---- 416,88g                                                     /dev/sda4:0-47103      4,00m
  lv_root Volgroup00 -wi-ao---- 416,88g                                                     /dev/sdb1:0-59617      4,00m
  lv_swap Volgroup00 -wc-ao----   2,26g                                                     /dev/sda4:47104-47681  4,00m

#################

pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sda4
  ...
  Allocated PE          188420 -------> 0-47103 (/ )  47104-4768 (swap)  47682-188419 (cifrado)
  ... 
  --- Physical volume ---
  PV Name               /dev/sdb1
  Total PE              59618 -------> 0-59617 (/ )
  ...

Identificamos la ubicación de las distintas partes del fichero “jondo_linux.tar.bz2”

hdparm --fibmap jondo_linux.tar.bz2
jondo_linux.tar.bz2:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0    8314880    8318975       4096
     2097152   29638656   29642751       4096
     4194304   44793856   44802047       8192
     8388608  694616064  694625847       9784

Obtenemos el hash perteneciente a los primeros 2 MiB del fichero.

dd if=jondo_linux.tar.bz2 bs=512 skip=0 count=4096 | md5sum
4096+0 registros leídos
4096+0 registros escritos
2097152 bytes (2,1 MB, 2,0 MiB) copied, 0,00767018 s, 273 MB/s
6870dcb82fa7aa7077936036f0b03bec  -

Obtenemos el hash perteneciente a los primeros 2 MiB del fichero pero usando el volumen lógico donde se ubica.

dd if=/dev/mapper/Volgroup00-lv_root bs=512 skip=8314880 count=4096 | md5sum
4096+0 registros leídos
4096+0 registros escritos
2097152 bytes (2,1 MB, 2,0 MiB) copied, 0,0261066 s, 80,3 MB/s
6870dcb82fa7aa7077936036f0b03bec  -

Obtenemos el espacio ocupado por los metadatos y otra información de LVM al principio del disco.

pvck -d -v /dev/sda4 
    Scanning /dev/sda4
  Found label on /dev/sda4, sector 1, type=LVM2 001
  Found text metadata area: offset=4096, size=1044480  <----------------------------------
    Found LVM2 metadata record at offset=34304, size=2048, offset2=0 size2=0
    Found LVM2 metadata record at offset=32256, size=2048, offset2=0 size2=0

Este área de información empieza en el ofsset 4096 y ocupa 1044480 bytes. Si se divide 1044480 entre 512, se obtienen 2040 sectores, pero hay que sumarle los otros 8 (4096/512).

Ahora preguntamos por esa parte, en la partición /dev/sda4 incluyendo ese “desplazamiento” de información LVM al principio de disco.

dd if=/dev/sda4 bs=512 skip=$(8314880 + 2048) count=4096 | md5sum
4096+0 registros leídos
4096+0 registros escritos
2097152 bytes (2,1 MB, 2,0 MiB) copied, 0,0220594 s, 95,1 MB/s
6870dcb82fa7aa7077936036f0b03bec  -

Localizado, se encuentra en sda4.

NOTA: Si se utilizan discos de diferente tamaño y se identifican el número de sectores de cada uno de ellos, en algunos casos se identificará rápidamente el disco que contiene el fichero, ya que este puede estar ubicado en un bloque que solo esté presente en uno de los dos discos (que coincidiría con el de mayor tamaño.) Si se tiene el volumen lógico usando mapeado lineal repartido en un disco de 3Gb y otro de 4T, la parte correspondiente a 8314880 nunca podría estar en el disco de 3Gb (6291456 sería el último bloque que podría usarse).

Relación entre mapeado de dispositivo (dm-0, dm-1, etc) y los volúmenes lógicos.

Si se está usando LVM, es común encontrarse en métricas de disco o simplemente en la salida de comandos como iostat, los llamados mapeados de dispositivo (dm-0, dm-1, etc). Con estos comandos se puede averiguar a qué volumen lógico se está refiriendo un mapeo dm-x“ en concreto, se muestran dos opciones.

dmsetup ls
luks-20b2aaf7-9353-4732-8f62-ff83bb5e54b7	(254:3)   <--- dm-3
Volgroup00-lv_swap	(254:1)                           <--- dm-1
Volgroup00-lv_root	(254:0)                           <--- dm:0
Volgroup00-cifrado	(254:2)                           <--- dm:2
 
lvdisplay|awk  '/LV Name/{n=$3} /Block device/{d=$3; sub(".*:","dm-",d); print d,n;}'
dm-0 lv_root
dm-1 lv_swap
dm-2 cifrado

Enlaces de interés

Nociones básicas sobre tamaño de bloque
Red Hat (Logical Volume Manager Administration)
Recuperación de Volúmenes físicos / lógicos
http://linuxalbacete.org (Muy recomendable).
http://www.vilecha.com/hellguest/lvm2_info.asp
http://www.olafrv.com/wordpress/wp-content/uploads/2013/08/hp_3par_with_debian_v7.txt
https://www.zimbra.com/products/zimbra-collaboration/calendar-collaboration.html (Extender directorio raíz sin reiniciar con ext3/ext4)