Ampliar partición + LVM en Linux sin perder datos

En este post voy a explicar un caso de uso real que me ha tocado hacer varias veces en mi trabajo.

Imaginemos que tenemos un template linux (en este caso Ubuntu 22.04) en Vmware en nuestro repositorio o content library y tenemos que desplegar una máquina nueva desde dicho template. Por defecto, este template tendrá unas características hardware predefinidas, como puede ser las CPU’s, memoria RAM, tarjetas de red, tamaño de disco duro … etc.

En este caso, nos interesa la parte del disco duro. Al tener un sistema basado en LVM, no habría problema en añadir un segundi disco, crear un Physical Volume, extender el Volume Group correspondiente y finalmente, el Logical Volume.

Pues bien, ahora imaginemos que en lugar de hacer esto, queremos ampliar el disco ya existente y que contiene datos previos, al tratarse de un template. Posteriormente, queremos que el Volume Group se «entere» de ese nuevo espacio extra que le hemos dado.

Para hacer esto, hay que seguir una serie de pasos previos, no complicados, pero si que tenemos que hacer con cuidado, ya que tenemos que eliminar y recrear la partición que nos interesa y no perder datos (en este caso, corromperíamos el sistema operativo). Antes de nada, si o si, realizaremos un snapshots para poder volver al punto de salida, en caso de desastre.

Una vez realizado el snapshot, ampliaremos el disco desde vSphere, de la nueva máquina que hemos desplegado. Por ejemplo, en este caso, pasaremos de unos 60GB inciales, a 250GB.

Posteriormente, arrancamos la máquina, entraremos en ella por SSH o por la consola de vSphere y nos haremos «root«, tras esto, ejecutaremos el comando «fdisk -l«, para ver el particionado del disco en ese momento.

Si te fijas, el disco /dev/sda (el único que tenemos en este caso), ya nos dice que tiene los 250GB que le hemos asignado, pero más abajo, vemos que la partición /dev/sda3, que contiene el sistema operativo en sí, las otras dos particiones, son de arranque.

Más abajo, podemos ver los Logical Volume que existen.

root@testvm:~# fdisk -l
GPT PMBR size mismatch (125829119 != 524287999) will be corrected by write.
Disk /dev/sda: 250 GiB, 268435456000 bytes, 524288000 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7C2CCA97-05FF-40E2-8548-925F77E96C25

Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 4198399 4194304 2G Linux filesystem
/dev/sda3 4198400 125827071 121628672 58G Linux filesystem

Disk /dev/mapper/vg0-lv--root: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/vg0-lv--home: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/vg0-lv--tmp: 2 GiB, 2147483648 bytes, 4194304 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/vg0-lv--opt: 18 GiB, 19327352832 bytes, 37748736 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/vg0-lv--var: 18 GiB, 19323158528 bytes, 37740544 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

El siguiente paso, es recrear dicha partición, asi que procedemos a ello, con el comando «fdisk /dev/sda» y seguimos el siguinte orden de comandos (ANTENTOS).

  • p –> para mostrar la tabla de particiones actual
  • d –> para eliminar una partición
  • Marcamos 3, ya que nos intersa recrear la partición /dev/sda3
  • n –> para crear una nueva partición
  • Marcamos de nuevo 3, para recrear la partición /dev/sda3
  • Cuando nos pregunte «Do you want to remove the signature?«, elegimos «No«, ya que si marcamos «Yes«, es cuando perderemos todos los datos.
  • w –> guardarmos y escribimos los cambios en disco


root@testvm:~# fdisk /dev/sda

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

GPT PMBR size mismatch (125829119 != 524287999) will be corrected by write.
This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.

Command (m for help): p

Disk /dev/sda: 250 GiB, 268435456000 bytes, 524288000 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7C2CCA97-05FF-40E2-8548-925F77E96C25

Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 4198399 4194304 2G Linux filesystem
/dev/sda3 4198400 125827071 121628672 58G Linux filesystem

Command (m for help): d
Partition number (1-3, default 3): 3

Partition 3 has been deleted.

Command (m for help): n
Partition number (3-128, default 3): 3
First sector (4198400-524287966, default 4198400):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4198400-524287966, default 524287966):

Created a new partition 3 of type 'Linux filesystem' and of size 248 GiB.
Partition #3 contains a LVM2_member signature.

Do you want to remove the signature? [Y]es/[N]o: N

Command (m for help): w

The partition table has been altered.
Syncing disks.

Reiniciaremos la máquina para que se apliquen los cambios, este paso es necesario.
root@testvm:~# reboot

Volvemos a ejecutar el comando «fdisk -l» y vemos que tanto el disco como la partición /dev/sda3, tienen ya el espacio real asignado.
root@testvm:~# fdisk -l
Disk /dev/sda: 250 GiB, 268435456000 bytes, 524288000 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7C2CCA97-05FF-40E2-8548-925F77E96C25

Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 4198399 4194304 2G Linux filesystem
/dev/sda3 4198400 524287966 520089567 248G Linux filesystem

Disk /dev/mapper/vg0-lv--root: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/vg0-lv--home: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/vg0-lv--tmp: 2 GiB, 2147483648 bytes, 4194304 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/vg0-lv--opt: 18 GiB, 19327352832 bytes, 37748736 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/vg0-lv--var: 18 GiB, 19323158528 bytes, 37740544 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

El último paso, es ampliar el Physical Volume con el nuevo tamaño, extender el Volume Group y finalmente, asignar el espacio disponible a los Logical Volume, de la manera que necesitemos.

root@testvm:~# pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 vg0 lvm2 a-- <58.00g 0

Con el comando «pvresize» el PV se «enterará» del nuevo tamaño disponible.
root@testvm:~# pvresize /dev/sda3
Physical volume "/dev/sda3" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized

Tras hacer esto, el VG, también verá el nuevo espacio libre, en este caso, de 190GB

root@testvm:~# vgs
VG #PV #LV #SN Attr VSize VFree
vg0 1 5 0 wz--n- <248.00g 190.00g

root@testvm:~# lvs

LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv-home vg0 -wi-ao---- 10.00g
lv-opt vg0 -wi-ao---- 18.00g
lv-root vg0 -wi-ao---- 10.00g
lv-tmp vg0 -wi-ao---- 2.00g
lv-var vg0 -wi-ao---- <18.00g

Y con el comando «lvextend», extenederemos los LV que queramos en base a nuestras necesidades.


root@testvm:~# lvextend -L +90.00g /dev/mapper/vg0-lv–var
Size of logical volume vg0/lv-var changed from <18.00 GiB (4607 extents) to <108.00 GiB (27647 extents).
Logical volume vg0/lv-var successfully resized.

root@testvm:~# lvextend -l +100%FREE /dev/mapper/vg0-lv–opt
Size of logical volume vg0/lv-opt changed from 18.00 GiB (4608 extents) to 118.00 GiB (30208 extents).
Logical volume vg0/lv-opt successfully resized.

root@testvm:~# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv-home vg0 -wi-ao---- 10.00g
lv-opt vg0 -wi-ao---- 118.00g
lv-root vg0 -wi-ao---- 10.00g
lv-tmp vg0 -wi-ao---- 2.00g
lv-var vg0 -wi-ao---- <108.00g

Para que los LV reconozcan el nuevo espacio, hay que ejecutar el comando «resize2fs» (para filesystems basados en EXT3/4) o «xfs_growfs» (para filesystems basados en XFS).
root@testvm:~# resize2fs /dev/mapper/vg0-lv–var
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mapper/vg0-lv--var is mounted on /var; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 14
The filesystem on /dev/mapper/vg0-lv--var is now 28310528 (4k) blocks long.

root@testvm:~# resize2fs /dev/mapper/vg0-lv–opt
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mapper/vg0-lv--opt is mounted on /opt; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 15
The filesystem on /dev/mapper/vg0-lv--opt is now 30932992 (4k) blocks long.

Para comprobar los cambios, podemos ejecutar el comando «df -h», para ver los filesystems montados en nuestro sistema y su espacio en formato «humano» ( parámetro -h).

root@testvm:~# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 794M 1.2M 793M 1% /run
/dev/mapper/vg0-lv--root 9.8G 3.0G 6.4G 32% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 2.0G 251M 1.6G 14% /boot
/dev/mapper/vg0-lv--home 9.8G 88K 9.3G 1% /home
/dev/mapper/vg0-lv--tmp 2.0G 72K 1.8G 1% /tmp
/dev/mapper/vg0-lv--var 107G 1.2G 101G 2% /var
/dev/mapper/vg0-lv--opt 116G 24K 112G 1% /opt
tmpfs 794M 4.0K 794M 1% /run/user/1262602059

Espero que este tip te sea de utilidad.

Un saludo Sysadmins! 🙂

Deja un comentario


El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.