Redimensionar las imágenes de discos qcow2

Vamos a ver como podemos ampliar y reducir los discos qcow2 de nuestras máquinas virtuales sin afectar a su contenido. Es una tarea que, si se hace una buena planificación, no tendremos que realizar a menudo, pero si trabajamos mucho con VM al final es muy posible que nos surja la necesidad.

Comenzamos con una VM en un disco qcow2 de 80GB. Estos son los datos de las particiones que tenemos, mostrados desde la misma VM:

$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 80G 0 disk
├─vda1 252:1 0 1M 0 part
└─vda2 252:2 0 80G 0 part /

En el equipo donde vamos a hacer los cambios, normalmente el hipervisor, vamos a necesitar herramientas que se encuentran en libguestfs-tools, a si que lo primero las instalamos:

sudo apt install libguestfs-tools

Con la VM ya apagada, comenzamos revisando los datos del disco:

$ ls -ltrh
total 6.0G
-rw------- 1 david david 81G Jul 31 08:52 fwu2004.qcow2

Podemos usar qemu-img:

$ qemu-img info fwu2004.qcow2 
image: fwu2004.qcow2
file format: qcow2
virtual size: 80 GiB (85899345920 bytes)
disk size: 5.96 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
refcount bits: 16
corrupt: false

Para ver las particiones usamos virt-filesystems:

$ sudo virt-filesystems --long --parts --blkdevs -h -a fwu2004.qcow2 
Name Type MBR Size Parent
/dev/sda1 partition - 1.0M /dev/sda
/dev/sda2 partition - 80G /dev/sda
/dev/sda device - 80G

Como vemos el tamaño real ocupado es de unos 6G y la partición que queremos modificar es la /dev/sda2.

La opción de ampliar el disco de la VM es seguramente la más común, y además la más fácil, así que vamos a comenzar con ampliar el disco.

Ampliar el disco .qcow2

Vamos a añadir a nuestro disco 40G, de tal manera que tendremos un disco de 120G.

Siempre que trabajemos con los ficheros de las VM lo haremos sobre una copia. Al modificar las particiones es posible equivocarse y que algo no salga según lo esperado, pero al trabajar desde una copia en caso de fallo la recuperación es trivial

Copiamos el fichero qcow2 a una carpeta para trabajar sobre la copia:

sudo cp /var/lib/libvirt/images/fwu2004-cp.qcow2 ./

Ampliamos el disco:

$ qemu-img resize fwu2004.qcow2 +40G
Image resized.

Esto solo ha ampliado la imagen, pero no el sistema de ficheros. Para esto vamos a usar virt-resize. Esta utilidad trabaja de una imagen a otra, por lo que para tener una imagen de origen vamos a hacer una copia de nuestra imagen y usarla una de origen y otra de destino:

$ cp fwu2004.qcow2 cpfwu2004.qcow2 
$ sudo virt-resize --expand /dev/sda2 cpfwu2004.qcow2 fwu2004.qcow2
[sudo] password for david:
[ 0.0] Examining cpfwu2004.qcow2
**********

Summary of changes:

/dev/sda1: This partition will be left alone.

/dev/sda2: This partition will be resized from 80.0G to 120.0G. The
filesystem ext4 on /dev/sda2 will be expanded using the ‘resize2fs’
method.

**********
[ 5.6] Setting up initial partition table on fwu2004.qcow2
[ 13.9] Copying /dev/sda1
[ 14.0] Copying /dev/sda2
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
[ 234.8] Expanding /dev/sda2 using the ‘resize2fs’ method

Resize operation completed with no errors. Before deleting the old disk,
carefully check that the resized disk boots and works correctly.

La aplicación nos indica que va a realizar una ampliación de /dev/sda2 de 80.0G a 120.0G. Al final nos indica que no se han reportado errores. Comprobamos la imagen resultante:

$ sudo qemu-img info fwu2004.qcow2 
image: fwu2004.qcow2
file format: qcow2
virtual size: 120 GiB (128849018880 bytes)
disk size: 5.97 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
refcount bits: 16
corrupt: false
$ sudo virt-filesystems --long --parts --blkdevs -h -a fwu2004.qcow2
Name Type MBR Size Parent
/dev/sda1 partition - 1.0M /dev/sda
/dev/sda2 partition - 120G /dev/sda
/dev/sda device - 120G -

Y ya podemos usar nuestra nueva imagen. La ponemos en nuestra ruta de almacenamiento sustituyendo a la original o creando una nueva VM usando ese disco.

Reducir el tamaño del disco qcow2

En este caso queremos reducir el tamaño del disco qcow2. Queremos mantener los datos, por lo que siempre reducimos del espacio no ocupado del disco (aunque asignado).

Tenemos como antes un disco con las siguientes particiones:

$ sudo virt-filesystems --long --parts --blkdevs -h -a fwu2004-cp.qcow2 
Name Type MBR Size Parent
/dev/sda1 partition - 1.0M /dev/sda
/dev/sda2 partition - 80G /dev/sda
/dev/sda device - 80G

Como antes, el tamaño real ocupado es de unos 6G. Queremos reducir el tamaño del disco qcow2 de 80G a 30G.

Lo primero que tenemos que hacer es reducir la partición /dev/sda2 para que no ocupe todo el disco. La pondremos aproximadamente de 30G.

Para reducir la partición voy a arrancar la VM desde un CD de reparación. Voy a utilizar SystemRescueCd que es una versión Life con opciones de reparación. En este caso la herramienta que voy a usar es gparted. Ponemos en nuestra VM que arranque desde el iso de SystemRescueCd y cuando tenemos la consola lanzamos el entorno gráfico con startx.

SystemRescueCD

Cargado el entorno gráfico, desde el menú lanzamos gparted y selecionamos la partición que queremos redimensionar (en este caso /dev/vda2). Le ponemos el tamaño deseado (30G) y nos modifica el tamaño de la partición:

Aplicamos los cambios y apagamos la VM.

Podemos comprobar que ahora las particiones del disco tienen el tamaño deseado:

$ sudo virt-filesystems --long --parts --blkdevs -h -a fwu2004-cp.qcow2

Name Type MBR Size Parent
/dev/sda1 partition - 1.0M /dev/sda
/dev/sda2 partition - 29G /dev/sda
/dev/sda device - 80G -

Ahora vamos a reducir el tamaño del disco. Vamos a usar virt-resize, que como hemos visto al amplicar el disco, trabaja de una imagen a otra. En este caso voy a crear un disco nuevo con qemu-img create que usaré de destino:

$ qemu-img create -f qcow2 -o preallocation=metadata nfwu2004-cp.qcow2 30G
Formatting 'nfwu2004-cp.qcow2', fmt=qcow2 size=32212254720 cluster_size=65536 preallocation=metadata lazy_refcounts=off refcount_bits=16

Y ejecutamos virt-resize para cambiar el tamaño en el disco creado:

$ sudo virt-resize fwu2004-cp.qcow2 nfwu2004-cp.qcow2 
[ 0.0] Examining fwu2004-cp.qcow2
**********

Summary of changes:

/dev/sda1: This partition will be left alone.

/dev/sda2: This partition will be left alone.

There is a surplus of 716.8M. An extra partition will be created for the
surplus.

**********
[ 3.9] Setting up initial partition table on nfwu2004-cp.qcow2
[ 12.5] Copying /dev/sda1
[ 12.5] Copying /dev/sda2
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00

Resize operation completed with no errors. Before deleting the old disk,
carefully check that the resized disk boots and works correctly.

Como vemos, virt-resize detecta el espacio sobrante del disco (en este caso 716.8M) y crea otra partición /dev/sda3.

Podemos ver el resultado:

$ sudo qemu-img info nfwu2004-cp.qcow2 
image: nfwu2004-cp.qcow2
file format: qcow2
virtual size: 30 GiB (32212254720 bytes)
disk size: 4.8 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false

Y las particiones:

$ sudo virt-filesystems --long --parts --blkdevs -h -a nfwu2004-cp.qcow2 
Name Type MBR Size Parent
/dev/sda1 partition - 1.0M /dev/sda
/dev/sda2 partition - 29G /dev/sda
/dev/sda3 partition - 718M /dev/sda
/dev/sda device - 30G -
david@fwibchnave0:~/redimen$

Si no nos interesa esa partición nueva que creo virt-resize podemos ejecutar la VM nuevamente con SystemRescueCd para quitar la partición generada /dev/sda3 con el espacio sobrante y asignarlo a /dev/sda2. Esto es básicamente igual que antes, asi que no voy a repetir el proceso.

El resultado sería:

$ sudo virt-filesystems --long --parts --blkdevs -h -a /var/lib/libvirt/images/nfwu2004-cp.qcow2
Name Type MBR Size Parent
/dev/sda1 partition - 1.0M /dev/sda
/dev/sda2 partition - 30G /dev/sda
/dev/sda device - 30G -

Y ya podemos arrancar la VM de forma normal y trabajar con ella.

Modificado por última vez enViernes, 14 Agosto 2020 15:46
(0 votos)

Deja un comentario

Asegúrese de introducir toda la información requerida, indicada por un asterisco (*). No se permite código HTML.