Uno de los sistemas de archivos de un servidor, alojado en un volumen lógico LVM, necesitaba más espacio. Pero el grupo LVM al que pertenecía el volumen no tenía espacio libre. Por ende no quedó otra alternativa que incrementar el tamaño del grupo LVM. Para hacerlo existen dos posibilidades: agregar un nuevo disco o partición al grupo; o redimensionar uno de los discos o particiones pertenecientes al mismo. Anteriormente he explicado cómo redimensionar un disco físico perteneciente a un grupo LVM, pero en este caso en particular necesitaba redimensionar una partición LVM de un disco físico, lo que significa que además de aumentar el tamaño del disco es necesario luego modificar el tamaño de la partición subyacente. Es decir, aumentar el tamaño del disco y luego expandir la última partición del mismo para que utilice el nuevo espacio disponible al final del disco.
En síntesis, se deben realizar los siguientes pasos:
- Hacer un backup fresco de toda la información en el servidor.
- Crear un snapshot del disco si la tecnología de virtualización lo permite.
- Modificar el tamaño del disco (lógicamente se trata de una máquina virtual).
- Hacer un backup
- Hacer un backup
- Hacer un backup
- ¿Mencioné hacer un backup?
- Redimensionar la partición dentro del disco.
- Notificar al grupo LVM acerca del nuevo tamaño de la partición.
- Aumentar el tamaño del volumen lógico LVM de acuerdo al nuevo espacio disponible en el grupo LVM.
- Expandir el sistema de archivos en el volumen lógico.
El requerimiento en el servidor es aumentar el espacio disponible en el sistema de archivos /usr/local
:
[root@centos6 ~]# df -h /usr/local Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_srv-lv_usrlocal 15G 13G 1,8G 88% /usr/local
Este sistema de archivos se encuentra dentro del volumen lógico lv_usrlocal
perteneciente al grupo vg_srv
:
[root@centos6 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_usrlocal vg_srv -wi-ao---- 14,99g home vg_centos -wi-ao---- 500,00m root vg_centos -wi-ao---- 2,93g swap vg_centos -wi-ao---- 1,50g tmp vg_centos -wi-ao---- 1000,00m var vg_centos -wi-ao---- 3,91g
Sin embargo, el grupo vg_srv
no posee espacio disponible para ampliar el volumen lógico:
[root@centos6 ~]# vgs VG #PV #LV #SN Attr VSize VFree vg_srv 2 1 0 wz--n- 14,99g 0 vg_centos 1 5 0 wz--n- 9,80g 0
El grupo está conformado por los volúmenes físicos /dev/sdb1
y /dev/sdb2
(sendas particiones del disco /dev/sdb
):
[root@centos6 ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 vg_centos lvm2 a--u 9,80g 0 /dev/sdb1 vg_srv lvm2 a--u 10,00g 0 /dev/sdb2 vg_srv lvm2 a--u 5,00g 0
Preparación
Luego de redimensionar el disco /dev/sdb
de la máquina virtual (el procedimiento depende de cada tecnología de virtualización), es necesario preparar el terreno para modificar la tabla de particiones del mismo. Como se va a alterar una partición, es necesario desmontar cualquier sistema de archivos que posea. Sin embargo, en este caso la partición no posee un sistema de archivos sino que es parte de un grupo LVM. Por ende es necesario desmontar todos los sistemas de archivos que puedan estar utilizando espacio de la misma.
Hay una forma de determinar qué volúmenes lógicos están hospedados en un determinado volumen físico (PV, Physical volume en la jerga LVM), y es utilizando la opción -m
(maps) del comando pvdisplay
:
[root@centos6 ~]# pvdisplay -m /dev/sdb2 --- Physical volume --- PV Name /dev/sdb2 VG Name vg_srv PV Size 9,99 GiB / not usable 551,00 KiB Allocatable yes (but full) PE Size 4,00 MiB Total PE 2558 Free PE 0 Allocated PE 2558 PV UUID NwIRyN-PnVd-dSUK-vklY-fBJH-rQve-CavDOi --- Physical Segments --- Physical extent 0 to 2557: Logical volume /dev/vg_srv/lv_usrlocal Logical extents 2559 to 5116
En este servidor, tal como se observa en la salida de pvdisplay
, sólo es necesario desmontar el sistema de archivos que posee el volumen lógico lv_usrlocal
(/usr/local
).
Detener todo servicio o proceso que esté trabajando con archivos dentro de dicho filesystem:
[root@centos6 ~]# lsof | grep /usr/local/ | wc -l 0
Desmontar el filesystem:
[root@centos6 ~]# umount /usr/local/
Todo listo para redimensionar la partición /dev/sdb2
.
Redimensionar una partición con fdisk
[root@centos6 ~]# fdisk /dev/sdb 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):
Imprimir la tabla de particiones para verificar los límites de la partición:
Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 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: 0x000789c7 Device Boot Start End Blocks Id System /dev/sdb1 1 1306 10484736 8e Linux LVM /dev/sdb2 1306 1958 5241875 8e Linux LVM
Se observa que la partición /dev/sdb2
comienza en el sector 1306.
El método para redimensionar una partición con fdisk
consiste en borrarla y volverla a crear con el nuevo tamaño. Sin embargo, es imprescindible que comience en exactamente el mismo sector.
Mas vale contar con copias de seguridad de absolutamente TODO antes de ejecutar el siguiente paso. Este cambio puede provocar la destrucción total o parcial de los datos en el servidor.
Eliminar la partición /dev/sdb2
:
Command (m for help): d Partition number (1-4): 2 Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 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: 0x000789c7 Device Boot Start End Blocks Id System /dev/sdb1 1 1306 10484736 8e Linux LVM
Crear nuevamente la partición /dev/sdb2
. Verificar que ésta comience en exactamente el mismo sector que antes (1306):
Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (1306-2610, default 1306): Using default value 1306 Last cylinder, +cylinders or +size{K,M,G} (1306-2610, default 2610): Using default value 2610 Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 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: 0x000789c7 Device Boot Start End Blocks Id System /dev/sdb1 1 1306 10484736 8e Linux LVM /dev/sdb2 1306 2610 10479065 83 Linux
El final de la partición depende de las necesidades, en este caso se ha especificado hasta el final del disco.
Luego es recomendable cambiar el tipo de la partición a "8e" (Linux LVM) con el comando 't'.
Hasta este punto no se han efectuado cambios en el disco (sólo en memoria). Es posible arrepentirse y salir sin tocar la tabla de particiones del disco.
Escribir la nueva tabla de particiones en el disco ejecutando w
:
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. [root@centos6 ~]#
Este comando escribe los cambios y cierra la aplicación. Se observa en la salida que pide ejecutar partprobe
para notificar al kernel Linux acerca de la nueva tabla de particiones.
Redimensionar el volumen lógico LVM
El tamaño del volumen físico LVM sigue siendo 5 GB:
[root@centos6 ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 vg_centos lvm2 a--u 9.80g 0 /dev/sdb1 vg_srv lvm2 a--u 10.00g 0 /dev/sdb2 vg_srv lvm2 a--u 5.00g 0
Al ejecutar partprobe
y redimensionar el tamaño del volumen físico (pvresize
), éste no cambia:
[root@centos6 ~]# partprobe /dev/sdb2 [root@centos6 ~]# pvresize /dev/sdb2 Physical volume "/dev/sdb2" changed 1 physical volume(s) resized / 0 physical volume(s) not resized [root@centos6 ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 vg_centos lvm2 a--u 9.80g 0 /dev/sdb1 vg_srv lvm2 a--u 10.00g 0 /dev/sdb2 vg_srv lvm2 a--u 5.00g 0
Sin embargo, fdisk
ve el tamaño de partición correcto:
[root@centos6 ~]# fdisk -l /dev/sdb Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 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: 0x000789c7 Device Boot Start End Blocks Id System /dev/sdb1 1 1306 10484736 8e Linux LVM /dev/sdb2 1306 2610 10479065 8e Linux LVM
En este punto no encontré otra alternativa que reiniciar el sistema y ejecutar nuevamente pvresize
:
[root@centos6 ~]# reboot
[root@centos6 ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 vg_centos lvm2 a--u 9,80g 0 /dev/sdb1 vg_srv lvm2 a--u 10,00g 0 /dev/sdb2 vg_srv lvm2 a--u 5,00g 0 [root@centos6 ~]# pvresize /dev/sdb2 Physical volume "/dev/sdb2" changed 1 physical volume(s) resized / 0 physical volume(s) not resized [root@centos6 ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 vg_centos lvm2 a--u 9,80g 0 /dev/sdb1 vg_srv lvm2 a--u 10,00g 0 /dev/sdb2 vg_srv lvm2 a--u 9,99g 5,00g
El resto sigue tal como lo expliqué anteriormente en el artículo Redimensionar volúmenes físicos, volúmenes lógicos y grupos en LVM.
Desmontar los filesystems involucrados y extender el volumen lógico:
[root@centos6 ~]# lvextend -l+100%FREE /dev/vg_srv/lv_usrlocal Size of logical volume vg_srv/lv_usrlocal changed from 14,99 GiB (3838 extents) to 19,99 GiB (5117 extents). Logical volume lv_usrlocal successfully resized. [root@centos6 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_usrlocal vg_srv -wi-a----- 19,99g home vg_centos -wi-ao---- 500,00m root vg_centos -wi-ao---- 2,93g swap vg_centos -wi-ao---- 1,50g tmp vg_centos -wi-ao---- 1000,00m var vg_centos -wi-ao---- 3,91g
Expandir el filesystem
Expandir el filesystem del volumen lógico:
[root@centos6 ~]# e2fsck -f /dev/vg_srv/lv_usrlocal
[root@centos6 ~]# resize2fs /dev/vg_srv/lv_usrlocal
Montar y verificar:
[root@centos6 ~]# mount -a [root@centos6 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_centos-root 2,9G 1,5G 1,3G 53% / tmpfs 939M 0 939M 0% /dev/shm /dev/sda1 194M 29M 155M 16% /boot /dev/mapper/vg_centos-home 477M 37M 416M 9% /home /dev/mapper/vg_centos-tmp 969M 3,8M 915M 1% /tmp /dev/mapper/vg_centos-var 3,8G 257M 3,4G 7% /var /dev/mapper/vg_srv-lv_usrlocal 20G 13G 6,4G 66% /usr/local
Fuente: linuxito