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

99

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

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

    
задан Nicola Feltrin 19.10.2011 в 16:36
источник

7 ответов

127

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

$ 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

Unmount

sudo umount /mnt
sudo losetup -d /dev/loop0
    
ответ дан arrange 19.10.2011 в 19:55
источник
89

Обновление для 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 02.10.2013 в 12:12
22

Изменить : работает с util-linux > = 2.21 . Во время написания ubuntu отправляется только версия 2.20

Из man 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 , который вы сможете установить, как обычно.

    
ответ дан Ludovic Ronsin 11.07.2014 в 17:29
7

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

gnome-disk-image-mounter sda.img

Нет sudo . Он будет установлен на /media/your_user_name/partition_name , как USB-накопители.

    
ответ дан Mihai Capotă 23.07.2015 в 22:02
6

losetup -P automation

losetup -P - лучший способ, начиная с Ubuntu 16.04, как упоминалось в Ссылка , здесь есть функции для автоматизации, если , Использование:

$ 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"
)

модуль loop max_part config

Это достойный метод до 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 .

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

См. также

ответ дан Ciro Santilli 新疆改造中心 六四事件 法轮功 12.09.2015 в 11:04
4

Используйте losetup для прикрепления всего образа диска.

# 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
    
ответ дан Mike Bappe 10.10.2014 в 12:45
2

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

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

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

Чтобы упростить задачу (что необходимо, если вы это часто делаете), вы можете использовать мой скрипт 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 it:

umount /media/sda_image
    
ответ дан Alexander Amelkin 11.11.2016 в 10:13