Blog

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

Crear, extender y reducir volúmenes lógicos en RHEL7
Publicado por: Gerardo Arroyo Arce

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.

{% highlight bash %}
[root@server1 ~]# 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
{% endhighlight %}

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

{% highlight bash %}
[root@server1 ~]# 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
{% endhighlight %}

{% highlight bash %}
[root@server1 ~]# 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
{% endhighlight %}

Paso 2

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

{% highlight bash %}
[root@server1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel_server1 1 2 0 wz–n- 7.00g 0
{% endhighlight %}

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.

{% highlight bash %}
[root@server1 ~]# vgextend rhel_server1 /dev/sdb
Physical volume “/dev/sdb” successfully created.
Volume group “rhel_server1” successfully extended
{% endhighlight %}

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

{% highlight bash %}
[root@server1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel_server1 2 2 0 wz–n- 9.06g 2.07g
{% endhighlight %}

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:

{% highlight bash %}
[root@server1 ~]# 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.
{% endhighlight %}

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:

{% highlight bash %}
lvextend /dev/rhel_server1/root -l +100%FREE -r -t
{% endhighlight %}

Paso 5

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

{% highlight bash %}
[root@server1 ~]# 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
{% endhighlight %}

Paso 6

Finalmente corroboramos los cambios.

{% highlight bash %}
[root@server1 ~]# 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
{% endhighlight %}

{% highlight bash %}
[root@server1 ~]# 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
{% endhighlight %}

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.

{% highlight bash %}
[root@server1 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel_server1 2 2 0 wz–n- 9.06g 1.87g
{% endhighlight %}

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.

{% highlight bash %}
[root@server1 ~]# lvcreate -n lvm_data rhel_server1 -L 1G
Logical volume “lvm_data” created.
{% endhighlight %}

Paso 3

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

{% highlight bash %}
[root@server1 ~]# 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
{% endhighlight %}

Paso 4

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

{% highlight bash %}
[root@server1 ~]# blkid | grep lvm_data
/dev/mapper/rhel_server1-lvm_data: UUID=“421bcc4d-e379-4c90-b4ae-746f074c5247” TYPE=“ext4”
[root@server1 ~]# echo “UUID=“421bcc4d-e379-4c90-b4ae-746f074c5247” /mnt/data ext4 defaults 0 0” >> /etc/fstab
[root@server1 ~]# mkdir /mnt/data
[root@server1 ~]# mount -a
{% endhighlight %}

Paso 5

Finalmente verificamos que se montó correctamente.

{% highlight bash %}
[root@server1 ~]# 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
{% endhighlight %}

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:

{% highlight bash %}
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.
{% endhighlight %}

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.

{% highlight bash %}
[root@server1 ~]# 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.
{% endhighlight %}

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.

{% highlight bash %}
[root@server1 ~]# 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

[root@server1 ~]# 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
{% endhighlight %}

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

Gerardo Arroyo Arce

CEO & Co-Founder

  • ​AWS Community Builder & Ambassador
  • ​AWS Solution Architect - Professional
  • AWS Certified Database – Specialty
  • AWS Certified Security – Specialty
  • AWS Solution Architect - Associate
  • AWS Certified Developer Associate
  • AWS Certified SysOps Administrator Associate
  • Ingeniero en Software. ITCR.
  • Master en Computación en Informática. UCR.