LVM: Logical Volume Manager

Hace poco he empezado a administrar servidores que soportan BBDD Oracle, en este entorno se necesita una gran capacidad de escalabilidad ya que en muchos casos las BBDD crecen a TB por semana, por lo que se hace un gran uso de LVM, así que esta vez he tenido que repasar todos los comandos de gestión.

Básicamente en un entorno donde se usa Logical Volumen Manager, la arquitectura básica podría ser como la anterior mostrada en el gráfico. Tres PV, osea 3 discos físicos que pertenecen todos a un VG, donde ese VG esta dividido en 3 LV. Debemos tener en cuenta que para Linux cada LV es tratado como si fuese un disco físico, por lo que puede ser formateado con cualquier sistema de archivos deseado. Una vez ese sistema de archivos se llena, se puede ampliar perfectamente, por ejemplo añadiendo un PV más al VG y así aumentando su capacidad.

Los comandos de administración LVM se crean con un prefijo que determina el objeto y con un sufijo que determina la acción a realizar, tenemos la siguiente tabla:

Para este post, he creado una VM con un disco principal donde esta instalado el SO y otros tres discos de 10GB, que serán destinados para Backups:

Comprobamos que los discos hayan sido detectados:

root@deividsdocs:~# dmesg | grep "\[sd.*\].*blocks"
[    2.204715] sd 2:0:0:0: [sda] 20971520 512-byte logical blocks: (10.7 GB/10.0 GiB)
[    2.521547] sd 3:0:0:0: [sdb] 20971520 512-byte logical blocks: (10.7 GB/10.0 GiB)
[    2.910475] sd 4:0:0:0: [sdc] 20971520 512-byte logical blocks: (10.7 GB/10.0 GiB)
[    3.319112] sd 5:0:0:0: [sdd] 20971520 512-byte logical blocks: (10.7 GB/10.0 GiB)

Los 3 nuevos discos han sido detectados, son: sdb, sdc y sdd. Ahora vamos a indicar que estos 3 nuevos discos serán tratados como volumenes fisicos (PV):

root@deividsdocs:~# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.
root@deividsdocs:~# pvcreate /dev/sdc
  Physical volume "/dev/sdc" successfully created.
root@deividsdocs:~# pvcreate /dev/sdd
  Physical volume "/dev/sdd" successfully created.

Ahora vamos a crear un grupo de volumenes que contenga estos tres volumenes físicos:

root@deividsdocs:~# vgcreate backups_vg /dev/sdb /dev/sdc
root@deividsdocs:~# vgextend backups_vg /dev/sdd

La primera vez usamos vgcreate y para añadir el disco restante, podemos usar vgextend, siempre indicando el VG al que lo queremos añadir. Si echamos un vistazo ahora a nuestro volumen veremos que su capacidad total es de la suma de los tres discos, en este caso 30GB:

root@deividsdocs:~# vgdisplay
  --- Volume group ---
  VG Name               backups_vg
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               <29,99 GiB
  PE Size               4,00 MiB
  Total PE              7677
  Alloc PE / Size       0 / 0   
  Free  PE / Size       7677 / <29,99 GiB
  VG UUID               zRLcF4-ShSK-OY3N-9zd8-7h1r-Anss-v8qTr4

Ahora vamos a crear dos LV, uno de 20GB y otro de 5GB:

root@deividsdocs:~# lvcreate -L20G -n datos_lv01 backups_vg
  Logical volume "datos_lv01" created.
root@deividsdocs:~# lvcreate -L5G -n datos_lv02 backups_vg
  Logical volume "datos_lv02" created.

Ahora que ya estan creados los volumenes logicos podemos visualizarlos ejecutando lvdisplay o lvs (salida resumida):

root@deividsdocs:~# lvs
  LV         VG         Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  datos_lv01 backups_vg -wi-a----- 20,00g                                                    
  datos_lv02 backups_vg -wi-a-----  5,00g   

Estos LV no tienen un formato de archivo ni están montados aun, así que vamos a darle formato a cada uno y los montamos en el sistema. Primero formateamos el volumen de 20GBG con EXT4:

root@deividsdocs:~# mkfs -t ext4 /dev/backups_vg/datos_lv01
mke2fs 1.44.6 (5-Mar-2019)
Creating filesystem with 5242880 4k blocks and 1310720 inodes
Filesystem UUID: 844a51e5-f598-44c9-965b-8840577dd646
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done   

Como podéis observar la ubicación que usamos del disco ya no es: /dev/sdb ni cualquier otra, en este caso los LV se ubican en la ruta: /dev/NOMBRE_VG/NOMBRE_LV. En este ejemplo: /dev/backups_vg/datos_lv01.

Ahora formateamos el otro en XFS:

root@deividsdocs:~# mkfs -t xfs /dev/backups_vg/datos_lv02
meta-data=/dev/backups_vg/datos_lv02 isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=0, rmapbt=0, reflink=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

Y procedemos a montar ambos discos en el sistema:

root@deividsdocs:~# mkdir /mnt/datos_1
root@deividsdocs:~# mount -t ext4 /dev/backups_vg/datos_lv01 /mnt/datos_1
root@deividsdocs:~# mkdir /mnt/datos_2
root@deividsdocs:~# mount -t xfs /dev/backups_vg/datos_lv02 /mnt/datos_2

Ahora si ejecutamos un df -h podemos ver los LV montandos:

root@deividsdocs:~# df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               862M     0  862M   0% /dev
tmpfs                              180M  1,1M  179M   1% /run
/dev/sda1                          9,8G  6,6G  2,8G  71% /
tmpfs                              898M  7,1M  891M   1% /dev/shm
tmpfs                              5,0M     0  5,0M   0% /run/lock
tmpfs                              898M     0  898M   0% /sys/fs/cgroup
tmpfs                              180M  8,0K  180M   1% /run/user/1000
tmpfs                              180M     0  180M   0% /run/user/0
/dev/mapper/backups_vg-datos_lv01   20G   45M   19G   1% /mnt/datos_1
/dev/mapper/backups_vg-datos_lv02  5,0G   38M  5,0G   1% /mnt/datos_2

Ahora supongamos que uno de nuestro discos se llena, vamos a forzar que el de 5GB se llene:

root@deividsdocs:/mnt/datos_2# dd if=/dev/zero of=./backups.dmp bs=900M count=5 oflag=dsync 
5+0 records in
5+0 records out
4718592000 bytes (4,7 GB, 4,4 GiB) copied, 11,2777 s, 418 MB/s

Con la orden anterior hemos escrito un fichero de 4,4GB que ha ocupado el 89% del LV. Ahora necesitamos ampliarlo, para ello añadiremos otro disco más a nuestra maquina virtual y realizaremos los mismos pasos para establecerlo como PV y añadirlo al VG:

root@deividsdocs:~# pvcreate /dev/sde
root@deividsdocs:~# vgextend backups_vg /dev/sde

Ahora los extenderemos 10G más de la siguiente forma:

root@deividsdocs:~# lvextend -L10G /dev/backups_vg/datos_lv02

Ahora el LV ya tiene el nuevo espacio, pero este espacio libre aun no ha sido formateado en XFS, por lo que tendremos que redimensionar el sistema de archivos para que ocupe todo el espacio disponible. En este caso como era XFS, usaremos xfs_grow:

root@deividsdocs:~# xfs_grow /dev/backups_vg/datos_lv02

Estas son las operaciones más simples que podemos realizar con LVM. Así que si lo tenías un poco olvidado como yo, ¡A repasar! 😉

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s