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

117

Я сделал образ всего моего диска с

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вернуть образ на исходный диск, но это было бы очень неудобно (я обновил ОС и хотел бы оставить его как есть)

Никола Фельтрин
источник

Ответы:

142

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

$ 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
организовать
источник
Спасибо вам большое! Работал как шарм! Вы сделали мой день (и спас невинного Оцелота от жестокого удаления; P)
Никола Фелтрин
8
По крайней мере, на bash, оболочка может даже сделать математику для вас:sudo losetup -o $((56*512)) /dev/loop0 sda.img
Enno Gröper
1
Это не просто полезно, это просто потрясающе.
andho
Что если есть .img1 и .img2? "win8.raw1 * 2048 718847 358400 7" и "win8.raw2 718848 52426751 25853952 7"
Enkouyami
6
Еще проще: mount -o loop,offset=$((56 * 512)) sda.img /mnt. Источник: madduck.net/blog/…
острокач
105

Обновление для 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
Joni
источник
Отличный ответ, быстрый и простой, хорошо избегать шага умножения
Старейшина Гик
sudo apt-get install kpartx- получить доступ к kpartx. kpartxСсылка в начале поста является «ловушка» на мой взгляд. Ссылки, которые подразумевают установку программного обеспечения, запрещены.
Ханну
1
@ Ханну, ссылки, которые интегрируются с Центром программного обеспечения, являются обычной практикой в ​​Askubuntu , хотя в этом конкретном случае можно добавить типичный значок и обновить URL.
Джони
losetup -PfРанее было упомянуто askubuntu.com/a/496576/52975 Я рекомендую вам, по крайней мере, ссылку на этот ответ.
Сиро Сантилли 事件 改造 中心 法轮功 六四 事件
1
К вашему сведению, losetup -Pf ..команда создаст такие устройства, /dev/loopXpYкоторые вам еще нужно смонтировать. Вы можете найти, Xпосмотрев на вывод losetupкоманды. Номер Yраздела.
Gunchars
26

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

От человека losetup :

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

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

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

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

Людовик Ронсин
источник
2
Где я могу найти эту версию losetup? У того, что есть в Ubuntu 14.04, есть справочная страница от июля 2003 года (util-linux) и нет опции `-P` (или чего-либо еще) для сканирования разделов.
Ханну
1
Извините, я сделал ошибку, я использовал эту опцию в Arch Linux, который поставляется с более свежей версией пакета util-linux. Кажется, что Ubuntu, к сожалению, застрял на версии 2.20.1, которая была выпущена в январе 2012 года! --partscanВариант был введен в Util-Linux 2.21
Людовик Ronsin
1
Ну, gnome-disksесть возможность смонтировать образ диска и его разделов. (<- это для установки и использования bash / Terminal, Disksв тире тоже его находит).
Ханну
2
Это должен быть принятый ответ ...
matthid
@matthid ли вообще возможно изменить принятый ответ? Это хорошо (и ответ kpartx на самом деле зависит от этой версии losetup), но он почти на три года новее, чем принятый ответ - как это было в то время.
Auspex
9

Попробуй gnome-disk-image-mounter:

gnome-disk-image-mounter sda.img

Не sudoтребуется Он будет установлен на /media/your_user_name/partition_nameUSB-накопителе.

Михай Капотэ
источник
1
Работал хорошо 16.04. Я только что установил свежую версию 18.04, и инструменты запрашивают пароль sudo для доступа к виртуальному устройству / dev / loopXX :(
Laurent
7

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 config

Это достойный метод до 16.04.

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

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

cat /sys/module/loop/parameters/max_part

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

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

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

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устройства.

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

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

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
5

Используйте losttup, чтобы прикрепить весь образ диска.

# sudo losetup /dev/loop2 sda.img

Затем используйте mdadm для создания md-устройства, и для всех разделов будут созданы блочные устройства.

# sudo mdadm --build --level=0 --force --raid-devices=1 /dev/md2 /dev/loop2
mdadm: array /dev/md2 built and started.

Теперь вы должны увидеть раздел устройства.

nile-172-b0fef38-76:/mnt/sdb1 # ls -l /dev/md2*
brw-rw---- 1 root disk   9, 2 Oct 10 12:37 /dev/md2
brw-rw---- 1 root disk 259, 0 Oct 10 12:37 /dev/md2p1
Майк Баппе
источник
Это забавный трюк :)
Johan
4

На мой взгляд, самый простой способ - использовать, mount -o loop,offset=...как упоминалось в этом ответе, StackOverflow . Идея заключается в следующем:

fdisk -l $IMAGE
# calculate the offset in bytes
mount -o loop,offset=$OFFSET $IMAGE $MOUNTPOINT

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

Чтобы еще больше упростить задачу (что необходимо, если вы делаете это часто), вы можете использовать мой скрипт, mountimgчтобы сделать все для вас. Просто получите его по адресу https://github.com/AlexanderAmelkin/mountimg и используйте так:

mountimg /media/external_media/sda.img 2 /media/sda_image

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

mountimg /media/external_media/sda.img 2 /media/sda_image -t vfat -o codepage=866,iocharset=utf-8

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

umount /media/sda_image
Александр Амелькин
источник