Смонтировать один раздел из образа всего диска (устройства)

Смонтировать один раздел из образа всего диска (устройства)

Я сделал образ всего моего диска с помощью

dd if=/dev/sda of=/media/external_media/sda.img

Теперь проблема в том, что я хотел бы смонтировать файловую систему ext4, которая была на этом диске, но

mount -t ext4 -o loop /media/external_media/sda.img /media/sda_image

очевидно, выдает ошибку суперблока, поскольку образ содержит весь диск (MBR, другие разделы), а не только нужный мне раздел. Так что, полагаю, мне следует найти способ заставить образ диска отображаться в папке /dev/...

Кто-нибудь знает как это сделать?

PS: Я всегда могу ddвернуть образ на исходный диск, но это будет очень неудобно (я обновил ОС и хотел бы оставить все как есть)

решение1

Получить схему разделов изображения

$ sudo fdisk -lu sda.img
...
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
...
  Device Boot      Start         End      Blocks   Id  System
sda.img1   *          56     6400000     3199972+   c  W95 FAT32 (LBA)

Рассчитайте смещение от начала изображения до начала раздела

Размер сектора*Начинать= (в случае) 512 * 56 =28672

Смонтируйте его на /dev/loop0, используя смещение

sudo losetup -o 28672 /dev/loop0 sda.img

Теперь раздел находится на/dev/loop0. Ты можешьfsckэто, смонтировать его и т.д.

sudo fsck -fv /dev/loop0
sudo mount /dev/loop0 /mnt

Демонтировать

sudo umount /mnt
sudo losetup -d /dev/loop0

решение2

Обновление для Ubuntu 16.04:С новым решением losetupэто стало проще:

sudo losetup -Pf disk_image.raw

Остальную часть ответа смотрите для более старых версий Ubuntu.


Простое решение — использоватьkpartx: он определит схему раздела и сопоставит каждый с блочным устройством. После этого вам останется только смонтировать нужный вам раздел.

Откройте Терминал, найдите образ диска и введите следующую команду:

$ sudo kpartx -av disk_image.raw 
add map loop0p1 (252:2): 0 3082240 linear /dev/loop0 2048
add map loop0p2 (252:3): 0 17887232 linear /dev/loop0 3084288

Это создало loop0p1и loop0p2под /dev/mapper. Из вывода вы можете увидеть размеры разделов, что поможет вам идентифицировать их. Вы можете смонтировать тот, который вам нужен, с помощью:

$ sudo mount /dev/mapper/loop0p2 /mnt

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

введите описание изображения здесь

Когда вы закончите, отмонтируйте то, что вы смонтировали, и удалите сопоставление устройств:

$ sudo umount /mnt
$ sudo kpartx -d disk_image.raw

решение3

Редактировать: работает сutil-linux >=2.21. На момент написания статьи Ubuntu поставляется с версией2.20только

Отчеловек проиграл:

       -P, --partscan
          force kernel to scan partition table on newly created loop device

Так что просто беги.

$ sudo losetup -f --show -P /path/to/image.img

для создания узлов устройств для каждого раздела вашего образа диска на первом неиспользуемом устройстве цикла и вывода его на stdout. Если используется /dev/loop0устройство, то будет создано по крайней мере /dev/loop0p1то, что вы сможете смонтировать как обычно.

решение4

losetup -Pавтоматизация

losetup -Pэто лучший метод, начиная с Ubuntu 16.04, как указано вhttps://askubuntu.com/a/496576/52975, вот функции для дальнейшей автоматизации. Использование:

$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2

$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there

$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                                                      DIO
/dev/loop1         0      0         0  0 /full/path/to/my.img

$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0

Источник:

los() (
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst"
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
losd() (
  dev="/dev/loop$1"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    sudo umount "$dst"
  done
  sudo losetup -d "$dev"
)

Конфигурация max_part модуля цикла

Это приличный метод до 16.04.

loop— модуль ядра, встроенный в ядро ​​Ubuntu 14.04.

Если вы правильно настроите, Linux автоматически разделит устройства.

cat /sys/module/loop/parameters/max_part

говорит, сколько разделов loopмогут генерировать устройства.

В Ubuntu 14.04 это 0установлено по умолчанию, поэтому автоматического разделения не происходит.

Чтобы изменить это, мы можем добавить:

options loop max_part=31

в файл в /etc/modprobe, или:

GRUB_CMDLINE_LINUX="loop.max_part=31"

к /etc/default/grubи затем sudo update-grub.

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

После перезагрузки, когда вы делаете:

sudo losetup -f --show my.img

он монтирует образ на /dev/loopXустройство и автоматически монтирует разделы на /dev/loopXpYустройства.

Так что это самый удобный способ, если вы готовы перезагрузиться.

Смотрите также

Связанный контент