LVM (Logical Volume Manager) es un sistema de gestión de volúmenes lógicos más avanzado y flexible que el tradicional método de particionado de disco. LVM mapea volúmenes lógicos definidos y gestionados por LVM en dispositivos listos para ser formateados y utilizados por el sistema operativo subyacente. Entre las ventajas de LVM se destaca la capacidad de redimensionar volúmenes de forma dinámica, crear dispositivos lógicos de gran tamaño a partir de varios dispositivos físicos, crear snapshots de los dispositivos utilizando CoW (copy-on-write), encriptar dispositivos con contraseña, etc.

En la actualidad todas las distribuciones soportan LVM, incluso muchas emplean dispositivos LVM durante la instalación del sistema operativo.

Este artículo explica cómo inicializar un grupo de LVM a partir de una partición como primer volumen físico del grupo y crear volúmenes lógicos desde línea de comandos en Linux. El objetivo es comprender todos los pasos involucrados en la inicialización de LVM: crear volúmenes físicos; definir grupos LVM; y crear volúmenes lógicos.

Como caso de estudio utilizo un servidor GNU/Linux con CentOS 6 instalado, sobre el cual se desea montar un esquema LVM sobre una nueva partición, el cual será dedicado a crear volúmenes lógicos para implementar discos de máquinas virtuales.

Configuración de LVM

El primer paso consiste en crear una nueva partición que será utilizada como volumen físico para dar soporte al grupo LVM. Sobre el disco rígido (utilizando RAID 1) se ha instalado el sistema operativo y se ha dejado una cantidad de espacio sin utilizar al final. Utilizando la herramienta fdisk se crea una nueva partición tipo "Linux LVM":

[root@centos6 ~]# fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
First cylinder (5640-60735, default 5640):
Using default value 5640
Last cylinder, +cylinders or +size{K,M,G} (5640-60735, default 60735):
Using default value 60735

Command (m for help): t
Partition number (1-9): 9
Hex code (type L to list codes): l

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris
 1  FAT12           39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      41  PPC PReP Boot   85  Linux extended  c7  Syrinx
 5  Extended        42  SFS             86  NTFS volume set da  Non-FS data
 6  FAT16           4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS       4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility
 8  AIX             4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt
 9  AIX bootable    50  OnTrack DM      93  Amoeba          e1  DOS access
 a  OS/2 Boot Manag 51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O
 b  W95 FAT32       52  CP/M            9f  BSD/OS          e4  SpeedStor
 c  W95 FAT32 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs
 e  W95 FAT16 (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  GPT
 f  W95 Ext'd (LBA) 55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor
12  Compaq diagnost 61  SpeedStor       a9  NetBSD          f4  SpeedStor
14  Hidden FAT16 <3 63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary
16  Hidden FAT16    64  Novell Netware  af  HFS / HFS+      fb  VMware VMFS
17  Hidden HPFS/NTF 65  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
18  AST SmartSleep  70  DiskSecure Mult b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 75  PC/IX           bb  Boot Wizard hid fe  LANstep
1c  Hidden W95 FAT3 80  Old Minix       be  Solaris boot    ff  BBT
1e  Hidden W95 FAT1
Hex code (type L to list codes): 8e
Changed system type of partition 9 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/sda: 499.6 GB, 499558383616 bytes
255 heads, 63 sectors/track, 60734 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x29c3f6c5

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        1332    10485760   83  Linux
/dev/sda3            1332        1593     2097152   83  Linux
/dev/sda4            1593       60735   475061248    5  Extended
/dev/sda5            1593        2898    10485760   83  Linux
/dev/sda6            2898        3943     8388608   82  Linux swap / Solaris
/dev/sda7            3943        4987     8388608   83  Linux
/dev/sda8            4987        5640     5242880   83  Linux
/dev/sda9            5640       60735   442550240+  8e  Linux LVM

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

Se ha creado la partición número 9 de tipo "8e" ("Linux LVM") y se escribieron los cambios en disco.

Al estar el servidor en uso, puede ser que falle la lectura de la nueva tabla de particiones, incluso corriendo partprobe:

[root@centos6 ~]# partprobe
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (Device or resource busy).  As a result, it may not reflect all of your changes until after reboot.

En este caso será necesario reiniciar el servidor:

[root@centos6 ~]# reboot

Al iniciar nuevamente, se observa la nueva partición:

[root@centos6 ~]# fdisk -l

Disk /dev/sda: 499.6 GB, 499558383616 bytes
255 heads, 63 sectors/track, 60734 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x29c3f6c5

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        1332    10485760   83  Linux
/dev/sda3            1332        1593     2097152   83  Linux
/dev/sda4            1593       60735   475061248    5  Extended
/dev/sda5            1593        2898    10485760   83  Linux
/dev/sda6            2898        3943     8388608   82  Linux swap / Solaris
/dev/sda7            3943        4987     8388608   83  Linux
/dev/sda8            4987        5640     5242880   83  Linux
/dev/sda9            5640       60735   442550240+  8e  Linux LVM

Asignación del volumen físico y creación de grupo y volúmenes lógicos LVM

Habiendo creado una partición vacía, ahora se debe inicializar el volumen físico, en este caso la partición /dev/sda9, y luego crear el grupo que será llamado "vm_group". Por último se crean los volúmenes lógicos para las máquinas virtuales.

Por supuesto es posible utilizar tanto una partición como un disco completo para dar soporte a LVM. Incluso más adelante es posible agregar más volúmenes físicos al grupo utilizando la herramienta vgextend (para aumentar el tamaño o espacio disponible del grupo).

Inicializar el dispositivo físico mediante pvcreate:

[root@centos6 ~]# pvcreate /dev/sda9
  Writing physical volume data to disk "/dev/sda9"
  Physical volume "/dev/sda9" successfully created

Es posible visualizar la información del volumen físico creado ejecutando pvdisplay.

Crear el grupo LVM "vm_group" con vgcreate, pasando el dispositivo físico que dará soporte inicialmente como parámetro:

[root@centos6 ~]# vgcreate vm_group /dev/sda9
  Volume group "vm_group" successfully created

Luego se crean los volúmenes lógicos necesarios utilizando lvcreate:

[root@centos6 ~]# lvcreate -L 20G -n lv_vm1 vm_group
  Logical volume "lv_vm1" created
[root@centos6 ~]# lvcreate -L 2G -n lv_vm2 vm_group
  Logical volume "lv_vm2" created
[root@centos6 ~]# lvcreate -L 2G -n lv_vm3 vm_group
  Logical volume "lv_vm3" created

El utilitario lvcreate toma como parámetro un tamaño de volumen especificado en bytes (mediante la opción -L), un nombre de volumen lógico (con -n) y finalmente el nombre del grupo donde se debe crear (tener en cuenta que puede haber varios grupos LVM en un mismo sistema).

En este ejemplo se han creado 3 volúmenes lógicos: uno de 20 GB y dos de 2GB.

Listar volúmenes físicos, grupos y volúmenes lógicos

Se comprueba el estado de LVM con las herramientas pvscan, vgscan y lvscan. Estas se encargan de escanear volúmenes físicos, grupos y volúmenes lógicos respectivamente.

pvscan escanea volúmenes físicos. Detecta el grupo al que pertenece cada uno y su espacio utilizado:

[root@centos6 ~]# pvscan
  PV /dev/sda9   VG vm_group   lvm2 [422.05 GiB / 398.05 GiB free]
  Total: 1 [422.05 GiB] / in use: 1 [422.05 GiB] / in no VG: 0 [0   ]

vgscan escanea los grupos disponibles en todos los discos conectados y particiones disponibles:

[root@centos6 ~]# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vm_group" using metadata type lvm2

lvscan escanea volúmenes lógicos, detecta su estado, nombre de dispositivo y tamaño:

[root@centos6 ~]# lvscan
  ACTIVE            '/dev/vm_group/lv_vm1' [20.00 GiB] inherit
  ACTIVE            '/dev/vm_group/lv_vm2' [2.00 GiB] inherit
  ACTIVE            '/dev/vm_group/lv_vm3' [2.00 GiB] inherit

En cualquier momento es posible listar volúmenes físicos, grupos y volúmenes lógicos con los utilitarios pvs, vgs y lvs respectivamente.

Formatear y montar volúmenes lógicos

Una vez creados, los volúmenes lógicos se acceden desde /dev, como cualquier dispositivo. La ruta se elabora con el nombre del grupo seguido del nombre del volumen. Por ejemplo el volumen lógico "lv_vm1" se encuentra accesible desde el dispositivo "/dev/vm_group/lv_vm1". También es posible acceder a cada volumen desde el directorio /dev/mapper empleando el siguiente formato: "/dev/mapper/vm_group-lv_vm1".

[root@centos6 ~]# ll /dev/vm_group/lv_vm1 
lrwxrwxrwx 1 root root 7 oct 17 15:17 /dev/vm_group/lv_vm1 -> ../dm-0
[root@centos6 ~]# ll /dev/mapper/vm_group-lv_vm1 
lrwxrwxrwx 1 root root 7 oct 17 15:17 /dev/mapper/vm_group-lv_vm1 -> ../dm-0

Ya que serán utilizados por máquinas virtuales, en este caso de estudio no es necesario formatear ni montar estos dispositivos. Sin embargo, para otros usos, tal vez se desee formatear y montar alguno de los volúmenes.

Formatear el dispositivo correspondiente a cada volumen lógico con cualquier sistema de archivos deseado, por ejemplo EXT4 utilizando mke2fs:

[root@centos6 ~]# mke2fs -t ext4 /dev/vm_group/lv_vm1

Montar el nuevo sistema de archivos:

[root@centos6 ~]# mkdir /mnt/lv_vm1
[root@centos6 ~]# mount /dev/vm_group/lv_vm1 /mnt/lv_vm1

Las herramientas de LVM incluyen una cantidad importante de opciones y parámetros que aumentan la flexibilidad y funcionalidad, al mismo tiempo en que existen utilitarios adicionales para expandir volúmenes físicos (pvresize), lógicos (lvextend) y grupos (vgextend), crear snapshots (lvcreate -s), etc. Este artículo presenta apenas un uso básico de LVM con el objetivo de inicializar un volumen físico y grupo, para luego crear volúmenes lógicos. Es recomendable leer la guía de LVM creada por "The Linux Documentation Project" y disponible en el siguiente enlace, la cual cubre en profundidad todas las características y funcionalidades de LVM:

LVM HOWTO - The Linux Documentation Project

Compartí este artículo