Einzelne Partition vom Image der gesamten Festplatte (Gerät) mounten

117

Ich habe ein Image meiner gesamten Festplatte mit erstellt

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

Jetzt ist das Problem, ich möchte ein ext4-Dateisystem mounten, das sich aber auf dieser Platte befand

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

Offensichtlich gibt es einen Superblock-Fehler, da das Image die gesamte Festplatte (MBR, andere Partitionen) enthält, nicht nur die Partition, die ich benötige. Ich denke, ich sollte einen Weg finden, das Disk-Image im /dev/Ordner anzuzeigen ...

Weiß jemand, wie man das macht?

PS: Ich kann dddas Image immer auf die ursprüngliche Festplatte zurückschreiben, aber das wäre sehr unpraktisch. (Ich habe das Betriebssystem aktualisiert und möchte es so lassen, wie es ist.)

Nicola Feltrin
quelle

Antworten:

142

Ruft das Partitionslayout des Images ab

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

Berechnen Sie den Versatz vom Start des Bildes zum Start der Partition

Sektorgröße * Starten = (im Fall) 512 * 56 = 28672

Mounten Sie es mit dem Offset auf / dev / loop0

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

Jetzt befindet sich die Partition in / dev / loop0 . Sie können es überprüfen , mounten usw

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

Aushängen

sudo umount /mnt
sudo losetup -d /dev/loop0
ordnen
quelle
Ich danke dir sehr! Lief wie am Schnürchen! Du hast meinen Tag gemacht (und einen unschuldigen Ocelot
davor bewahrt
8
Zumindest auf der Bash kann die Shell sogar die Mathematik für Sie erledigen:sudo losetup -o $((56*512)) /dev/loop0 sda.img
Enno Gröper
1
Das ist nicht nur hilfreich, das ist absolut fantastisch.
Andho
Was ist, wenn es eine .img1 und eine .img2 gibt? "win8.raw1 * 2048 718847 358400 7" und "win8.raw2 718848 52426751 25853952 7"
Enkouyami
6
Noch einfacher: mount -o loop,offset=$((56 * 512)) sda.img /mnt. Quelle: madduck.net/blog/…
ostrokach
105

Update für Ubuntu 16.04: Mit dem neuen ist losetupdies jetzt einfacher:

sudo losetup -Pf disk_image.raw

Lesen Sie den Rest der Antwort für ältere Versionen von Ubuntu.


Eine einfache Lösung ist die Verwendung von kpartx : Es ermittelt das Partitionslayout und ordnet es jeweils Blockgeräten zu. Danach müssen Sie nur noch das gewünschte montieren.

Öffnen Sie das Terminal, suchen Sie das Image und geben Sie den folgenden Befehl ein:

$ 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

Dies schuf loop0p1und loop0p2unter /dev/mapper. In der Ausgabe sehen Sie die Größe der Partitionen, anhand derer Sie diese leichter identifizieren können. Sie können den gewünschten montieren mit:

$ sudo mount /dev/mapper/loop0p2 /mnt

Alternativ wird das Blockiergerät von Nautilus erkannt und Sie können es von der Seitenleiste aus montieren:

Bildbeschreibung hier eingeben

Wenn Sie fertig sind, heben Sie die Bereitstellung auf und entfernen Sie die Gerätezuordnung:

$ sudo umount /mnt
$ sudo kpartx -d disk_image.raw
Joni
quelle
Hervorragende Antwort, schnell und einfach, Vermeidung des Multiplikationsschritts ist nett
Elder Geek
sudo apt-get install kpartx- um Zugriff auf kpartx zu erhalten. Der kpartxLink am Anfang des Beitrags ist meiner Meinung nach eine "Falle". Links, die die Installation von Software implizieren, sind ein Nein-Nein.
Hannu
1
@Hannu, Links, die sich in Software Center integrieren lassen, sind bei askubuntu eine gängige Praxis. In diesem speziellen Fall könnte jedoch das typische Symbol hinzugefügt und die URL aktualisiert werden.
Joni
losetup -Pfvon zuvor erwähnt worden askubuntu.com/a/496576/52975 empfehle ich , dass Sie zumindest Link zu dieser Antwort.
Ciro Santilli am
1
Zu Ihrer Information, der losetup -Pf ..Befehl erstellt Geräte /dev/loopXpY, die Sie noch mounten müssen. Sie finden die XAusgabe des losetupBefehls. Das Yist die Partitionsnummer.
Gunchars
26

Bearbeiten : funktioniert mit util-linux> = 2.21 . Zum Zeitpunkt des Schreibens wird Ubuntu nur mit Version 2.20 ausgeliefert

Vom Mann losetup :

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

Also renn einfach

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

Erstellen Sie Geräteknoten für jede Partition Ihres Festplattenabbilds auf dem ersten nicht verwendeten Loop-Gerät und drucken Sie es auf stdout. Wenn Sie ein /dev/loop0Gerät verwenden, wird dies zumindest dazu führen, /dev/loop0p1dass Sie wie gewohnt mounten können.

Ludovic Ronsin
quelle
2
Wo finde ich diese Version von losetup? Die in Ubuntu 14.04 verwendete hat eine Manpage von Juli 2003 (util-linux) und keine Option `-P` (oder etwas anderes) zum Scannen von Partitionen.
Hannu
1
Tut mir leid, ich habe einen Fehler gemacht. Ich habe diese Option unter Arch Linux verwendet, das mit einer neueren Version des Util-Linux-Pakets geliefert wird. Es scheint, dass Ubuntu leider auf Version 2.20.1 hängt, die im Januar 2012 veröffentlicht wurde! Die --partscanOption wurde in util-linux 2.21
Ludovic Ronsin
1
Nun, gnome-diskshat eine Option zum Mounten eines Disk-Images und seiner Partitionen. (<- das ist für die Installation und Bash / Terminal-Verwendung, Disksim Bindestrich findet es auch).
Hannu
2
Dies sollte die akzeptierte Antwort sein ...
Mittwoch,
@matthid Ist es überhaupt möglich , eine akzeptierte Antwort zu ändern? Dies ist gut (und die kpartx-Antwort ist tatsächlich abhängig von dieser Version von losetup), aber es ist fast drei Jahre neuer als die akzeptierte Antwort - und das war zu diesem Zeitpunkt der richtige Weg.
Auspex
9

Versuchen Sie gnome-disk-image-mounter:

gnome-disk-image-mounter sda.img

Nicht sudoerforderlich Es wird /media/your_user_name/partition_namewie USB-Laufwerke an gemountet .

Mihai Capota
quelle
1
Funktionierte gut am 16.04. Ich habe gerade einen neuen 18.04 installiert und das Tool fragt nach dem Sudo-Passwort, um auf das virtuelle Gerät / dev / loopXX zuzugreifen :(
Laurent
7

losetup -P Automatisierung

losetup -Pist die beste Methode ab Ubuntu 16.04 (siehe https://askubuntu.com/a/496576/52975) . Hier finden Sie Funktionen, die Sie bei Bedarf automatisieren können. Verwendungszweck:

$ 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

Quelle:

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

Schleifenmodul max_part config

Dies ist eine anständige Methode vor dem 16.04.

loop ist ein Kernelmodul, das in Ubuntu 14.04 in den Kernel integriert ist.

Wenn Sie es richtig konfigurieren, teilt Linux die Geräte automatisch für Sie auf.

cat /sys/module/loop/parameters/max_part

gibt an, wie viele Partitionen loopGeräte generieren können.

Unter 0Ubuntu 14.04 ist dies standardmäßig der Fall, weshalb keine automatische Aufteilung erfolgt.

Um es zu ändern, können wir entweder hinzufügen:

options loop max_part=31

in eine Datei in /etc/modprobeoder:

GRUB_CMDLINE_LINUX="loop.max_part=31"

zu /etc/default/grubund dann sudo update-grub.

Wie Sie einen Modulparameter einstellen, erfahren Sie auch unter: Wie füge ich Kernelmodulparameter hinzu?

Wenn Sie nach einem Neustart Folgendes tun:

sudo losetup -f --show my.img

Das Image wird an ein /dev/loopXGerät angehängt und die Partitionen werden automatisch an /dev/loopXpYGeräte angehängt.

Dies ist die bequemste Methode, wenn Sie einen Neustart durchführen möchten.

Siehe auch

Ciro Santilli ist ein Schauspieler
quelle
5

Verwenden Sie losetup, um das gesamte Disk-Image anzuhängen.

# sudo losetup /dev/loop2 sda.img

Verwenden Sie dann mdadm, um ein MD-Gerät zu erstellen, und Blockgeräte werden für alle Partitionen erstellt.

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

Jetzt sollten Sie die Partitionsgeräte sehen.

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
quelle
Das ist ein lustiger Trick :)
Johan Boulé
4

Der einfachste Weg ist meiner Meinung nach, mount -o loop,offset=...wie in dieser Antwort auf StackOverflow erwähnt . Die Idee ist wie folgt:

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

Die beste Methode ist, weil das Loop-Gerät nach dem Ummounten der gemounteten Partition nicht gelöscht werden muss.

Um die Aufgabe weiter zu vereinfachen (was erforderlich ist, wenn Sie es oft tun), können Sie mein Skript verwenden mountimg, um alles für Sie zu tun. Holen Sie es sich einfach unter https://github.com/AlexanderAmelkin/mountimg und verwenden Sie es wie folgt:

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

Sie können auch den Dateisystemtyp und andere zusätzliche Mount-Optionen angeben, wenn Sie möchten:

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

Wenn Sie mit der Partition fertig sind, gehen Sie einfach folgendermaßen vor umount:

umount /media/sda_image
Alexander Amelkin
quelle