Cómo montar una imagen de disco virtual QEMU

Contenidos

Supongamos que descubre datos comerciales críticos en un archivo de hoja de cálculo de DOS heredado y Excel no puede leer el archivo. Si el programa heredado se ejecutó originalmente en DOS, puede iniciar una copia de FreeDOS e instalar el programa heredado allí para extraer o exportar los datos a un formato de archivo común, como un archivo CSV separado por comas.

Puede seguir nuestras instrucciones para instalar y arrancar FreeDOS usando la máquina virtual QEMU. Pero habiendo instalado FreeDOS, ¿cómo se instala y ejecuta el programa heredado en QEMU?

Puede montar una imagen de disco QEMU usando dos métodos básicos: usando un desplazamiento para montar la imagen de forma directa, o usando el libguestfs-tools paquete.

Linux puede montar el formato de imagen de disco sin procesar de QEMU, asumiendo que sabe dónde hallar el inicio de la partición de la unidad C: en el disco virtual. El disco virtual puede contener varias particiones, pero para la mayoría de las instalaciones de sistemas operativos heredados como DOS, probablemente solo tenga una partición. Esta es la unidad C :.

Veamos la salida de Linux fdisk programa. Usando el -l La opción mostrará una lista de las particiones en el disco virtual:

$ fdisk -l image.img 
Disk image.img: 100 MiB, 104857600 bytes, 204800 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
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot Start    End Sectors  Size Id Type
image.img1 *       63 204623  204561 99.9M  6 FAT16

Aquí, la unidad C: es la primera y única partición en la unidad virtual, listada como image.img1 Para establecer el desplazamiento de la unidad C :, necesita conocer el sector de inicio de esa partición. La salida de fdisk muestra esto como 63.

Para calcular el desplazamiento, además necesita conocer el tamaño del sector. Esta imagen de disco virtual tiene sectores de 512 bytes. Calcula la compensación como el producto de la compensación y el tamaño del sector: 63 × 512 = 32256.

Utilice este valor de compensación para montar la unidad C: virtual desde Linux:

$ mkdir /tmp/dos
$ sudo mount -o loop,offset=32256 image.img /tmp/dos
$ ls /tmp/dos
AUTOEXEC.BAT  COMMAND.COM  FDCONFIG.SYS  FDOS  KERNEL.SYS
$ sudo umount /tmp/dos

Puede automatizar el cálculo a través de un script Bash. La secuencia de comandos primero debe recolectar los valores en un formato fácilmente analizable. En mi sistema Linux, uso el -o opción con fdisk para especificar qué columnas imprimir. Como solo necesito hacer coincidir la partición (Dispositivo) y el valor de Inicio, uso esto fdisk comando para enumerar las columnas que necesito:

$ fdisk -l -o Device,Start image.img 
Disk image.img: 100 MiB, 104857600 bytes, 204800 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
Disklabel type: dos
Disk identifier: 0x00000000

Device     Start
image.img1    63

Y un script de Bash puede analizar esa salida usando Gawk para calcular el desplazamiento por sí solo:

#!/bin/bash
# usage: qemu-mount {imagefile}
# 1st argument: QEMU raw image file

if [ $# -ne 1 ] ; then
  echo 'usage: qemu-mount imagefile'
  echo 'Mounts a QEMU raw image file to /tmp/dos'
  exit 1
fi

start=$( fdisk -l -o Device,Start ${1} | grep "^${1}1" | gawk '{print $2}' )
sectors=$( fdisk -l ${1} | grep '^Units: sectors of' | gawk '{print $(NF-1)}' )
offset=$(( $start * $sectors ))

[ -d /tmp/dos ] || mkdir /tmp/dos
sudo mount -o loop,offset=$offset ${1} /tmp/dos

Después de montar la imagen del disco virtual QEMU en el /tmp/dos punto de montaje temporal, puede leer y escribir datos en la unidad C: virtual. Esta es una forma práctica de copiar un instalador de un programa heredado en la máquina virtual o copiar datos fuera de la máquina virtual. A pesar de esto, solo debe montar la imagen del disco virtual cuando QEMU no se esté ejecutando. Si intenta montar una imagen de disco QEMU mientras está en uso, puede dañar el disco virtual.

Cuando haya terminado de entrar a la imagen del disco virtual desde Linux, no olvide desmontar la imagen con el umount mando.

los libguestfs-tools El paquete proporciona un conjunto de herramientas para entrar a las imágenes de disco de la máquina virtual. En este kit de herramientas se incluye guestmount , lo que hace que sea verdaderamente fácil montar una imagen de disco QEMU desde Linux. Si su distribución no incluye este paquete de forma predeterminada, es factible que deba instalar el libguestfs software de forma separada. A pesar de esto, muchas distribuciones de Linux, incluidas Fedora, Red Hat Enterprise Linux, Debian y Ubuntu proporcionan una libguestfs-tools paquete que puede instalar a través de su administrador de paquetes.

Dos opciones dicen guestmount cómo entrar a la imagen del disco QEMU. los --add imagefile La opción especifica la imagen del disco virtual con la que trabajar y la --mount device la opción dice guestmount qué partición utilizar de la imagen del disco. Debe indicar el dispositivo a través de una ruta estándar de Linux, como /dev/sda1 para la primera partición en la imagen del disco virtual.

Con estas dos opciones, montar la imagen del disco virtual desde Linux es un comando de una sola línea:

guestmount --add image.img --mount /dev/sda1 /tmp/dos

Después de un momento, esto monta la unidad C: virtual en el punto de montaje temporal / tmp / dos. Puede entrar a los archivos de la imagen del disco virtual /tmp/dos usando herramientas estándar de Linux, como cp y mv, para copiar datos dentro y fuera del disco virtual. Tenga cuidado de montar la imagen del disco solo cuando QEMU no se esté ejecutando, o puede dañar el disco virtual.

Cuando haya terminado con la unidad C: virtual, puede desmontar el sistema de archivos usando el guestunmount mando.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.