Crear, extender y reducir volúmenes lógicos en RHEL7

por


Publicado en: abril 20, 2018



En este artículo expondremos como extender, crear y reducir volúmenes lógicos de una manera sencilla, mediante ejemplos y datos de comprobación útiles al realizar este tipo de tareas.

Uno de los puntos más significativos que debemos tener presente al extender un volumen lógico es evitar a toda costa una interrupción o una pérdida de datos en el sistema, expondremos como realizar este procedimiento de forma sencilla y segura para evitar lo anteriormente mencionado. Recomendamos antes de cada implementación, realizar su laboratorio de pruebas en una máquina virtual. Como dato trascendental, debemos tener en cuenta que actualmente no es posible reducir en absoluto el tamaño de una partición o volumen lógico con el sistema de archivos xfs. Este sistema de archivos se puede extender, mas no reducir; caso contrario con el sistema de archivos ext4 o ext3.

Requisitos previos


Como requisito previo para la implementación, vamos a provisionar un nuevo disco al sistema, en nuestro caso sería el disco sdb.

[[email protected] ~]# fdisk -l
Disk /dev/sdb: 2219 MB, 2219943936 bytes, 4335828 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Pasos para extender un volumen lógico


Paso 1

Verificamos el sistema de archivos, volumen de grupo y volumen lógico con los cuales vamos a trabajar, para este ejemplo seria el volumen de grupo rhel_server1, volumen lógico root y el sistema de archivos xfs

[[email protected] ~]# lvs
  LV   VG                     Attr            LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rhel_server1 -wi-ao----   6.20g
  swap rhel_server1 -wi-ao---- 820.00m
[[email protected] ~]# df -hT
Filesystem                                         Type           Size       Used        Avail    Use%   Mounted on
/dev/mapper/rhel_server1-root                      xfs            6.2G       3.2G         3.1G     51%   /
devtmpfs                                           devtmpfs       482M          0         482M      0%   /dev
tmpfs                                              tmpfs          497M       144K         497M      1%   /dev/shm
tmpfs                                              tmpfs          497M       7.0M         490M      2%   /run
tmpfs                                              tmpfs          497M          0         497M      0%   /sys/fs/cgroup
/dev/sda1                                          xfs           1014M       172M         843M     17%   /boot
tmpfs                                              tmpfs          100M        16K          100M     1%   /run/user/0

Paso 2

Comprobar cuál es el espacio disponible en el volumen de grupo.

[[email protected] ~]# vgs
  VG           #PV #LV #SN Attr   VSize VFree

  rhel_server1   1   2   0 wz--n- 7.00g    0

Como podemos observar el volumen de grupo rhel_server1, no posee espacio disponible (VFree 0).

Paso 3

Para extender o provisionar de espacio a un volumen de grupo se utilizar el comando vgextend, indicando cual volumen de grupo vamos a extender y con que recursos. En nuestro caso vamos a utilizar el disco sdb, también es válido utilizar una o varias particiones de disco.

[[email protected] ~]# vgextend rhel_server1 /dev/sdb
  Physical volume "/dev/sdb" successfully created.
  Volume group "rhel_server1" successfully extended

Seguidamente comprobamos los cambios y cómo podemos observar, el valor para VFree ahora es de 2.07g.

[[email protected] ~]# vgs
  VG           #PV #LV #SN Attr   VSize VFree

  rhel_server1   2   2   0 wz--n- 9.06g 2.07g

Paso 4

Para extender un volumen lógico se utiliza el comando lvextend, con una serie de opciones que vamos a explicar a continuación:

  • -L (LogicalVolumeSize): Nos permite establecer el tamaño en unidades tales como M para megabytes, G para gigabytes, T para terabytes, P para petabytes y E para exabytes. Con el signo + el valor se agrega al tamaño real y sin él se toma el valor como absoluto.
  • -r (Resize): Esta opción es muy importantes y es la que indica que se va a redimensionar el sistema de archivos al mismo tiempo, sin esta opción tendríamos que aplicar un paso extra con el comando resize2fs si estamos utilizando el sistema de archivos ext4 o ext3 y xfs_growfs si utilizamos xfs.
  • -t (Test Mode): Como buena práctica utilizamos esta opción de comprobación al final del comando, esto nos permite verificar errores sin aplicar ningún cambio.

Aplicamos el comando con la opción de test mode -t:

[[email protected] ~]# lvextend /dev/rhel_server1/root -L +200M -r -t
  TEST MODE: Metadata will NOT be updated and volumes will not be (de)activated.
  Size of logical volume rhel_server1/root changed from 6.20 GiB (1586 extents) to 6.39 GiB (1636 extents).
  Logical volume rhel_server1/root successfully resized.

Como podemos observar al realizar nuestra comprobación, no tenemos errores por lo que podemos proceder con el siguiente paso.

Si se desea extender el volumen lógico con todo el porcentaje disponible del volumen de grupo, se debe utilizar la opción -l (LogicalExtentsNumber), esta misma permite trabajar con %FREE, como se muestra a continuación:

lvextend /dev/rhel_server1/root -l +100%FREE -r -t  

Paso 5

Procedemos a ejecutar el comando sin la opción -t, aplicando los cambios de manera definitiva.

[[email protected] ~]# lvextend /dev/rhel_server1/root -L +200M -r
  Size of logical volume rhel_server1/root changed from 6.20 GiB (1586 extents) to 6.39 GiB (1636 extents).
  Logical volume rhel_server1/root successfully resized.
meta-data=/dev/mapper/rhel_server1-root isize=512    agcount=4, agsize=406016 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                   bsize=4096   blocks=1624064, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1624064 to 1675264

Paso 6

Finalmente corroboramos los cambios.

[[email protected] ~]# lvs
  LV   VG           Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rhel_server1 -wi-ao----   6.40g
  swap rhel_server1 -wi-ao---- 820.00m
[[email protected] ~]# df -hT
Filesystem                                       Type         Size    Used      Avail Use%   Mounted on
/dev/mapper/rhel_server1-root                    xfs          6.4G    3.2G       3.3G  49%   /
devtmpfs                                         devtmpfs     482M       0       482M   0%   /dev
tmpfs                                            tmpfs        497M    144K       497M   1%   /dev/shm
tmpfs                                            tmpfs        497M    7.0M       490M   2%   /run
tmpfs                                            tmpfs        497M       0       497M   0%   /sys/fs/cgroup
/dev/sda1                                        xfs         1014M    172M       843M  17%   /boot
tmpfs                                            tmpfs        100M     16K       100M   1%   /run/user/0

Esta configuración también se puede aplicar para sistemas de archivos ext3 y ext4, tomando en cuenta que se deben seguir los pasos tal cual como se indican en la guía.

Pasos para crear un nuevo volumen lógico


Paso 1

Verificamos el espacio disponible en el volumen de grupo, en nuestro caso tenemos 1.86Gb libres para crear un nuevo volumen lógico.

[[email protected] ~]# vgs
  VG           #PV #LV #SN Attr   VSize VFree

  rhel_server1   2   2   0 wz--n- 9.06g 1.87g

Paso 2

Para crear un volumen lógico se utiliza el comando lvcreate, con una serie de opciones que vamos a explicar a continuación:

  • -n: Esta opción se utiliza para asignar el nombre del nuevo volumen lógico, (-n nombre).
  • Volumen de grupo: Debemos indicar en cual volumen de grupo vamos a crear el volumen lógico.
  • -L (LogicalVolumeSize): Nos permite establecer el tamaño que vamos a asignar al volumen lógico en unidades tales como M para megabytes, G para gigabytes, T para terabytes, P para petabytes y E para exabytes.

Aplicamos el comando para crear nuestro nuevo volumen.

[[email protected] ~]# lvcreate -n lvm_data rhel_server1 -L 1G
  Logical volume "lvm_data" created.

Paso 3

Debemos establecer el sistema de archivos que vamos a utilizar para el nuevo volumen lógico, en nuestro caso utilizaremos ext4.

[[email protected] ~]# mkfs.ext4 /dev/rhel_server1/lvm_data
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

Paso 4

Descubrimos el UUID del nuevo volumen lógico y seguidamente lo montamos permanentemente en el directorio deseado, en nuestro caso /mnt/data.

[[email protected] ~]# blkid | grep lvm_data
/dev/mapper/rhel_server1-lvm_data: UUID="421bcc4d-e379-4c90-b4ae-746f074c5247" TYPE="ext4"
[[email protected] ~]# echo "UUID="421bcc4d-e379-4c90-b4ae-746f074c5247" /mnt/data ext4 defaults 0 0" >> /etc/fstab
[[email protected] ~]# mkdir /mnt/data
[[email protected] ~]# mount -a

Paso 5

Finalmente verificamos que se montó correctamente.

[[email protected] ~]# df -hT /mnt/data
Filesystem                                                 Type   Size     Used Avail     Use%  Mounted on
/dev/mapper/rhel_server1-lvm_data                          ext4   976M     2.6M  907M       1%  /mnt/data

Acotaciones en caso de que se desee crear un nuevo volumen de grupo.

En caso de que se desee crear un nuevo volumen de grupo se utiliza el comando vgcreate, utilizando un disco completo o una serie de particiones. Ejemplos:

  • vgcreate nuevo_grupo /dev/sdc
  • vgcreate nuevo_grupo /dev/sdc1 /dev/sdc2 /dev/sdc3

Es importante mencionar que podemos crear un volumen de grupo sin tener que crear el volumen físico pvs, al crear el volumen de grupo, se crea directamente el volumen físico.

Por cuestión de aprendizaje, si se quisiera crear el volumen físico pvs, se puede realizar como paso extra, utilizando el comando pvcreate. Ejemplos:

  • pvcreate /dev/sdc
  • pvcreate /dev/sdc1 /dev/sdc2 /dev/sdc3

Pasos para reducir un volumen lógico


Antes de iniciar con este tema, debo mencionar que la reducción de volúmenes lógicos y sistema de archivos críticos es poco común por dos temas en específico los cuales son:

  • El costo para el aprovisionamiento de almacenamiento en un sistema es relativamente bajo, por lo cual vamos a preferir agregar más recurso.
  • Según la mayoría de las documentaciones, para reducir un sistema de archivos crítico debemos desmontarlo, lo cual hace que esta tarea sea complicada.

Por lo anteriormente mencionado y como ejemplo, vamos a realizar este procedimiento utilizando el volumen lógico creado anteriormente lvm_data, el cual como sabemos no es crítico y fue implementado con un sistema de archivos ext4 el cual permite ser reducido.

Paso 1

Para reducir un volumen lógico se utiliza el comando lvreduce, con una serie de opciones que vamos a explicar a continuación:

  • -L (LogicalVolumeSize): Nos permite establecer el tamaño en unidades tales como M para megabytes, G para gigabytes, T para terabytes, P para petabytes y E para exabytes. Con el signo - el valor se reduce al tamaño real y sin él se toma el valor como absoluto.
  • -r (Resize): Esta opción es muy importantes y es la que indica que se va a redimensionar el sistema de archivos al mismo tiempo, sin esta opción tendríamos que aplicar un paso extra con el comando resize2fs si estamos utilizando el sistema de archivos ext4 o ext3 y xfs_growfs si utilizamos xfs.
  • -t (Test Mode): Como buena práctica utilizamos esta opción de comprobación al final del comando, esto nos permite verificar errores sin aplicar ningún cambio.

Aplicamos el comando con la opción de test mode -t:

lvreduce /dev/rhel_server1/lvm_data -L 512M -r -t
  TEST MODE: Metadata will NOT be updated and volumes will not be (de)activated.
Do you want to unmount "/mnt/data"? [Y|n] y
  Size of logical volume rhel_server1/lvm_data changed from 1.00 GiB (256 extents) to 500.00 MiB (125 extents).
  Logical volume rhel_server1/lvm_data successfully resized.

Como podemos observar al realizar nuestra comprobación, no tenemos errores y podemos proceder con el siguiente paso.

Paso2

Procedemos a ejecutar el comando sin la opción -t, aplicando los cambios de manera definitiva.

[[email protected] ~]# lvreduce /dev/rhel_server1/lvm_data -L 512M -r
Do you want to unmount "/mnt/data"? [Y|n] y
fsck from util-linux 2.23.2
/dev/mapper/rhel_server1-lvm_data: 11/65536 files (0.0% non-contiguous), 12955/262144 blocks
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/mapper/rhel_server1-lvm_data to 131072 (4k) blocks.
The filesystem on /dev/mapper/rhel_server1-lvm_data is now 131072 blocks long.

  Size of logical volume rhel_server1/lvm_data changed from 1.00 GiB (256 extents) to 512.00 MiB (128 extents).
  Logical volume rhel_server1/lvm_data successfully resized.

Paso 3

Finalmente corroboramos que los cambios se aplicaron correctamente, teniendo como resultado la reducción del volumen lógico de 1GB a un tamaño fijo de 512MB, esto también se verá reflejado en el sistema de archivos.

[[email protected] ~]# lvs
  LV       VG           Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lvm_data rhel_server1 -wi-ao---- 512.00m                                      
  root     rhel_server1 -wi-ao----   6.39g                                      
  swap     rhel_server1 -wi-ao---- 820.00m  

[[email protected] ~]# df -hT /mnt/data/
Filesystem                                                Type  Size      Used   Avail Use% Mounted on
/dev/mapper/rhel_server1-lvm_data                         ext4  472M      1.6M    435M   1% /mnt/data

Autor del Artículo

Álvaro Campos Castro

Álvaro Campos Castro

System Administrator.

  • Ingeniero en Sistemas de Información. UNA.
  • Red Hat Certified System Administrator (RHCSA®)
  • Red Hat Certified Engineer (RHCE®)