Как подмонтировать образ XEN/ How to mount XEN image
1. Убедитесь что диск не используется ниодной виртуальной машиной. 2. Поключим образ виртуальной машины в lo устройство.
losetup /dev/loop0 /path/to/diskimage.xm
3. Посмотрим разделы:
fdisk -ul /dev/loop0
Disk /dev/loop0: 4294 MB, 4294967296 bytes 255 heads, 63 sectors/track, 522 cylinders, total 8388608 sectors Units = sectors of 1 * 512 = 512 bytes Disk identifier: 0x0004a36d
Device Boot Start End Blocks Id System /dev/loop0p1 63 1028159 514048+ 82 Linux swap / Solaris /dev/loop0p2 * 1028160 8385929 3678885 83 Linux
4. Монтируем нужный раздел.
Колонка Start - это смещение для каждого раздела в файле образе виртуальной машины. Значения приведены в секторах, один сектор - 512 байт.
63 * 512 = 32256 байт.
Исходя из этого, для того что-бы подмонтировать первый раздел, тут он своп, но это не важно, нужно выполнить команду:
losetup -o32256 /dev/loop0 /path/to/diskimage.xm
для второго раздела:
losetup -o526417920 /dev/loop0 /path/to/diskimage.xm
Скрипт монтирования XEN образа
#!/bin/bash if [ "$#" -ne "3" ]; then echo "Usage: `basename $0` <image_filename> <partition # (1,2,...)> <mount point>" >&2 echo " # fdisk -lu <image_filename> to view partition table" >&2 exit 1 fi if ! fdisk -v > /dev/null 2>&1; then echo "Can't find the fdisk util. Are you root?" >&2 exit 1 fi FILE=$1 PART=$2 DEST=$3 UNITS=`fdisk -lu $FILE 2>/dev/null | grep $FILE$PART | tr -d '*' | tr -s ' ' | cut -f2 -d' '` OFFSET=`expr 512 '*' $UNITS` mount -o loop,offset=$OFFSET $FILE $DEST exempel vmtest vm # /usr/local/bin/imgmount.sh /vm/lb1-6.img 1 /mnt/sdb/
Монтирование разделов из образа всего жёсткого диска
Обращаю внимание: речь идёт о монтировании не образа раздела, которое осуществляется достаточно просто.
Как, например, для образа раздела в NTFS:
mount -t ntfs-3g -o loop /путь/к/образу.img /точка/монтирования
Речь идёт о доступе к данным из образа всего жёсткого диска, на котором может быть и загрузчик, и пустое (неразмеченное) пространство, и несколько разделов. Итак, Задача
У нас есть образ жёсткого диска hd.img, снятый с устройства номинальным размером 120 гигабайт, которое было разбито неизвестным образом :). Из этого образа диска надо извлечь данные. Решение
Такой процедуры, как монтирование жёсткого диска — не существует. Монтирование в любом случае будет происходить по разделам жёсткого диска, которые уже находятся в нашем hd.img.
Разделы внутри образа расположены линейно, то есть один за другим. Поэтому наша задача сводится к определению смещения, с которого начинается тот или иной раздел. 1. Определяем разбивку диска из образа
fdisk -l hd.img
Вы должны установить цилиндры. Вы можете сделать это из меню дополнительных функций.
Диск hd.img: 0 МБ, 0 байт 255 heads, 63 sectors/track, 0 cylinders Units = цилиндры of 16065 * 512 = 8225280 bytes Disk identifier: 0xe5009b66
Устр-во Загр Начало Конец Блоки Id Система hd.img2 * 1 4177 33551721 7 HPFS/NTFS Раздел 2 имеет различные физические/логические окончания: физ=(1023, 254, 63) логич=(4176, 254, 63) hd.img3 4178 14593 83666520 5 Расширенный Раздел 3 имеет различные физические/логические начала (не-Linux?): физ=(1023, 0, 1) логич=(4177, 0, 1) Раздел 3 имеет различные физические/логические окончания: физ=(1023, 254, 63) логич=(14592, 254, 63) hd.img5 4178 12504 66886596 7 HPFS/NTFS hd.img6 12505 14593 16779861 bc Неизвестный
Всё правильно, информация о количестве цилиндров в hd.img отсутствует, что и приводит к ошибкам. Плюс, начала и концы разделов указаны в цилиндрах, по которым невозможно определить смещение (оно нам нужно в байтах). 2. Выводим информацию о разбивке в нужном формате
Укажем команде fdisk выводить информацию о началах/концах разделов в секторах, а количество цилиндров укажем явно — по последнему, а именно — равным 14593.
fdisk -luC14593 hd.img
Диск hd.img: 0 МБ, 0 байт 255 heads, 63 sectors/track, 14593 cylinders, всего 0 секторов Units = секторы of 1 * 512 = 512 bytes Disk identifier: 0xe5009b66 Устр-во Загр Начало Конец Блоки Id Система hd.img2 * 63 67103504 33551721 7 HPFS/NTFS hd.img3 67103505 234436544 83666520 5 Расширенный hd.img5 67103568 200876759 66886596 7 HPFS/NTFS hd.img6 200876823 234436544 16779861 bc Неизвестный
Поплачем над разбивкой диска в другой раз. А пока нас интересует полученная информация, а именно:
Диск начинается с основного раздела под номером 2. Его начало смещено от начала диска (и, соответственно, от начала образа) на 63 сектора, то есть на 63x512=32256 байт. Форматирован в NTFS. Раздел под номером 3 - расширенный, остальные разделы лежат на нём. Раздел под номером 5 смещён на 67103568x512=34357026816 байт. Форматирован в NTFS. Раздел под номером 6 принадлежит программе Acronis. ID=bc это её «зона безопасности», в которой могут храниться резервные копии файлов и разделов, созданные с помощью этой программы.
3. Монтируем разделы из образа всего диска
Создаём каталоги для монтирования нужных разделов - это номера 2 и 5 в образе.
mkdir /mnt/sdx2 /mnt/sdx5
Теперь - самое главное. Монтируем раздел 2 из образа (его смещение, напоминаю, 32256 байт)
mount -t ntfs-3g -o loop,offset=32256 hd.img /mnt/sdx2
И, по аналогии, монтируем раздел под номером 5
mount -t ntfs-3g -o loop,offset=34357026816 hd.img /mnt/sdx5
Дикое число 34357026816 не нужно отдельно считать на калькуляторе. Вместо этого можно использовать конструкцию $((512*67103568)), где 67103568 — напоминаю — смещение, полученное из fdisk-а. Команда монтирования будет выглядеть так:
mount -t ntfs-3g -o loop,offset=$((512*67103568)) hd.img /mnt/sdx5
Раз уж зашла речь. Программа Acronis создаёт зону безопасности в формате vfat. Если есть желание подключить и её - выполняем:
mkdir /mnt/sdx6 mount -t vfat -o loop,offset=102848933376 hd.img /mnt/sdx6
Скрипт для монтирования партиций
Непроверенный, чужой. Источник не помню.
#!/bin/sh # Mount partitions within a disk image file # Author: P@adraigBrady.com # V1.0 29 Jun 2005 Initial release # V1.1 01 Dec 2005 Handle bootable (DOS) parititons if [ "$#" -ne "3" ]; then echo "Usage: `basename $0` " >&2 exit 1 fi if ! fdisk -v > /dev/null 2>&1; then echo "Can't find the fdisk util. Are you root?" >&2 exit 1 fi FILE=$1 PART=$2 DEST=$3 UNITS=`fdisk -lu $FILE 2>/dev/null | grep $FILE$PART | tr -d '*' | tr -s ' ' | cut -f2 -d' '` OFFSET=`expr 512 '*' $UNITS` mount -o loop,offset=$OFFSET $FILE $DEST