351.5 Imágenes de Disco de Máquinas Virtuales
Introducción
La gestión de imágenes de disco es fundamental en entornos de virtualización. Este subtema cubre los diferentes formatos, herramientas de manipulación, conversión entre formatos y las técnicas avanzadas como backing files y copy-on-write.
Comparación de Formatos de Imagen
| Formato | Hipervisor | Thin Prov. | Snapshots | Compresión | Cifrado |
|---|---|---|---|---|---|
| raw | Universal | No | No | No | No |
| qcow2 | QEMU/KVM | Sí | Sí | Sí | Sí (LUKS) |
| vmdk | VMware | Sí | Limitado | Sí | Sí |
| vdi | VirtualBox | Sí | No | No | No |
| vhd/vhdx | Hyper-V | Sí | Sí (vhdx) | No | No |
raw
- Copia exacta bloque a bloque del disco virtual.
- Sin metadatos ni overhead de formato.
- Mejor rendimiento de E/S.
- Ocupa el tamaño completo inmediatamente (sin thin provisioning nativo).
- Compatible con cualquier herramienta de manipulación de bloques.
# Crear imagen raw
qemu-img create -f raw disco.raw 20G
# También se puede crear con dd
dd if=/dev/zero of=disco.raw bs=1M count=0 seek=20480qcow2 (QEMU Copy-On-Write v2)
Formato nativo de QEMU/KVM, el más versátil:
- Thin provisioning: solo ocupa espacio según se escriben datos.
- Snapshots internos: múltiples estados dentro del mismo archivo.
- Backing files: cadenas de copy-on-write.
- Compresión: con zlib, reduce tamaño en disco.
- Cifrado: soporte LUKS nativo.
- Preallocation:
off,metadata,falloc,full.
# Crear qcow2 con preallocación de metadatos
qemu-img create -f qcow2 -o preallocation=metadata disco.qcow2 20G
# Crear qcow2 con cifrado LUKS
qemu-img create -f qcow2 -o encryption=on,encrypt.format=luks disco.qcow2 20GPara el examen: qcow2 es el formato recomendado para QEMU/KVM. Ofrece el mejor balance entre funcionalidad y rendimiento. raw solo es preferible cuando se necesita rendimiento máximo sin funcionalidades avanzadas.
Operaciones con qemu-img
Operaciones principales
# Crear imagen
qemu-img create -f qcow2 disco.qcow2 20G
# Información detallada
qemu-img info disco.qcow2
# Convertir entre formatos
qemu-img convert -f qcow2 -O vmdk disco.qcow2 disco.vmdk
# Redimensionar
qemu-img resize disco.qcow2 +10G
# Verificar integridad
qemu-img check disco.qcow2
# Reparar imagen dañada
qemu-img check -r all disco.qcow2
# Comparar dos imágenes
qemu-img compare disco1.qcow2 disco2.qcow2
# Medir espacio necesario para conversión
qemu-img measure -f raw -O qcow2 disco.rawConversiones entre hipervisores
# QEMU/KVM → VMware
qemu-img convert -f qcow2 -O vmdk disco.qcow2 disco.vmdk
# VMware → QEMU/KVM
qemu-img convert -f vmdk -O qcow2 disco.vmdk disco.qcow2
# VirtualBox → QEMU/KVM
qemu-img convert -f vdi -O qcow2 disco.vdi disco.qcow2
# Hyper-V → QEMU/KVM
qemu-img convert -f vpc -O qcow2 disco.vhd disco.qcow2
# Cualquier formato → raw (para máxima compatibilidad)
qemu-img convert -f qcow2 -O raw disco.qcow2 disco.rawBacking Files (Copy-on-Write Chains)
Los backing files permiten crear imágenes derivadas que solo almacenan los cambios respecto a una imagen base:
base.qcow2 (imagen original - solo lectura)
├── vm1.qcow2 (cambios de VM1)
├── vm2.qcow2 (cambios de VM2)
└── vm3.qcow2 (cambios de VM3)
Crear cadenas COW
# Crear imagen base
qemu-img create -f qcow2 base.qcow2 20G
# Instalar SO en la imagen base...
# Crear imágenes derivadas (overlay)
qemu-img create -f qcow2 -b base.qcow2 -F qcow2 vm1.qcow2
qemu-img create -f qcow2 -b base.qcow2 -F qcow2 vm2.qcow2
# Verificar backing file
qemu-img info vm1.qcow2
# ...
# backing file: base.qcow2
# backing file format: qcow2Cadenas multi-nivel
# base.qcow2 ← snap1.qcow2 ← snap2.qcow2 ← actual.qcow2
qemu-img create -f qcow2 -b base.qcow2 -F qcow2 snap1.qcow2
qemu-img create -f qcow2 -b snap1.qcow2 -F qcow2 snap2.qcow2
qemu-img create -f qcow2 -b snap2.qcow2 -F qcow2 actual.qcow2
# Ver toda la cadena
qemu-img info --backing-chain actual.qcow2Consolidar (flatten) una cadena
# Combinar todos los niveles en una sola imagen
qemu-img convert -f qcow2 -O qcow2 actual.qcow2 consolidada.qcow2
# O rebase para cambiar el backing file
qemu-img rebase -b nuevo-base.qcow2 -F qcow2 overlay.qcow2Para el examen: El backing file debe existir siempre y nunca debe ser modificado. Si se elimina o modifica el backing file, todas las imágenes derivadas quedan corruptas.
virt-sparsify
Reduce el tamaño físico de una imagen eliminando espacio no utilizado:
# Reducir imagen in-place (requiere que la VM esté apagada)
virt-sparsify --in-place disco.qcow2
# Crear copia reducida
virt-sparsify disco.qcow2 disco-sparse.qcow2
# Convertir formato durante la operación
virt-sparsify disco.raw --convert qcow2 disco.qcow2
# Con compresión
virt-sparsify --compress disco.qcow2 disco-comprimido.qcow2Para el examen:
virt-sparsifyfunciona rellenando con ceros el espacio libre dentro del filesystem del guest, y luego eliminando esos bloques de ceros del archivo de imagen.
virt-resize
Redimensiona particiones dentro de una imagen de disco:
# Expandir partición /dev/sda2 usando todo el espacio disponible
virt-resize --expand /dev/sda2 disco-viejo.qcow2 disco-nuevo.qcow2
# Primero crear imagen más grande
qemu-img create -f qcow2 disco-nuevo.qcow2 40G
# Expandir con LVM
virt-resize --expand /dev/sda2 --LV-expand /dev/vg0/root \
disco-viejo.qcow2 disco-nuevo.qcow2
# Reducir una partición y expandir otra
virt-resize --shrink /dev/sda1 --expand /dev/sda2 \
disco-viejo.qcow2 disco-nuevo.qcow2libguestfs: guestfish y guestmount
libguestfs permite acceder y modificar el sistema de archivos de imágenes de disco sin necesidad de arrancar la VM.
guestfish (shell interactivo)
# Abrir imagen de forma interactiva
guestfish -a disco.qcow2
# Dentro de guestfish:
><fs> run
><fs> list-filesystems
><fs> mount /dev/sda1 /
><fs> ls /etc/
><fs> cat /etc/hostname
><fs> edit /etc/network/interfaces
><fs> upload archivo-local.conf /etc/mi-config.conf
><fs> download /etc/passwd /tmp/passwd-backup
><fs> exit
# Modo no interactivo con comandos
guestfish -a disco.qcow2 -i cat /etc/hostnameguestmount
Monta el sistema de archivos de una imagen directamente en el host:
# Montar imagen
mkdir /mnt/guest
guestmount -a disco.qcow2 -i /mnt/guest
# Acceder como filesystem normal
ls /mnt/guest/etc/
cat /mnt/guest/etc/hostname
# Desmontar
guestunmount /mnt/guestOtras herramientas libguestfs
# Listar filesystems en la imagen
virt-filesystems -a disco.qcow2 --all --long
# Inspeccionar SO instalado
virt-inspector disco.qcow2
# Ver logs del guest
virt-log -a disco.qcow2
# Listar paquetes instalados
virt-inspector disco.qcow2 | virt-inspector --xpath '//application/app_name'
# Editar un archivo directamente
virt-edit -a disco.qcow2 /etc/hostname
# Personalizar imagen (cambiar hostname, inyectar SSH keys, etc.)
virt-customize -a disco.qcow2 \
--hostname nuevo-host \
--ssh-inject root:file:/root/.ssh/id_rsa.pub \
--install nginx \
--run-command 'systemctl enable nginx'Para el examen: libguestfs NO requiere que la VM esté en ejecución. Opera directamente sobre archivos de imagen. Es esencial para automatizar la personalización de imágenes.
Formato OVF/OVA
OVF (Open Virtualization Format)
Estándar abierto para empaquetar y distribuir máquinas virtuales entre diferentes hipervisores:
- Archivo .ovf: Descriptor XML con metadatos (hardware virtual, redes, etc.).
- Archivos .vmdk/.qcow2: Imágenes de disco asociadas.
- Archivo .mf: Checksums (integridad).
OVA (Open Virtual Appliance)
Archivo TAR que contiene todos los archivos OVF en un solo paquete:
# Un archivo .ova es simplemente un tar
tar tf mi-appliance.ova
# mi-appliance.ovf
# mi-appliance.vmdk
# mi-appliance.mf
# Extraer OVA
tar xf mi-appliance.ova
# Importar OVA con virt-v2v
virt-v2v -i ova mi-appliance.ova -o libvirt -of qcow2
# Crear OVA manualmente
tar cf mi-appliance.ova mi-appliance.ovf mi-appliance.vmdk mi-appliance.mfConversión entre Hipervisores
virt-v2v
Convierte VMs de un formato/hipervisor a otro:
# VMware → KVM/libvirt
virt-v2v -i vmx /vmfs/mi-vm.vmx -o libvirt -of qcow2
# OVA → KVM/libvirt
virt-v2v -i ova mi-vm.ova -o libvirt -of qcow2
# Salida a directorio local
virt-v2v -i ova mi-vm.ova -o local -os /var/lib/libvirt/images/Resumen
| Concepto | Detalle clave |
|---|---|
| raw | Mejor rendimiento, sin funciones avanzadas |
| qcow2 | Formato recomendado QEMU/KVM, thin provisioning, snapshots |
| Backing files | COW, imagen base + overlays de cambios |
| virt-sparsify | Reducir tamaño eliminando espacio no usado |
| virt-resize | Redimensionar particiones dentro de la imagen |
| guestfish/guestmount | Acceso al filesystem sin arrancar la VM |
| OVF/OVA | Formato portátil entre hipervisores |
| virt-v2v | Conversión entre plataformas |
Trampas del examen
Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:
- Backing file eliminado = imagen corrupta — Si se borra o modifica un backing file, TODAS las imagenes derivadas (overlays) quedan inutilizables. El backing file debe existir siempre y permanecer inmutable. El examen puede plantear un escenario donde se elimina el base y preguntar que sucede.
qemu-img convertconsolida (flatten) la cadena — Al convertir una imagen con backing files, la imagen resultante es independiente y contiene todos los datos. Esto equivale a hacer un flatten. El examen puede preguntar como eliminar la dependencia del backing file.qemu-img resizeno redimensiona particiones —resizesolo cambia el tamano del archivo de imagen (el “disco virtual”), NO modifica las particiones ni filesystems internos. Para redimensionar particiones se necesitavirt-resizeo herramientas dentro del guest comogrowpartyresize2fs.virt-sparsifyvsqemu-img convertpara reducir tamano —virt-sparsifyentiende el filesystem del guest y rellena con ceros el espacio libre antes de eliminarlo.qemu-img convertsimplemente copia bloques usados.virt-sparsifyes mas efectivo porque opera a nivel de filesystem.- raw vs qcow2: thin provisioning —
qemu-img create -f raw disco.raw 20Greserva los 20G inmediatamente en disco.qemu-img create -f qcow2 disco.qcow2 20Gsolo ocupa unos KB inicialmente y crece segun se escriben datos. El examen puede preguntar por que una imagen raw de 20G ocupa 20G en disco. - OVA es simplemente un TAR — Un archivo .ova es un empaquetado TAR de archivos .ovf + .vmdk + .mf. Se puede extraer con
tar xf. No es un formato comprimido ni cifrado. El examen puede preguntar como inspeccionar el contenido de un OVA. - guestfish vs guestmount —
guestfishes un shell interactivo para operar sobre imagenes (cat, ls, edit, upload, download).guestmountmonta el filesystem de la imagen directamente en el host como un directorio normal. Ambos funcionan con la VM apagada. No confundir con herramientas que requieren la VM en ejecucion. virt-customizevsvirt-edit—virt-customizerealiza operaciones complejas (cambiar hostname, inyectar SSH keys, instalar paquetes, ejecutar comandos).virt-editsolo edita un archivo individual dentro de la imagen. Ambos operan offline (VM apagada).- Formato VHD en qemu-img se llama
vpc— Al convertir imagenes VHD de Hyper-V conqemu-img convert, el formato se especifica comovpc(novhd):qemu-img convert -f vpc -O qcow2 disco.vhd disco.qcow2. Este es un distractor frecuente. -Fen backing files es obligatorio en versiones recientes —qemu-img create -f qcow2 -b base.qcow2 -F qcow2 overlay.qcow2. La opcion-Fespecifica el formato del backing file. Omitir-Fgenera warnings o errores en versiones recientes de QEMU. El examen puede mostrar comandos sin-Fcomo error.