Обращаю внимание: речь идёт о монтировании не образа раздела, которое осуществляется достаточно просто.

Как, например, для образа раздела в 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



Александр
2011.01.20 11:56:41
#cid1351

Ответить

Огромное спасибо! Массу времени сберёг.

Павел
2012.08.07 16:09:52
#cid36622

Ответить

Спасибо большое! Очень полезная статья!

imen
2012.08.07 17:51:19
#cid36638

Ответить

Осторожно.
Буквально применять рекомендацию статьи можно только к достаточно старым дискам.
Написал бы и для общего случая.
Размер сектора в 512 байт уходит в прошлое.

2012.08.07 20:02:49
#cid36653

Ответить

#cid36638, imen

Осторожно.
Буквально применять рекомендацию статьи можно только к достаточно старым дискам.
Написал бы и для общего случая.
Размер сектора в 512 байт уходит в прошлое.

Units = секторы of 1 * 512 = 512 bytes

На эту запись сложно не обратить внимание.
Считаешь, есть смысл разжевать?

imen
2012.08.08 17:54:07
#cid36768

Ответить

Считаешь, есть смысл разжевать?

Считаю правильным начать с аналитической записи, прокомментировать её и только после этого подставлять конкретные цифры.

n1kt0
2015.04.24 16:11:04
#cid90504

Ответить

# losetup /dev/loop0 $image
# kpartx -av /dev/loop0
# mount /dev/mapper/loop0p1

2015.04.24 18:51:36
#cid90506

Ответить

#cid90504, n1kt0

# losetup /dev/loop0 $image
# kpartx -av /dev/loop0
# mount /dev/mapper/loop0p1

Безгеморный вариант. Спасибо.

adm
2015.05.14 00:01:35
#cid90593

Ответить

Спасибо, очень толково

imen
2015.05.14 16:30:25
#cid90597

Ответить

#cid90506,

Безгеморный вариант. Спасибо.

Решение красивое, но описание мягко говоря неполное.

# which kpartx
which: no kpartx in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.8.4:~/bin)

# emerge sys-fs/multipath-tools

# which kpartx
/sbin/kpartx

$ eix multipath
* sys-fs/multipath-tools
Available versions: 0.5.0-r1 {systemd}
Homepage: http://christophe.varoqui.free.fr/
Description: Device mapper target autoconfig

freegate78
2016.02.06 22:40:15
#cid91377

Ответить

спасибо! а то все мучился с образом винды для досбокса чтобы туда закатать файло
mount -t vfat -o loop,rw,offset=32256 /home/user/win98.img /home/user/win98

2016.03.03 04:48:49
#cid91416

Ответить

#cid91377, freegate78

win98.img

(глядит с запоздалым умилением)

У меня двоякое чувство. С одной стороны — ностальгия, с другой — рвотный рефлекс.

(на всякий случай двигает тазик поближе)