
Cómo expandir el disco y el sistema de archivos de una máquina virtual Linux sin reiniciar
¿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: 50GBEl 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 100GBVBoxManage 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:
- Pulsa
npara crear una nueva partición. - Introduce
ppara crear una partición primaria. - Puedes pulsar Enter para aceptar el valor predeterminado de
2048para el primer sector. - 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
+96Gpara 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:
- Pulsa
ny luegoppara crear otra partición primaria. - Pulsa Enter para aceptar el valor predeterminado en «First sector».
- 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:
- Pulsa
t. - Introduce
2para seleccionar la segunda partición. - Si quieres ver la lista completa de tipos de partición disponibles, pulsa
L; de lo contrario, introduce82para seleccionarLinux 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
- Documentación de
qemu-img: QEMU Utilities Documentation –qemu-img- Covers offline disk creation and expansion syntax (
qemu-img resize).
- Covers offline disk creation and expansion syntax (
- Manual de referencia de
virsh: libvirt Management Utilities –virsh blockresize- Details how to resize a running virtual machine’s block device via
virsh blockresize.
- Details how to resize a running virtual machine’s block device via
2. VMware ESXi y vSphere
- Guía de gestión de discos de VMware ESXi: VMware Docs – Increasing the Virtual Disk Size
- Guides you through expanding capacity in vSphere/ESXi Edit Settings.
3. Microsoft Hyper-V
- Módulo de PowerShell en Microsoft Learn: Microsoft Learn –
Resize-VHD- Details syntax and parameters for expanding
.vhdxfiles online and offline.
- Details syntax and parameters for expanding
4. VirtualBox
- Manual de Oracle VirtualBox: Oracle VM VirtualBox –
VBoxManage modifymedium- Official CLI reference for resizing virtual disk images (
--resizeparameter).
- Official CLI reference for resizing virtual disk images (
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.