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