Змонтувати один розділ із зображення цілого диска (пристрою)


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)

Обчисліть зміщення від початку зображення до початку розділу

Розмір сектору * Start = (у випадку) 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
Принаймні, на баші, оболонка може навіть зробити для вас математику:sudo losetup -o $((56*512)) /dev/loop0 sda.img
Енно Грьопер

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/…
ostrokach

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

Відмінна відповідь, швидко та легко, уникаючи кроку множення приємно
старійшина Гік

sudo apt-get install kpartx- отримати доступ до kpartx. kpartxПосилання на початку поста є «пастка» на мій погляд. Посилання, що передбачають встановлення програмного забезпечення - це ні-ні.
Ханну

1
@Hannu, посилання, що інтегруються з Software Center, є звичайною практикою на askubuntu , хоча в цьому конкретному випадку типовий значок можна додати і URL-адресу слід оновити.
Джоні

losetup -Pfраніше згадувався askubuntu.com/a/496576/52975, я рекомендую вам принаймні посилання на цю відповідь.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

1
FYI, losetup -Pf ..команда створить такі пристрої, /dev/loopXpYякі ще потрібно встановити. Ви можете ознайомитись Xз того, щоб подивитися на вихід losetupкоманди. Це Yномер розділу.
Стрілець

26

Редагувати : працює з 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те, що ви зможете монтувати як завжди.


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_name, як і USB-накопичувачі.


1
Добре працював 16.04. Щойно я встановив свіжий 18.04, і інструменти просять пароль для sudo, щоб отримати доступ до віртуального пристрою / dev / loopXX :(
Лоран

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пристрої.

Тож це найзручніший метод, якщо ви готові перезавантажити.

Дивитися також


5

Скористайтеся програмою "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

Це смішна хитрість :)
Йохан Буле

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.