Ampliación y reducción de volúmenes LVM (Red Hat 6 y CentOS 6)

Voy a mostrar como crear, ampliar y reducir volúmnes LVM, todas estas acciones se han realizado con RedHat 6 directamente desde la consola LVM. Creo que no es necesario decirlo, pero es muy recomendable hacer una copia de seguridad de los discos originales por si acaso.

Lo primero que se ha de tener claro es la estructura que sigue LVM, trabaja con 3 tipos de elementos:

  • Grupos de volúmenes, todos los comandos relacionados con esto comienzan por vg*, un grupo de volúmenes puede contener 1 o más volúmenes lógicos. Y está compuesto por volúmenes físicos.
  • Volúmenes lógicos, todos los comandos relacionados comienzan por lv*, un volumen lógigo reside dentro de un grupo de volúmenes
  • Volúmenes físicos, en este caso todos los comandos comienzan por pv*, un grupo de volúmenes se componen de 1 o más volúmenes físicos.

Existen una gran cantidad de comandos para administrar los volúmnes LVM:

Source   
[root@tester1 ~]# lvm
lvm> help
Available lvm commands:
Use 'lvm help <command></command>' for more information
dumpconfig Dump active configuration
formats List available metadata formats
help Display help for commands
lvchange Change the attributes of logical volume(s)
lvconvert Change logical volume layout
lvcreate Create a logical volume
lvdisplay Display information about a logical volume
lvextend Add space to a logical volume
lvmchange With the device mapper, this is obsolete and does nothing.
lvmdiskscan List devices that may be used as physical volumes
lvmsadc Collect activity data
lvmsar Create activity report
lvreduce Reduce the size of a logical volume
lvremove Remove logical volume(s) from the system
lvrename Rename a logical volume
lvresize Resize a logical volume
lvs Display information about logical volumes
lvscan List all logical volumes in all volume groups
pvchange Change attributes of physical volume(s)
pvresize Resize physical volume(s)
pvck Check the consistency of physical volume(s)
pvcreate Initialize physical volume(s) for use by LVM
pvdata Display the on-disk metadata for physical volume(s)
pvdisplay Display various attributes of physical volume(s)
pvmove Move extents from one physical volume to another
pvremove Remove LVM label(s) from physical volume(s)
pvs Display information about physical volumes
pvscan List all physical volumes
segtypes List available segment types
vgcfgbackup Backup volume group configuration(s)
vgcfgrestore Restore volume group configuration
vgchange Change volume group attributes
vgck Check the consistency of volume group(s)
vgconvert Change volume group metadata format
vgcreate Create a volume group
vgdisplay Display volume group information
vgexport Unregister volume group(s) from the system
vgextend Add physical volumes to a volume group
vgimport Register exported volume group with system
vgmerge Merge volume groups
vgmknodes Create the special files for volume group devices in /dev
vgreduce Remove physical volume(s) from a volume group
vgremove Remove volume group(s)
vgrename Rename a volume group
vgs Display information about volume groups
vgscan Search for all volume groups
vgsplit Move physical volumes into a new or existing volume group
version Display software and driver version information

Para trabajar con los ejemplos, se han conectado a la máquina 2 HD de 100Mb cada uno.

Creación grupo de volúmenes y volumen lógico con 1 disco físico

Inicialmente tenemos un solo grupo de volúmenes con 2 volúmenes:

Source   
lvm> vgs
VG #PV #LV #SN Attr VSize VFree
vg_tester1 1 2 0 wz--n- 7,51g 0
lvm> lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv_root vg_tester1 -wi-ao 6,51g
lv_swap vg_tester1 -wi-ao 1,00g
lvm> lvscan
ACTIVE '/dev/vg_tester1/lv_root' [6,51 GiB] inherit
ACTIVE '/dev/vg_tester1/lv_swap' [1,00 GiB] inherit

Podemos ver los discos que hay disponibles con:

Source   
lvm> lvmdiskscan
/dev/ram0 [ 16,00 MiB]
/dev/root [ 6,51 GiB]
/dev/ram1 [ 16,00 MiB]
/dev/sda1 [ 500,00 MiB]
/dev/vg_tester1/lv_swap [ 1,00 GiB]
/dev/ram2 [ 16,00 MiB]
/dev/sda2 [ 7,51 GiB] LVM physical volume
/dev/ram3 [ 16,00 MiB]
/dev/ram4 [ 16,00 MiB]
/dev/ram5 [ 16,00 MiB]
/dev/ram6 [ 16,00 MiB]
/dev/ram7 [ 16,00 MiB]
/dev/ram8 [ 16,00 MiB]
/dev/ram9 [ 16,00 MiB]
/dev/ram10 [ 16,00 MiB]
/dev/ram11 [ 16,00 MiB]
/dev/ram12 [ 16,00 MiB]
/dev/ram13 [ 16,00 MiB]
/dev/ram14 [ 16,00 MiB]
/dev/ram15 [ 16,00 MiB]
/dev/sdb [ 102,40 MiB]
/dev/sdc [ 102,40 MiB]
4 disks
17 partitions
0 LVM physical volume whole disks
1 LVM physical volume

Se puede ver que /dev/sdb y /dev/sdc se encuentran disponibles para ser utilizados por lvm, creamos un volumen físico para ser usado por LVM:

Source   
lvm> pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created

Y luego un grupo de volúmenes «vgtest» con el volumen físico.

Source   
lvm> vgcreate vgtest /dev/sdb
Volume group "vgtest" successfully created

Ahora creamos un volúmen lógico «lv_1_vgtest» dentro del grupo de volúmenes «vgtest»:

Source   
lvm> lvcreate -L 100M -n lv_1_vgtest vgtest
Logical volume "lv_1_vgtest" created

Listamos los grupos de volúmenes:

Source   
lvm> vgs
VG #PV #LV #SN Attr VSize VFree
vg_tester1 1 2 0 wz--n- 7,51g 0
vgtest 1 1 0 wz--n- 100,00m 0

Y los volúmenes lógicos (el segundo comando muestra la ruta completa del dispositivo creado /dev/*) con la asociación al grupo de volúmenes:

Source   
lvm> lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv_root vg_tester1 -wi-ao 6,51g
lv_swap vg_tester1 -wi-ao 1,00g
lv_1_vgtest vgtest -wi-a- 100,00m
lvm> lvscan
ACTIVE '/dev/vg_tester1/lv_root' [6,51 GiB] inherit
ACTIVE '/dev/vg_tester1/lv_swap' [1,00 GiB] inherit
ACTIVE '/dev/vgtest/lv_1_vgtest' [100,00 MiB] inherit

Podemos ver los volúmenes físicos y su asociación con los grupos de volúmenes:

Source   
lvm> pvscan
PV /dev/sdb VG vgtest lvm2 [100,00 MiB / 0 free]
PV /dev/sda2 VG vg_tester1 lvm2 [7,51 GiB / 0 free]
Total: 2 [7,61 GiB] / in use: 2 [7,61 GiB] / in no VG: 0 [0 ]

Ok ahora tenemos un volume lógico en /dev/vgtest/lv_1_vgtest. con 100Mb de espacio sin formatear.

Lo formateamos y lo montamos:

Source   
[root@tester1 ~]# mkfs.ext4 /dev/vgtest/lv_1_vgtest
mke2fs 1.41.12 (17-May-2010)
Etiqueta del sistema de ficheros=
Tipo de SO: Linux
Tamaño del bloque=1024 (bitácora=0)
Tamaño del fragmento=1024 (bitácora=0)
Stride=0 blocks, Stripe width=0 blocks
25688 nodos-i, 102400 bloques
5120 bloques (5.00%) reservados para el superusuario
Primer bloque de datos=1
Número máximo de bloques del sistema de ficheros=67371008
13 bloque de grupos
8192 bloques por grupo, 8192 fragmentos por grupo
1976 nodos-i por grupo
Respaldo del superbloque guardado en los bloques:
8193, 24577, 40961, 57345, 73729
Escribiendo las tablas de nodos-i: hecho
Creating journal (4096 blocks): hecho
Escribiendo superbloques y la información contable del sistema de ficheros: hecho
Este sistema de ficheros se revisará automáticamente cada 29 montajes o
180 días, lo que suceda primero. Utilice tune2fs -c o -i para cambiarlo.
[root@tester1 ~]# mount /dev/vgtest/lv_1_vgtest /mnt
[root@tester1 ~]# df -h
S.ficheros Size Used Avail Use% Montado en
/dev/mapper/vg_tester1-lv_root
6,5G 679M 5,5G 11% /
tmpfs 250M 0 250M 0% /dev/shm
/dev/sda1 485M 27M 433M 6% /boot
/dev/mapper/vgtest-lv_1_vgtest
97M 5,6M 87M 7% /mnt

Ampliación del grupo de volúmenes y volumen lógico con 1 disco físico más.

Supongamos que nos hemos quedado cortos de espacio y nos dan otro disco de 100Mb, queremos que /dev/mapper/vgtest-lv_1_vgtest tengo finalmente 200Mb de espacio.

Para esto tenemos que hacer 4 cosas:

  • Crear un nuevo volumen físico con /dev/sdc que ya lo tenemos pinchado
  • Ampliar el grupo de volúmenes «vgtest» añadiendo un volumen físico de 100Mb /dev/sdc
  • Ampliar el volumen lógico «/dev/mapper/vgtest-lv_1_vgtest» de 100Mb a 200Mb
  • Redimensionar el sistema de ficheros que se creo en «/dev/mapper/vgtest-lv_1_vgtest» para que aproveche los 200Mb.

Vamos al asunto, creamos el nuevo volumen físico (usamos /dev/sdc):

Source   
lvm> lvmdiskscan
/dev/ram0 [ 16,00 MiB]
/dev/root [ 6,51 GiB]
/dev/ram1 [ 16,00 MiB]
/dev/sda1 [ 500,00 MiB]
/dev/vg_tester1/lv_swap [ 1,00 GiB]
/dev/ram2 [ 16,00 MiB]
/dev/sda2 [ 7,51 GiB] LVM physical volume
/dev/vgtest/lv_1_vgtest [ 100,00 MiB]
/dev/ram3 [ 16,00 MiB]
/dev/ram4 [ 16,00 MiB]
/dev/ram5 [ 16,00 MiB]
/dev/ram6 [ 16,00 MiB]
/dev/ram7 [ 16,00 MiB]
/dev/ram8 [ 16,00 MiB]
/dev/ram9 [ 16,00 MiB]
/dev/ram10 [ 16,00 MiB]
/dev/ram11 [ 16,00 MiB]
/dev/ram12 [ 16,00 MiB]
/dev/ram13 [ 16,00 MiB]
/dev/ram14 [ 16,00 MiB]
/dev/ram15 [ 16,00 MiB]
/dev/sdb [ 102,40 MiB] LVM physical volume
/dev/sdc [ 102,40 MiB]
4 disks
17 partitions
1 LVM physical volume whole disk
1 LVM physical volume
lvm> pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created
lvm> lvmdiskscan
/dev/ram0 [ 16,00 MiB]
/dev/root [ 6,51 GiB]
/dev/ram1 [ 16,00 MiB]
/dev/sda1 [ 500,00 MiB]
/dev/vg_tester1/lv_swap [ 1,00 GiB]
/dev/ram2 [ 16,00 MiB]
/dev/sda2 [ 7,51 GiB] LVM physical volume
/dev/vgtest/lv_1_vgtest [ 100,00 MiB]
/dev/ram3 [ 16,00 MiB]
/dev/ram4 [ 16,00 MiB]
/dev/ram5 [ 16,00 MiB]
/dev/ram6 [ 16,00 MiB]
/dev/ram7 [ 16,00 MiB]
/dev/ram8 [ 16,00 MiB]
/dev/ram9 [ 16,00 MiB]
/dev/ram10 [ 16,00 MiB]
/dev/ram11 [ 16,00 MiB]
/dev/ram12 [ 16,00 MiB]
/dev/ram13 [ 16,00 MiB]
/dev/ram14 [ 16,00 MiB]
/dev/ram15 [ 16,00 MiB]
/dev/sdb [ 102,40 MiB] LVM physical volume
/dev/sdc [ 102,40 MiB] LVM physical volume
3 disks
17 partitions
2 LVM physical volume whole disks
1 LVM physical volume

Extensión del grupo de volúmenese «vgtest»:

Source   
lvm> vgextend vgtest /dev/sdc
Volume group "vgtest" successfully extended
lvm> vgs
VG #PV #LV #SN Attr VSize VFree
vg_tester1 1 2 0 wz--n- 7,51g 0
vgtest 2 1 0 wz--n- 200,00m 100,00m
lvm> lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv_root vg_tester1 -wi-ao 6,51g
lv_swap vg_tester1 -wi-ao 1,00g
lv_1_vgtest vgtest -wi-ao 100,00m

Como se puede ver el grupo de volúmenes tiene un tamaño de 200Mb pero el volumen lógico sigue siendo de 100Mb.

Extensión del volumen lógico «lv_1_vgtest» con:

Source   
lvm> lvextend -L200M /dev/vgtest/lv_1_vgtest
Extending logical volume lv_1_vgtest to 200,00 MiB
Logical volume lv_1_vgtest successfully resized
lvm> lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv_root vg_tester1 -wi-ao 6,51g
lv_swap vg_tester1 -wi-ao 1,00g
lv_1_vgtest vgtest -wi-ao 200,00m

Para la extensión del volúmen logico se ha definido el tamaño de forma explicita, pero podríamos haber utilizado todo el disco libre con:

Source   
lvextend -l +100%FREE /dev/vgtest/lv_1_vgtest

Ahora solo nos queda el redimensionado del sistema de ficheros ext4 (se puede hacer con el volumen montado):

Source   
[root@tester1 ~]# resize2fs /dev/vgtest/lv_1_vgtest
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/vgtest/lv_1_vgtest is mounted on /mnt; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/vgtest/lv_1_vgtest to 204800 (1k) blocks.
El sistema de ficheros en /dev/vgtest/lv_1_vgtest tiene ahora 204800 bloques.

Si esl sistema de ficheros es xfs debemos ejecutar:

Source   
[root@tester1 ~]# xfs_growfs /dev/vgtest/lv_1_vgtest
meta-data=/dev/vgtest/lv_1_vgtest isize=512 agcount=4, agsize=65280 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=261120, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 261120 to 524288

El SO ya puede ver los 200Mb del volumen lógico:

Source   
[root@tester1 ~]# df -h
S.ficheros Size Used Avail Use% Montado en
/dev/mapper/vg_tester1-lv_root
6,5G 679M 5,5G 11% /
tmpfs 250M 0 250M 0% /dev/shm
/dev/sda1 485M 27M 433M 6% /boot
/dev/mapper/vgtest-lv_1_vgtest
194M 5,6M 179M 3% /mnt

Ahora vamos a añadir algunos ficheros en el punto de montaje /mnt que es donde está montado /dev/mapper/vgtest-lv_1_vgtest, con la idea de elimiar algunos e intentar reducir el volumen lógico sin perder datos.

Copiamos unos cuantos ficheros en el vg (151M) :

Source   
[root@tester1 ~]# cp /usr/lib/* /mnt/ -R
[root@tester1 mnt]# df -h
S.ficheros Size Used Avail Use% Montado en
/dev/mapper/vg_tester1-lv_root
6,5G 679M 5,5G 11% /
tmpfs 250M 0 250M 0% /dev/shm
/dev/sda1 485M 27M 433M 6% /boot
/dev/mapper/vgtest-lv_1_vgtest
194M 158M 27M 86% /mnt
[root@tester1 ~]# cd /mnt/
[root@tester1 mnt]# rm /mnt/locale/ -Rf
[root@tester1 mnt]# df -h
S.ficheros Size Used Avail Use% Montado en
/dev/mapper/vg_tester1-lv_root
6,5G 679M 5,5G 11% /
tmpfs 250M 0 250M 0% /dev/shm
/dev/sda1 485M 27M 433M 6% /boot
/dev/mapper/vgtest-lv_1_vgtest
194M 65M 120M 35% /mnt

Reducción del grupo de volúmenes y volumen lógico eliminamos 1 disco físico.

Vamos a reducir el sistema de ficheros de 200Mb a 80Mb, hay que desmontar antes el volumen:

Source   
[root@tester1 ~]# umount /mnt
[root@tester1 ~]# e2fsck -f /dev/vgtest/lv_1_vgtest
e2fsck 1.41.12 (17-May-2010)
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
No se encontró /lost+found. Crear<s>? si
Paso 3A: Optimizando directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
/dev/vgtest/lv_1_vgtest: ***** EL SISTEMA DE FICHEROS FUE MODIFICADO *****
/dev/vgtest/lv_1_vgtest: 2845/49400 ficheros (0.3% no contiguos), 71042/204800 bloques
[root@tester1 ~]# resize2fs /dev/vgtest/lv_1_vgtest 80M
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/vgtest/lv_1_vgtest to 81920 (1k) blocks.
El sistema de ficheros en /dev/vgtest/lv_1_vgtest tiene ahora 81920 bloques.

Lo que se ha hecho ha sido verificar antes el volumen y luego reducirlo.

Ahora podemos reducir el el volumen lógico a 90Mb (el sistema de ficheros solo ocupa 80Mb), aparece un mensaje indicando que podemos perder datos (ni que decir tiene que una copia de seguridad es más que recomendable):

Source   
lvm> lvreduce -L90M /dev/vgtest/lv_1_vgtest
Rounding up size to full physical extent 92,00 MiB
WARNING: Reducing active logical volume to 92,00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv_1_vgtest? [y/n]: y
Reducing logical volume lv_1_vgtest to 92,00 MiB
Logical volume lv_1_vgtest successfully resized

Ok el volumen lógico ha sido reducido:

Source   
lvm> lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv_root vg_tester1 -wi-ao 6,51g
lv_swap vg_tester1 -wi-ao 1,00g
lv_1_vgtest vgtest -wi-a- 92,00m

No se ha perdido nada:

Source   
[root@tester1 ~]# mount /dev/vgtest/lv_1_vgtest /mnt
[root@tester1 ~]# df -h
S.ficheros Size Used Avail Use% Montado en
/dev/mapper/vg_tester1-lv_root
6,5G 679M 5,5G 11% /
tmpfs 250M 0 250M 0% /dev/shm
/dev/sda1 485M 27M 433M 6% /boot
/dev/mapper/vgtest-lv_1_vgtest
78M 64M 11M 86% /mnt

Ahora vemos el uso de los discos físicos en cada grupo:

Source   
lvm> pvscan
PV /dev/sdb VG vgtest lvm2 [100,00 MiB / 8,00 MiB free]
PV /dev/sdc VG vgtest lvm2 [100,00 MiB / 100,00 MiB free]
PV /dev/sda2 VG vg_tester1 lvm2 [7,51 GiB / 0 free]
Total: 3 [7,70 GiB] / in use: 3 [7,70 GiB] / in no VG: 0 [0 ]

Se puede ver claramente que /dev/sdc puede ser liberado del grupo «vgtest», no está en uso:

Source   
lvm> vgreduce vgtest /dev/sdc
Removed "/dev/sdc" from volume group "vgtest"
lvm> pvscan
PV /dev/sdb VG vgtest lvm2 [100,00 MiB / 8,00 MiB free]
PV /dev/sda2 VG vg_tester1 lvm2 [7,51 GiB / 0 free]
PV /dev/sdc lvm2 [102,40 MiB]
Total: 3 [7,71 GiB] / in use: 2 [7,61 GiB] / in no VG: 1 [102,40 MiB]

En este momento podemos eliminar el disco físico con:

Source   
lvm> pvremove /dev/sdc
Labels on physical volume "/dev/sdc" successfully wiped
lvm> pvscan
PV /dev/sdb VG vgtest lvm2 [100,00 MiB / 8,00 MiB free]
PV /dev/sda2 VG vg_tester1 lvm2 [7,51 GiB / 0 free]
Total: 2 [7,61 GiB] / in use: 2 [7,61 GiB] / in no VG: 0 [0 ]

Finalmente el disco físco /dev/sdc es posible desasignarlo de la máquina de forma definitiva, LVM no lo usa para nada.

2 thoughts on “Ampliación y reducción de volúmenes LVM (Red Hat 6 y CentOS 6)

  1. que mas compañero un saludo desde cartagena colombia, me queda una duda cuando reduces el lv el cual esta montado en la ruta /mnt la carpeta tiene inofmacion, lo pirmero que haces es desmontar el lv, depues utilizas el comando e2fsck el cual no se para que se uttiliza y despues tulizas el comando resize2fs que me imagino es para reducir el lv a 80M pero veo que por ultimo utilizas el comando lvreduce para reducir de nuevo el lv a 90M, sera que me puedes explicar

    • Bueno lo que hace cada herramienta es:
      -e2fsck, verificar el sistema de ficheros. Más que recomendable para evitar sorpresas antes de redimensionar.
      -resize2fs, redimensiona el sistema de ficheros. Ojo que el tamaño del volumen no se modifica, después de ejecutar este comando tenemos un sistema de ficheros más pequeño que el tamaño del volumen.
      -lvreduce, reduce el tamaño del volumen lógico (lvm). Esto se puede hacer solo si antes hemos reducido el tamaño del sistema de ficheros.

      En el ejemplo el tamaño del sistema de ficheros es de 80M y el del lvm de 90M, el motivo es que simplemente no ajusté demasiado la reducción del volumen.

Deja un comentario