dd-fdisk.png

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:

  1. Hacer un backup fresco de toda la información en el servidor.
  2. Crear un snapshot del disco si la tecnología de virtualización lo permite.
  3. Modificar el tamaño del disco (lógicamente se trata de una máquina virtual).
  4. Hacer un backup
  5. Hacer un backup
  6. Hacer un backup
  7. ¿Mencioné hacer un backup?
  8. Redimensionar la partición dentro del disco.
  9. Notificar al grupo LVM acerca del nuevo tamaño de la partición.
  10. Aumentar el tamaño del volumen lógico LVM de acuerdo al nuevo espacio disponible en el grupo LVM.
  11. 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

¿Quién está en línea?

Hay 14109 invitados y ningún miembro en línea