QEMU/Imágenes

De Wikilibros, la colección de libros de texto de contenido libre.

Una vez que QEMU se ha instalado, debería estar listo para ejecutar un sistema operativo guest (invitado) desde una imagen de disco. Esta imagen es un fichero que representa los datos en un disco duro. Desde la perspectiva del sistema operativo guest, es realmente un disco duro, y puede crear su propio sistema de ficheros en el disco virtual.

Se pueden descargar algunas imágenes de sistemas operativos guest desde la página web de QEMU, incluyendo una imagen sencilla de 8 MB de una distribución Linux (que está pensada fundamentalmente para pruebas; nótese que le falta el driver e1000 y por tanto no puede realizarse trabajo en red fuera del sistema). Para ejecutarla, hay que descargarla y descomprimir la imagen en una carpeta y ejecutar el comando de QEMU.

qemu linux-0.2.img

Hay que cambiar linux-0.2.img por el nombre del fichero de imagen del sistema operativo guest. Si el sistema guest dispone de interfaz gráfica y se quiere usar el ratón en él, hay que hacer doble-clic en la ventana y QEMU capturará el ratón. Para que QEMU libere el ratón de nuevo, hay que dejar pulsadas las teclas Control y Alt simultáneamente y entonces el ratón será liberado a nuestro sistema de escritorio.

Aurélien Jarno de Debian ha preparado un número de ficheros de imágenes de QEMU conteniendo Debian pre-empaquetado para distintas arquitecturas, incluyendo ARM, Sparc, PowerPC, x86_64, y i386. Se pueden encontrar en http://people.debian.org/~aurel32/qemu/

Para algunos de los núcleos de prueba que hay, por ejemplo la imagen de prueba de Sparc, podemos tener el error "No NFS Server available giving up" o algún otro mensaje acerca de la necesidad de insertar un "Root Floppy" o incluso un mensaje indicando que hay que corregir la opción root. Si se da el caso, hay que especificar "root=dev/ram" como una opción a añadir al núcleo desde la línea de comandos. Esto permitirá al sistema invitado funcionar. Este caso se da específicamente para los ficheros para Sparc de prueba disponibles en http://wiki.qemu.org/Testing y probablemente se de para otros igualmente. Si se está usando el gestor de programas para Windows, solo hay que añadir "root=/dev/ram/" en la pestaña de opciones avanzadas. Además, hay que apagar el video y el sonido y si se está usando qemu-system-sparcw.exe hay que cambiar el nombre del fichero a qemu-system-sparc.exe porque alguien lo renombró.

Tipos de imágenes[editar]

QEMU soporta varios tipos de imágenes. El tipo "nativo" y más flexible es qcow2, que soporta copiar al escribir, encriptación, compresión e instantáneas de VM.

QEMU actualmente soporta estos tipos de imágenes o formatos:

raw
(por defecto) el formato raw es una imagen binaria sencilla de la imagen del disco y es muy portátil. En sistemas de ficheros que soportan archivos dispersos, imágenes en este formato sólo usaran el espacio realmente usado por los datos guardados en ellos.
cloop
formato compressed loop, principalmente usado para leer Knoppix y formatos de imagen similares de CD autónomos (Live)
cow
formato copy-on-write, copiar al escribir, se le da soporte sólo por razones de compatibilidad y no está disponible en QEMU para Windows
qcow
el antiguo formato de QEMU de copy-on-write, se le da soporte por razones de compatibilidad, reemplazado por qcow2
qcow2
formato QEMU copy-on-write con un rango de características especiales, incluyendo la capacidad de tomar múltiples instantáneas, imágenes más pequeñas de sistemas de ficheros que no soportan archivos dispersos, encripción AES opcional y compresión zlib opcional
vmdk
Formato de imagen de VMware 3 & 4, o 6 para intercambiar imágenes con estos productos
vdi
Formato de imagen compatible con VirtualBox 1.1 para intercambiar imágenes con VirtualBox.

Crear una imagen[editar]

Para configurar su propia imagen de un sistema operativo huésped, primero debe crear una imagen de disco vacía. QEMU dispone del comando qemu-img para crear y manipular imágenes de disco, y soporta una variedad de formatos. Si no se especifica ninguno, se usará ficheros raw. El formato "nativo" de QEMU es qcow2, y ofrece gran flexibilidad. A continuación crearemos una imagen de 3 GB con formato qcow2 para instalar en ella Windows XP:

qemu-img create -f qcow2 winxp.img 3G

La manera más fácil de instalar un sistema operativo invitado es crear una imagen ISO de un CD/DVD de arranque e indicarle a QEMU que la arranque. Muchos sistemas operativos gratuitos se pueden descargar desde Internet como imágenes ISO arrancables, y se pueden usar directamente sin tener que grabarlas a un disco.

A continuación arrancaremos desde una imagen ISO de un disco de arranque de Windows XP licenciado apropiadamente. Además le daremos 256MB de RAM, pero no usaremos el módulo del núcleo kqemu todavía porque da problemas durante la instalación de Windows XP.

qemu -m 256 -hda winxp.img -cdrom winxpsp2.iso -boot d

Para arrancar desde un CD o DVD real, diremos a QEMU donde encontrarlo. En los sistemas Linux, habitualmente puede usar un nombre de dispositivo lógico como /dev/cdrom o /dev/dvd, o el nombre físico del dispositivo, por ejemplo /dev/sr0

qemu -m 256 -hda winxp.img -cdrom /dev/cdrom -boot d

QEMU arrancará desde la imagen ISO o el CD/DVD y ejecutará el programa de instalación. Si dispone de dos pantallas, mueva la pantalla de QEMU a la que tenga libre, donde pueda tener a la vista el instalador, aunque mejor que siga con otra cosa, ¡tardará un rato!

Una vez que el sistema operativo invitado se ha instalado satisfactoriamente, puede apagar el sistema operativo invitado (por ejemplo en Windows XP, pulsar en Inicio y después Apagar). Una vez que se ha apagado, inicie QEMU de nuevo con el modulo del núcleo kqemu para darle más velocidad.

qemu -m 256 -hda winxp.img -cdrom winxpsp2.iso -kernel-kqemu

Si está ejecutando un Linux x86-64 (esto es 64-bit), necesitará ejecutar la versión x86-64 de QEMU para poder utilizar kqemu:

qemu-system-x86_64 -m 256 -hda winxp.img -cdrom winxpsp2.iso -kernel-kqemu

Usar múltiples imágenes[editar]

QEMU puede utilizar hasta cuatro ficheros de imagen para representar múltiples discos virtuales en el sistema guest. Esto puede ser muy útil, como en los siguientes ejemplos:

  • un disco virtual para mantener el fichero de paginación o intercambio puede ser compartido entre varios guest de QEMU
  • un disco de datos común donde todos los datos se almacenan, accesible desde cada invitado de QEMU pero aislado del host
  • dar espacio adicional a los invitados de QEMU sin necesidad de reconfigurar la imagen principal
  • separar operaciones de entradas/salida que compiten entre sí colocando las imágenes de QEMU en diferentes discos físicos
  • emular un entorno de varios discos físicos para pruebas / aprendizaje

Tenga en cuenta que sólo una instancia de QEMU puede acceder a una imagen a la vez - ¡compartida no significa compartida simultáneamente!

Para usar imágenes adicionales en QEMU, especifíquelas en la línea de comandos, con las opciones -hda, -hdb, -hdc, -hdd.

qemu -m 256 -hda winxp.img -hdb pagefile.img -hdc testdata.img -hdd tempfiles.img -kernel-kqemu

Nota: QEMU no soporta a la vez las opciones -hdc y -cdrom, ya que ambas representan el primer dispositivo del segundo canal IDE.

Copiar al escribir[editar]

La parte "cow" de qcow2 es un acrónimo de copiar al escribir (copy on write), un pequeño truco que permite configurar una imagen una vez y usarla muchas veces sin cambiarla. Esto es ideal para desarrollar y probar software, lo que generalmente requiere un entorno conocido y estable para comenzar. Se puede crear un entorno conocido y estable en una imagen y después crear varias imágenes desechables de copiar al escribir para trabajar en ellas.

Para comenzar un nuevo entorno desechable basado en una imagen buena conocida, hay que invocar el comando qemu-img con la opción -b y decir en qué imagen basar la copia. Cuando se ejecuta QEMU usando un entorno desechable, todas las escrituras sobre el disco virtual irán a la imagen desechable, no a la copia en la que está basada.

qemu-img create -f qcow2 -b winxp.img test01.img 
qemu -m 256 -hda test01.img -kernel-kqemu &

La opción -b no está soportada en qemu-img, al menos no en la versión 0.12.5. En su lugar se usa la opción backing_file, tal y como se muestra aquí:

qemu-img create -f qcow2 -o backing_file=winxp.img test01.img 

NOTA: no olvide copiar cualquier dato importante fuera del entorno desechable antes de borrarlo. Cuando se desarrolla y prueba software en un entorno virtual de copiar al escribir, es una buena idea usar software de control de versiones como Subversion o CVS en un servidor externo al entorno virtual. No sólo es fácil mantener copias del trabajo fuera del entorno virtual, es además muy fácil configurar un nuevo entorno virtual para control de versiones.

Montar una imagen en el host[editar]

A veces es útil poder de montar una imagen de disco bajo el sistema host. Por ejemplo, si el guest no tiene soporte de red, la única manera de transferir ficheros hacia y desde el guest será a través de dispositivos de almacenamiento a los que pueda acceder.

Linux y otros host parecidos a Unix pueden montar imágenes creadas con formato raw usando un dispositivo de bucle de retorno. Habiéndose conectado como root (o usando sudo), montar un bucle de retorno con un desplazamiento de 32,256.

mount -o loop,offset=32256 /path/to/image.img /mnt/mountpoint

Por ejemplo, para copiar algunos ficheros hacia una imagen de disco duro de FreeDOS:

mkdir -p /mnt/freedos
mount -o loop,offset=32256 freedos-c.img /mnt/freedos
cp oldgames /mnt/freedos
umount /mnt/freedos

NOTA: nunca montar una imagen de QEMU mientras QEMU la está usando (salvo que se use la opción -snapshot), o es probable que se corrompa el sistema de ficheros de la imagen.

NOTA: si se tiene una imagen sin particiones se debe omitir la parte de offset=32256. Este es, por ejemplo, el caso si se quiere montar linux-0.2.img (que se puede encontrar en la página web de qemu en el momento de escribir esto)

Para otros tipos de imágenes de qemu, se puede usar qemu-nbd

modprobe nbd max_part=16
qemu-nbd -c /dev/nbd0 image.qcow2
partprobe /dev/nbd0
mount /dev/nbd0p1 /mnt/image

Usando fdisk se puede obtener información relativa a las diferentes particiones en nbd0.

$ fdisk /dev/nbd0
 Command (m for help): p
 Disk /dev/nbd0: 4294 MB, 4294967296 bytes
 255 heads, 63 sectors/track, 522 cylinders, total 8388608 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 identifier: 0x000183ca
      Device  Boot     Start        End      Blocks   Id  System
 /dev/nbd0p1   *        2048      499711      248832   83  Linux
 /dev/nbd0p2          501758     8386559     3942401    5  Extended
 /dev/nbd0p5          501760     8386559     3942400   8e  Linux LVM

Particiones del tipo LVM no pueden montarse usando 'mount'. En ese caso la imagen podría montarse usando:

$ vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "ub1110server-qemu" using metadata type lvm2
$ vgchange -ay
   2 logical volume(s) in volume group "ub1110server-qemu" now active
$ mount /dev/ub1110server-qemu/<LogicalVolumeName> /mnt/image

Cambie <LogicalVolumeName> por el nombre del volumen lógico presente en el grupo de volúmenes. Por último, después de usarse es importarte desmontar la imagen y deshacer los pasos (dependiendo de cómo se montó la imagen):

$ umount /mnt/image
$ qemu-nbd -d /dev/nbd0
$ vgchange -an VolGroupName
$ killall qemu-nbd

"nbd" significa dispositivo de bloque de red (Network Block Device). Aquí se está usando de forma local, pero también se puede exportar la imagen para que otros anfitriones puedan usar /mount. Vea qemu-nbd(8), nbd-client(8) para más detalles.

Lo mismo se puede hacer con imágenes en formato raw, pero es mucho menos eficiente que el método en bucle descrito anteriormente.

Otra alternativa para imágenes en formato vmdk y raw es usar vdfuse (http://forums.virtualbox.org/viewtopic.php?f=26&t=33355) que permite acceder a cualquier imagen soportada por VirtualBox.

Copiar una imagen en un dispositivo físico[editar]

Se puede querer copiar una imagen de disco a un dispositivo físico. Un ejemplo puede ser, si se está haciendo un cluster, podría ser más fácil tener todo listo en qemu, a continuación grabar la última imagen de disco a todos los discos duros. Por supuesto, la imagen necesitará contener toda la configuración necesaria y los drivers para que el nuevo sistema arranque correctamente.

La imagen de disco deberá estar en formato raw.

$ qemu-img convert -O raw diskimage.qcow2 diskimage.raw

Después solo hay que hacer dd al disco duro.

# dd if=diskimage.raw of=/dev/sda

O dejar que qemu-img grabe directamente al disco con un comando:

# qemu-img convert -O raw diskimage.qcow2 /dev/mydevice

Por supuesto, ¡hay que tener cuidado de que se escribe en el disco correcto!

Conseguir información[editar]

El programa qemu-img puede decirnos el formato, tamaño virtual, tamaño físico e instantáneas que tiene una imagen.

$ qemu-img info test.vmdk 
(VMDK) image open: flags=0x2 filename=test.vmdk
image: test.vmdk
file format: vmdk
virtual size: 20M (20971520 bytes)
disk size: 17M

Convertir formatos de imagen[editar]

El programa qemu-img puede usarse para convertir imágenes de un formato a otro, o añadir compresión o encripción a una imagen. Hay que especificar los ficheros de origen y destino para la imagen, y seleccionar entre las siguientes opciones:

  • -f fmt – opcional, especificar el formato del fichero de entrada (QEMU habitualmente puede detectarlo)
  • -O fmt – especificar el formato del fichero de salida
  • -e – usar encripción en el fichero de salida (se pedirá una contraseña)
  • -c – usar compresión en el fichero de salida (no se puede usar junto con encripción)
  • -6 – cuando se convierte a formato vmdk (VMware), lo hace compatible con VMware 6
qemu-img convert -O qcow2 test.vmdk test.qcow2

Intercambiando imágenes con VirtualBox[editar]

qemu también soporta el formato vdi, así que se puede convertir en las dos direcciones:

qemu-img convert -O vdi test.qcow2 test.vdi

qemu puede usar el formato vdi como imagen de arranque así como imagen básica; debido a que VirtualBox también soporta este tipo de imagen, denominándola como imagen diferencial, se podría usar una única copia base (de solo lectura) compartiéndola de forma simultánea.

En cualquier caso, se puede usar el formato raw (o un dispositivo nbd):

Para convertir una imagen de QEMU para poder usarla con VirtualBox, primero hay que convertirla a formato raw, después usar la utilidad de conversión de VirtualBox para convertirla y compactarla a su formato nativo. Téngase en cuenta que el comando de compactación requiere la ruta completa a la imagen de VirtualBox, no solo el nombre del fichero.

qemu-img convert -O raw test.qcow2 test.raw
(1) VBoxManage convertdd test.raw test.vdi
VBoxManage modifyvdi /full/path/to/test.vdi compact

(1) o intentar :

VBoxManage convertfromraw -format VDI test.raw test.vdi

o

VBoxManage clonehd -format VDI test.raw test.vdi

Alternativamente, puede usar qemu-nbd para que la imagen este disponible en format raw al igual que como dispositivo nbd, lo que VBoxManage puede luego convertir.

qemu-nbd -c /dev/nbd0 test.qcow2
VBoxManage convertfromraw -format VDI /dev/nbd0 test.vdi

Para convertir de formato VDI a raw, puede usarse VBoxManage de nuevo:

VBoxManage clonehd -format RAW test.vdi test.raw

o

VBoxManage internalcommands  converttoraw file.vdi file.raw

Para usar una imagen VDI desde kvm sin convertirla, vdfuse debe ser usado otra vez..

vdfuse -f test.vdi ~/some-dir
kvm -hda ~/some-dir/EntireDisk ...