How to Expand a Linux VM Disk and Filesystem Without Rebooting

Cómo expandir el disco y el sistema de archivos de una máquina virtual Linux sin reiniciar

En Guías, Linux, Virtualización by KevinLeave a Comment

¿Alguna vez te ha pasado que estás a punto de quedarte sin espacio en una Máquina virtual Linux, necesitas ampliar el almacenamiento como sea, pero no puedes darte el lujo de reiniciarlo? En este artículo te voy a enseñar paso a paso cómo aumentar la partición raíz con el servidor encendido.

Expandir el disco virtual desde tu hipervisor suele ser fácil, pero lograr que el sistema operativo reconozca y aproveche ese nuevo espacio requiere un par de ajustes más. La buena noticia es que casi todas las distribuciones modernas de Linux soportan la expansión del sistema de archivos «en vivo». Es decir: ganas almacenamiento sin reiniciar y sin tirar tus aplicaciones ni un solo segundo.

En esta guía repasaremos el proceso general y veremos las configuraciones de almacenamiento más habituales para máquinas virtuales Linux en plataformas como:

  • KVM / QEMU
  • VMware ESXi
  • Microsoft Hyper-V
  • Xen
  • VirtualBox
  • Proveedores en la nube con discos VirtIO, SCSI o NVMe

Ten en cuenta que los comandos exactos dependerán de cómo tengas estructurado el disco, tu sistema de archivos y la tecnología de almacenamiento que utilices.

Entender las capas de almacenamiento de una máquina virtual Linux

Es fundamental entender dónde se encuentra el espacio disponible en cada momento. El disco de una máquina virtual se compone de varias capas:

Hipervisor
    |
    ↓
Disco virtual (VMDK/QCOW2/VHDX/VHD)
    |
    ↓
Dispositivo de bloques de Linux (/dev/sda, /dev/vda, /dev/nvme0n1)
    |
    ↓
Partición / LVM / RAID
    |
    ↓
Sistema de Archivos (ext4, XFS, Btrfs)
    |
    ↓
Directorio Montado (/)

La ampliación del disco virtual solo modifica la primera capa. Por ejemplo:

Antes:

Virtual disk: 50GB

/dev/vda
└── /dev/vda1
        └── ext4 filesystem (50GB)

Despues de ampliar el disco:

Virtual disk: 100GB

/dev/vda
└── /dev/vda1
        └── ext4 filesystem (50GB)

Unused space: 50GB

El almacenamiento adicional no está disponible automáticamente. Es necesario expandir la partición y el sistema de archivos para que Linux pueda aprovechar esa capacidad extra.

Requisitos Previos

Antes de ponerte a tocar nada, asegúrate de contar con:

  • Acceso de administración al hipervisor de la máquina virtual.
  • Permisos para redimensionar el disco virtual en el hipervisor.
  • Acceso por SSH a la máquina virtual.
  • Una copia de seguridad o una instantánea (snapshot) reciente.
  • Claridad sobre cómo está estructurado el almacenamiento actual.

1. Comprueba la estructura actual del disco

Lo primero es identificar cómo está configurado el sistema en este momento.

Empieza ejecutando lsblk:

root@server01:~# lsblk

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
vda    252:0    0   50G  0 disk
├─vda1 252:1    0    1G  0 part /boot
└─vda2 252:2    0   49G  0 part /

Esto te mostrará:

  • Que el disco (vda) tiene 50 GB
  • Que la partición raíz (vda2) solo ocupa 49 GB.

Comprueba el uso del sistema de archivos

root@server01:~# df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        49G   43G  4.0G  92% /
/dev/vda1       974M  120M  854M  13% /boot

2. Ampliar el disco virtual

El primer paso se realiza a nivel de hipervisor. Aumenta el tamaño del disco virtual hasta la capacidad final que quieras. Por ejemplo, si el disco actual tiene 50 GB y necesitas 50 GB adicionales, redimensiona el disco virtual a 100 GB.

Aumenta el tamaño del disco:

  • Máquina virtual → Editar configuración → Disco duro → Aumentar capacidad

En PowerShell:

Resize-VHD 
  -Path "LinuxServer01.vhdx" 
  -SizeBytes 100GB

VBoxManage modifymedium disk LinuxServer01.vdi --resize 102400

Dado que:

100GB × 1024MB = 102400MB

El comando qemu-img resize funciona de forma distinta según la sintaxis. Sin el prefijo +, establece el tamaño final:

qemu-img resize linux-server.qcow2 100G

Con el prefijo +, añade espacio adicional:

qemu-img resize linux-server.qcow2 +50G

Ambas opciones dan el mismo resultado:

50GB + 50GB = 100GB

Para una Máquina Virtual en ejecución:

virsh blockresize linux-server /var/lib/libvirt/images/linux-server.qcow2 100G

El comando exacto dependerá del motor de almacenamiento (backend) de Xen. Por ejemplo, para un disco virtual basado en LVM:

lvextend -L +50G /dev/vg/vm-disk

Llegados a este punto, el disco en el hipervisor ya es más grande, pero eso no significa que Linux se haya enterado todavía del cambio.

3. Vuelve a escanear el disco desde Linux

Tras redimensionar el disco virtual, es muy probable que Linux no detecte la capacidad adicional de forma inmediata.

root@server01:~# lsblk

NAME   SIZE TYPE MOUNTPOINTS
vda     50G disk
├─vda1   1G part /boot
└─vda2  49G part /

Si el disco sigue mostrando el tamaño antiguo, nos tocará forzar un reescaneo del dispositivo.

Reescanea según el tipo de dispositivo:

Para discos SCSI:

echo1 > /sys/class/block/sda/device/rescan

Para discos VirtIO:

echo1 > /sys/class/block/vda/device/rescan

Para NVMe:

nvme rescan

Comprobación

Verifica el nuevo tamaño tras escanear el dispositivo:

root@server01:~# lsblk

NAME   SIZE TYPE MOUNTPOINTS
vda    100G disk
├─vda1   1G part /boot
└─vda2  49G part /

Ahora Linux ya reconoce el almacenamiento extra. Sin embargo, ten en cuenta que la partición todavía no ha aumentado de tamaño.

4. Determina tu tipo de almacenamiento

El procedimiento de expansión dependerá de cómo esté configurado el disco.

Las estructuras más habituales incluyen:

  • Particiones estándar
  • LVM
  • RAID por software
  • ZFS
  • Volúmenes cifrados

Las configuraciones más comunes en Linux son las particiones estándar y LVM.

Particiones tradicionales

Ejemplo:

/dev/vda1 → /

Herramientas:

  • fdisk
  • parted
  • resize2fs
  • xfs_growfs

LVM

Ejemplo:

/dev/vda
 └── partition
      └── volume group
            └── logical volume /

Herramientas:

  • pvresize
  • lvextend
  • resize2fs
  • xfs_growfs

Por lo general, LVM es la estructura más fácil de expandir.

Otras tecnologías de almacenamiento

Algunos entornos utilizan:

  • RAID
  • ZFS
  • Btrfs
  • Volúmenes cifrados

Cada una de estas opciones requiere su propio procedimiento específico de expansión.

5. Expandir un sistema de archivos raíz en LVM

LVM es lo más habitual en distribuciones Linux empresariales y en multitud de imágenes para la nube.

Comprobar el disco LVM

Primero, comprueba si efectivamente se está utilizando LVM:

root@server01:~# lsblk

NAME                 SIZE TYPE MOUNTPOINTS
vda                   50G disk
└─vda2                50G part
  └─ubuntu--vg-root   50G lvm  /

Tras ampliar el disco virtual a 100 GB y reescanearlo:

root@server01:~# lsblk

NAME                 SIZE TYPE MOUNTPOINTS
vda                  100G disk
└─vda2               100G part
  └─ubuntu--vg-root   50G lvm  /

El disco y la partición son ahora más grandes, pero el volumen lógico sigue utilizando los 50 GB originales.

Comprueba los grupos de volúmenes:

root@server01:~# vgdisplay

  VG Name               ubuntu-vg
  VG Size               98.00 GiB
  Alloc PE / Size       49.00 GiB
  Free PE / Size        49.00 GiB

Redimensionar el volumen físico

root@server01:~# pvresize /dev/vda2

Physical volume "/dev/vda2" changed
1 physical volume(s) resized or updated

Extender el volumen lógico

root@server01:~# lvextend -l +100%FREE /dev/ubuntu-vg/root

Size of logical volume ubuntu-vg/root changed from 49.00 GiB to 98.00 GiB.
Logical volume ubuntu-vg/root successfully resized.

O como alternativa:

lvextend -L +50G /dev/mapper/root

Expandir el sistema de archivos

Para ext4:

root@server01:~# resize2fs /dev/ubuntu-vg/root

resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/ubuntu-vg/root is mounted on /; on-line resizing required
The filesystem on /dev/ubuntu-vg/root is now 25690112 (4k) blocks long.

Para XFS:

root@server01:~# xfs_growfs /

data blocks changed from 12845056 to 25690112

Comprobación

root@server01:~# df -h /

Filesystem                   Size Used Avail Use%
/dev/mapper/ubuntu--vg-root   98G  43G   51G  46% /

6. Expandir una partición tradicional

Algunas instalaciones de Linux utilicen una estructura simple de particiones sin LVM.

Ejemplo:

root@server01:~# fdisk -l /dev/vda

Device      Start     End        Sectors    Size
/dev/vda1   2048      96471039   96468991   46G
/dev/vda2   96471040  104857599  8386559    4G

El dato verdaderamente crítico aquí es el sector de inicio (Start).

Al recrear la partición, este sector inicial debe mantenerse exactamente igual. Si te equivocas en este punto, puedes corromper el sistema de archivos y dejarlo inaccesible.

Desactivar la memoria de intercambio (Swap), si procede

Si la swap está en una partición dedicada (⚠️ asegúrate de que tu sistema aguante un rato encendido sin swap):

swapoff -a

Eliminar las particiones

Vamos a reconfigurar las particiones usando fdisk. Lo primero será borrar las dos particiones existentes. Ejecuta fdisk /dev/vda, pulsa d para eliminar la partición 2 y luego haz lo mismo para borrar la partición 1:

root@prod-deb-01:~# fdisk /dev/vda

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

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

⚠️ Importante: Este proceso modifica la tabla de particiones. Las particiones existentes se eliminan y se vuelven a crear con nuevos límites. Los datos se conservan únicamente porque las particiones se recrean utilizando exactamente los mismos sectores de inicio. Comprueba siempre el sector inicial antes de guardar los cambios y asegúrate de tener una copia de seguridad o una instantánea funcional.

Recrear las particiones

A continuación, volvemos a crear nuestras particiones. Como teníamos 4 GB de espacio swap, queremos conservar al menos la misma cantidad para la nueva partición de intercambio (o aumentar su tamaño si lo prefieres).

Primero, recreamos /dev/vda1:

  1. Pulsa n para crear una nueva partición.
  2. Introduce p para crear una partición primaria.
  3. Puedes pulsar Enter para aceptar el valor predeterminado de 2048 para el primer sector.
  4. Después, introduce el tamaño deseado. Puedes poner el valor en GB; por tanto, si estamos ampliando el disco a 100 GB, restamos los 4 GB de la swap e introducimos +96G para asignar 96 GB.
Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-209715199, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199): +96G

Created a new partition 1 of type 'Linux' and of size 96 GiB.

A continuación, recreamos la partición swap:

  1. Pulsa n y luego p para crear otra partición primaria.
  2. Pulsa Enter para aceptar el valor predeterminado en «First sector».
  3. Vuelve a pulsar Enter para aceptar también el valor predeterminado en «Last sector».
Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (201328640-209715199, default 201328640):
Last sector, +sectors or +size{K,M,G,T,P} (201328640-209715199, default 209715199):

Created a new partition 2 of type 'Linux' and of size 4 GiB.

Dado que esta partición se va a utilizar para la swap, necesitamos cambiarle el tipo desde fdisk:

  1. Pulsa t.
  2. Introduce 2 para seleccionar la segunda partición.
  3. Si quieres ver la lista completa de tipos de partición disponibles, pulsa L; de lo contrario, introduce 82 para seleccionar Linux swap / Solaris.
Command (m for help): t
Partition number (1,2, default 2): 2
Partition type (type L to list all types): L

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

El propio fdisk debería informarnos de que se ha cambiado el tipo de partición:

Changed type of partition 'Linux' to 'Linux swap / Solaris'.

Tras esto, guardamos los cambios usando el comando w:

Command (m for help): w

Es probable que veas un mensaje similar a este antes de salir:

The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: 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).

Actualizar la tabla de particiones del kernel sin reiniciar

Podemos indicarle al kernel las nuevas particiones ejecutando partprobe:

root@prod-deb-01:~# partprobe

Expandir el sistema de archivos

Una vez hayamos ampliado la partición, expandimos el sistema de archivos:

ext4:

resize2fs /dev/vda2

Ejemplo:

resize2fs 1.47.0
Filesystem at /dev/vda2 is mounted on /; on-line resizing required
The filesystem on /dev/vda2 is now 39062500 blocks long.

XFS:

xfs_growfs /

Ejemplo:

meta-data=/dev/vda2
data blocks changed from 12800000 to 39062500

BTRFS:

btrfs filesystem resize max /

Inicializar la nueva partición swap (/dev/vda2)

Al haber recreado la partición swap, toca volver a inicializarla:

root@prod-deb-01:~# mkswap /dev/vda2
Setting up swapspace version 1, size = 4193276 KiB
no label, UUID=c55c25a2-a386-4653-8455-4d9030586dd2

A continuación, editamos /etc/fstab y reemplazamos el UUID antiguo por el nuevo que nos acaba de devolver la orden mkswap. La línea que hay que modificar no tiene valor en el punto de montaje (mount point) y su tipo (type) está definido como swap:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
UUID=332f8fb5-ff1f-4297-b512-f2c93a277296 /               ext4    errors=remount-ro 0       1
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0
UUID=c55c25a2-a386-4653-8455-4d9030586dd2       none    swap    sw      0       0

Volver a activar la swap

Tras editar /etc/fstab, solo queda volver a activar la memoria de intercambio:

root@prod-deb-01:~# swapon -a

7. Expandir almacenamiento en ZFS

ZFS funciona de una forma un tanto distinta. Una vez hayas ampliado el tamaño del disco virtual:

Comprueba el estado del grupo de almacenamiento (pool):

zpool status

Expande el dispositivo:

zpool online -e pool_name device_name

Comprobación:

zpool list

8. Comprueba la expansión

Comprueba el sistema de archivos:

df-h /

Filesystem      Size Used Avail Use%
/dev/vda2       96G   43G   49G47% /

Comprueba la estructura de las particiones:

lsblk

NAME   SIZE TYPE MOUNTPOINTS
vda    100G disk
├─vda1   1G part /boot
└─vda2  96G part /

Confirma el tiempo de actividad (uptime):

uptime14:32:51 up147 days,4:21,2 users, load average:0.05,0.02,0.00

El servidor se ha ampliado correctamente sin necesidad de reiniciar.

Cuándo podría seguir haciendo falta un reinicio

Aunque la expansión en caliente funciona en la gran mayoría de los sistemas Linux modernos, existen situaciones concretas en las que no te quedará más remedio que programar una parada:

  • El kernel no es capaz de volver a leer la tabla de particiones.
  • La estructura de la partición raíz cambia de forma imprevista.
  • Se están utilizando sistemas de archivos muy antiguos.
  • Hay discos cifrados que requieren pasos adicionales.
  • Se necesita reconstruir los metadatos de un RAID.
  • El hipervisor no admite el redimensionamiento de discos en vivo.

referencias

1. KVM / QEMU / libvirt

2. VMware ESXi y vSphere

3. Microsoft Hyper-V

4. VirtualBox

5. Xen / XenServer / XCP-ng

  • Documentación oficial de XenServer: XenServer Storage Management Guide
    • Explains Virtual Disk Image (VDI) properties and storage repository expansion.
  • Explica las propiedades de las imágenes de disco virtual (VDI) y la expansión de repositorios de almacenamiento.
  • Documentación de Xen Orchestra: Xen Orchestra Infrastructure & Storage Management
  • Documentación para gestionar y redimensionar VDIs invitadas en entornos modernos basados en Xen.

Leave a Comment

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.