viernes, 22 de febrero de 2019

LVM

Aquí estamos despues de bastante tiempo para hacer una pequeña explicación sobre el uso y disfrute de LVM.
Primero de todo, ¿Qué es LVM? LVM (Logical Volume Manager) Es el gestor de volúmenes lógicos que se incluye en el Kernel Linux, de una manera muy resumida sería lo que nos da la capacidad de modificar el espacio de almacenamiento como queramos, aumentar o reducir el espacio, añadir más si nos estamos quedando sin capacidad, snapshots, ...
En Wikipedia tenéis una explicación más amplia si queréis verlo en más detalle, yo aqui indicaré como se usa y daré una pincelada de la gran potencia que tiene.

Para realizar estas explicaciones voy a utilizar una máquina virtual con Fedora 29 instalado, a mayores del sistema he creado la VM (Virtual Machine) con 2 discos duros adicionales de 512 Mb cada uno. Aunque hay herramientas gráficas para ralizar estas tareas, me voy a centrar en realizarlo desde la linea de comandos ya que normalmente los servidores no tienen entorno gráfico o si accedemos a los equipos a través de SSH, la CLI siempre la tenemos para venir al rescate.

Primero de todo abrimos una ventana de terminal y nos logueamos como root.
Con el comando fdisk -l tendremos un listado de los discos y sus particiones

[root@localhost /]# fdisk -l

Disco /dev/sdb: 512 MiB, 536870912 bytes, 1048576 sectores
...
Identificador del disco: 0x1d098903

Disco /dev/sdc: 512 MiB, 536870912 bytes, 1048576 sectores
...
Identificador del disco: 0xbbcbd368

Estos 2 son los que nos interesan, los 2 discos adicionales que hemos creado para el tutorial.
Empezamos con el sdb, vamos a convertirlo en un PV (Physical Volume) esto se hace simplemente creando una partición o varias de tipo 8e, de la siguiente manera:

[root@localhost ricky]# fdisk /dev/sdb    Ejecutamos fdisk sobre el disco que queremos utilizar
Orden (m para obtener ayuda): n   En comando n indica que queremos crear una nueva partición
Tipo de partición
   p   primaria (0 primaria(s), 0 extendida(s), 4 libre(s))
   e   extendida (contenedor para particiones lógicas)
Seleccionar (valor predeterminado p): Como no tenemos ninguna utilizamos el valor predeterminado
Se está utilizando la respuesta predeterminada p.
Número de partición (1-4, valor predeterminado 1):    De nuevo el valor predeterminado
Primer sector (2048-1048575, valor predeterminado 2048):    Aqui podríamos escoger desde que sector empezaría la partición, dejamos el predeterminado que es el inicio del disco
Último sector, +sectores o +tamaño{K,M,G,T,P} (2048-1048575, valor predeterminado 1048575): +200M   Indicamos que queremos que tenga 200 Megas de tamaño
Crea una nueva partición 1 de tipo 'Linux' y de tamaño 200 MiB.
Orden (m para obtener ayuda): t  Cambiamos el tipo de partición
Se ha seleccionado la partición 1
Código hexadecimal (escriba L para ver todos los códigos): 8e Escogemos tipo Linux LVM
Se ha cambiado el tipo de la partición 'Linux' a 'Linux LVM'.
Orden (m para obtener ayuda): p Comprobamos que la ha creado correctamente
Disco /dev/sdb: 512 MiB, 536870912 bytes, 1048576 sectores
...
/dev/sdb1             2048 411647   409600   200M 8e Linux LVM
Orden (m para obtener ayuda): w   Grabamos los cambios
Se ha modificado la tabla de particiones.
Llamando a ioctl() para volver a leer la tabla de particiones.
Se están sincronizando los discos.

Ahora que tenemos la partición creada vamos a crear un volumen físico PV con pvcreate
[root@localhost /]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.

Y seguidamente creamos un grupo de volúmenes VG con vgcreate y le llamaremos datos
[root@localhost /]# vgcreate datos /dev/sdb1
Volume group "datos" successfully created

Ahora que tenemos creado nuestro grupo de volúmenes "datos" vamos a crear el volumen lógico LV, le llamaremos datos1 y asignaremos 100 Megas de tamaño
[root@localhost /]# lvcreate -n datos1 -L 100M datos
Logical volume "datos1" created.

Confirmamos que está bien creado con lvs
[root@localhost /]# lvs
LV     VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
datos1 datos  -wi-a----- 100,00m  

Para poder utilizar este espacio tiene que tener un sistema de archivos, vamos a usar ext4
[root@localhost /]# mkfs.ext4 /dev/datos/datos1
...
Escribiendo superbloques y la información contable del sistema de ficheros: hecho

Ya tendríamos una partición de 100 Mb preparada para su uso usando LVM, pero lo interesante viene ahora.


CAMBIANDO EL TAMAÑO DE NUESTRO LVM
Una de las principales ventajas de trabajar con LVM es poder cambiar de tamaño nuestras particiones, vamos a ver como se hace, pero primero tenemos que tener en cuenta que si queremos extender un volumen lógico primero extenderemos el LV y despues tenemos que extender el sistema de ficheros, y si lo que queremos es reducir primero reducimos el sistema de ficheros y luego reducimos el LV, que nos puede pasar también, que queramos extender un LV pero no tengamos suficiente espacio libre en nuestro VG, entonces tendremos que añadir un nuevo disco.

Empezamos comprobando el espacio libre que tenemos en nuestro VG, con vgs
[root@localhost /]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  datos    1   1   0 wz--n- 196,00m 96,00m  Podemos ver que nos quedan 96 Mb libres
 
Vamos a aumentar el espacio en todo el tamaño libre
[root@localhost /]# lvextend -l +100%FREE /dev/datos/datos1
  Size of logical volume datos/datos1 changed from 100,00 MiB (25 extents) to 196,00 MiB (49 extents).
  Logical volume datos/datos1 successfully resized.

Y despues aumentamos el tamaño del sistema de ficheros
[root@localhost /]# resize2fs /dev/datos/datos1
resize2fs 1.44.3 (10-July-2018)
Cambiando el tamaño del sistema de ficheros en /dev/datos/datos1 a 200704 (1k) bloques.
El sistema de ficheros en /dev/datos/datos1 tiene ahora 200704 bloques (de 1k).

¿Pero qué pasa si no tenemos espacio libre en el VG? Pues que añadimos otro disco y lo incluimos en nuestro VG. Recordais que habíamos creado 2 discos en nuestra VM, pues ahora vamos a usar ese segundo disco tal y como haríamos en un servidor añadiendo un disco físico nuevo.
Confirmamos que nuestro VG no tiene espacio libre, de nuevo con vgs
[root@localhost /]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  datos    1   1   0 wz--n- 196,00m    0
Y seguimos los pasos anteriores para crear una partición en nuestro nuevo disco sdc, los pongo como recordatorio.
[root@localhost /]# fdisk /dev/sdc   Aqui usaríamos n para nueva partición, los valores por defecto para utilizar todo el disco, despues t para cambiar el tipo de partición a una 8e y w para grabar los cambios.

Despues utilizaríamos vgextend para añadir este disco a nuestro VG
[root@localhost /]# vgextend datos /dev/sdc1
  Physical volume "/dev/sdc1" successfully created.
  Volume group "datos" successfully extended

Y confirmamos que en datos tenemos ahora disponible el espacio asignado en sdc1
[root@localhost /]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree 
  datos    2   1   0 wz--n- 704,00m 508,00m
  fedora   1   2   0 wz--n- <11,00g      0 


Con este espacio podemos hacer lo que nos interese, aumentar el tamaño de datos1, crear otro LV, ..., ¿y si lo que necesitamos es reducir el tamaño de un LV?
Primero vamos a comprobar el tamaño de nuestro LV datos1
[root@localhost /]# lvs
  LV     VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  datos1 datos  -wi-a----- 196,00m

Como ya habíamos comentado necesitamos reducir primero el sistema de ficheros, para ello seguimos estos pasos:

Desmontamos la partición datos1

[root@localhost /]# umount /dev/datos/datos1


Despues comprobamos la integridad del sistema de ficheros
[root@localhost /]# e2fsck -f /dev/datos/datos1
e2fsck 1.44.3 (10-July-2018)
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
/dev/datos/datos1: 11/49400 ficheros (0.0% no contiguos), 11884/200704 bloques


Seguidamente reducimos el sistema de ficheros, dejándolo en un tamaño de 100M
[root@localhost /]# resize2fs /dev/datos/datos1 100M
resize2fs 1.44.3 (10-July-2018)
Cambiando el tamaño del sistema de ficheros en /dev/datos/datos1 a 102400 (1k) bloques.
El sistema de ficheros en /dev/datos/datos1 tiene ahora 102400 bloques (de 1k).

Y finalmente reducimos nuestro LV
[root@localhost /]# lvreduce -L 100M /dev/datos/datos1
  WARNING: Reducing active logical volume to 100,00 MiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce datos/datos1? [y/n]: y
  Size of logical volume datos/datos1 changed from 196,00 MiB (49 extents) to 100,00 MiB (25 extents).
  Logical volume datos/datos1 successfully resized.
Nos avisará de que pueden destruirse datos, esto tiene sentido por supuesto si intentamos reducir una partición con 150 Mb de datos ocupados a 100M, podría dejar los datos inutilizables.

Para no alargar más este tutorial sobre LVM dejaré los snapshot para la siguente entrada.

Salu2