Лицензия Creative Commons
Содержимое блога доступно по лицензии Creative Commons Атрибуция — С сохранением условий
(Attribution-ShareAlike) 3.0 Unported
, если не указано иное.

воскресенье, 1 декабря 2013 г.

Монтирование разделов с IMG-образов дисков, используемых QEMU

Доброго времени суток.

Заметка о том, как монтировать разделы с "сырых" образов дисков (англ. raw images), используемых, в том числе, эмулятором QEMU.

Итак, дано: Образ Debian GNU/Hurd, взятый отсюда. Цель: подмонтировать корневой раздел с образа диска к файловой системе рабочей ОС с помощью mount.

Положим, что мы уже находимся в каталоге с образом диска, а монтировать собираемся первый раздел с него в /mnt/hurd. Имя файла образа: debian-hurd-20130504.img

Первое, что нужно сделать -- посмотреть расположение разделов в образе диска (иными словами, с какого сектора диска начинается каждый из разделов). Это можно сделать как минимум двумя способами: с помощью file и с помощью fdisk. Рассмотрим оба способа.

Утилита file, как я уже как-то раз писал, умеет показывать информацию не только о простых файлах, но и о всяких чудных штуках вроде сохранённой в файл Главной Загрузочной Записи (Master Boot Record, MBR). А сейчас эта утилита поможет нам получить информацию о разделах, запечатанных внутри образа диска:

$ file debian-hurd-20130504.img | fmt
debian-hurd-20130504.img: ; partition 1: ID=0x83, starthead 32,
startsector 2048, 5785600 sectors; partition 2: ID=0x5, starthead 99,
startsector 5789694, 354306 sectors
.

Здесь утилита fmt используется, дабы уместить вывод команды file в 75 столбцов.

Посмотрим же на вывод команды. Видно, что первый раздел (partition 1) начинается с 2048-го сектора диска (startsector 2048). Это как раз то, что нам нужно.

Попробуем теперь получить эту же информацию с помощью утилиты fdisk:

$ su -
# fdisk -l debian-hurd-20130504.img
Disk debian-hurd-20130504.img: 3146 MB, 3146776576 bytes, 6146048 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: 0x00053020

                  Устр-во Загр  Начало    Конец   Блоки  Id Система
debian-hurd-20130504.img1        2048 5787647 2892800 83 Linux
debian-hurd-20130504.img2     5789694 6143999  177153  5 Расширенный
debian-hurd-20130504.img5     5789696 6143999  177152 82 Linux своп / Solaris

Видим то же самое -- начало первого раздела находится на 2048-м секторе. Разница лишь в подробности вывода и в том, что нам нужно быть суперпользователем для использования fdisk, а утилита file может быть запущена от имени обычного пользователя.

Теперь посмотрим на то, как использовать имеющиеся данные. fdisk показывает данные в секторах, которые по-умолчанию равны 512 байтам. Соответственно, чтобы получить смещение первого раздела на диске в байтах, нужно умножить количество секторов на 512. Сделаем это:

$ echo $((2048 * 512))
1048576

Осталось только передать полученное значение команде mount:

$ su -
# mount -o loop,offset=1048576 debian-hurd-20130504.img /mnt/hurd

Ручного копирования посчитанного значения можно избежать, используя подстановку вывода команды:

# mount -o loop,offset=`echo $((2048 * 512))` \
debian-hurd-20130504.img /mnt/hurd

Полюбуемся результатом:

$ df -h | grep hurd
/dev/loop0  2,8G  804M  1,8G  31%  /mnt/hurd

И последнее: согласно документации, необходимо отмонтировать образ диска прежде, чем загружать его в QEMU -- иначе можно повредить данные на подмонтированных разделах образа диска.

Использованные источники:

- Артём