Поиск по сайту:

Как смонтировать образ виртуального диска QEMU


Допустим, вы обнаружили важные бизнес-данные в устаревшем файле электронной таблицы DOS, а Excel не может прочитать этот файл. Если устаревшая программа изначально работала в DOS, вы можете загрузить копию FreeDOS и установить там устаревшую программу для извлечения или экспорта данных в файл общего формата, например файл CSV с разделителями-запятыми.

Вы можете следовать нашим инструкциям по установке и загрузке FreeDOS с помощью виртуальной машины QEMU. Но как после установки FreeDOS установить и запустить устаревшую программу в QEMU?

Образ диска QEMU можно смонтировать двумя основными способами: с помощью смещения для непосредственного монтирования образа или с помощью пакета libguestfs-tools  .

Linux может монтировать формат образа диска QEMU, если он знает, где найти начало раздела диска C: на виртуальном диске. Виртуальный диск может содержать несколько разделов, но для большинства устаревших операционных систем, таких как DOS, у вас, вероятно, будет только один раздел. Это диск С:.

Давайте посмотрим на вывод программы Linux fdisk. Использование параметра -l выведет список разделов на виртуальном диске:

$ 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

Здесь диск C: является первым и единственным разделом на виртуальном диске, указанным как image.img1. Чтобы определить смещение диска C:, вам необходимо знать начальный сектор этого раздела. . Вывод fdisk показывает это как 63.

Для расчета смещения также необходимо знать размер сектора. Этот образ виртуального диска имеет сектора по 512 байт. Вы вычисляете смещение как произведение смещения и размера сектора: 63 × 512=32256.

Используйте это значение смещения для монтирования виртуального диска C: из 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

Вы можете автоматизировать расчет с помощью скрипта Bash. Сначала скрипт должен собрать значения в удобном для анализа формате. В моей системе Linux я использую параметр -o с fdisk, чтобы указать, какие столбцы печатать. Поскольку мне нужно только сопоставить раздел (устройство) и значение Start, я использую эту команду fdisk для вывода списка нужных мне столбцов:

$ 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

И скрипт Bash может проанализировать этот вывод с помощью Gawk, чтобы вычислить смещение самостоятельно:

#!/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

После монтирования образа виртуального диска QEMU во временную точку монтирования /tmp/dos вы можете читать и записывать данные на виртуальный диск C:. Это удобный способ скопировать установщик устаревшей программы на виртуальную машину или скопировать данные с виртуальной машины. Однако монтировать образ виртуального диска следует только тогда, когда QEMU не запущен. Если вы попытаетесь смонтировать образ диска QEMU во время его использования, вы можете повредить виртуальный диск.

Закончив доступ к образу виртуального диска из Linux, не забудьте размонтировать образ с помощью команды umount .

Пакет libguestfs-tools предоставляет набор инструментов для доступа к образам дисков виртуальных машин. В этот набор инструментов входит guestmount , который упрощает монтирование образа диска QEMU из Linux. Если ваш дистрибутив не включает этот пакет по умолчанию, вам может потребоваться установить программное обеспечение libguestfs отдельно. Однако многие дистрибутивы Linux, включая Fedora, Red Hat Enterprise Linux, Debian и Ubuntu, предоставляют пакет libguestfs-tools, который можно установить с помощью диспетчера пакетов.

Две опции сообщают guestmount, как получить доступ к образу диска QEMU. Параметр --add imagefile указывает образ виртуального диска для работы, а параметр --mount устройство сообщает guestmount, какой раздел использовать из образа диска. Вам нужно указать устройство, используя стандартный путь Linux, например /dev/sda1  для первого раздела в образе виртуального диска.

С этими двумя вариантами монтирование образа виртуального диска из Linux выполняется одной строкой:

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

Через некоторое время виртуальный диск C: монтируется во временную точку монтирования /tmp/dos. Вы можете получить доступ к файлам в образе виртуального диска /tmp/dos с помощью стандартных инструментов Linux, таких как cp и mv, для копирования данных в и из виртуального диска. Будьте осторожны, монтируйте образ диска только тогда, когда QEMU не запущен, иначе вы можете повредить виртуальный диск.

Когда вы закончите работу с виртуальным диском C:, вы можете размонтировать файловую систему с помощью команды guestunmount.