Einzelne Partition aus dem Image der gesamten Festplatte (des gesamten Geräts) mounten

Einzelne Partition aus dem Image der gesamten Festplatte (des gesamten Geräts) mounten

Ich habe ein Image meiner gesamten Festplatte erstellt mit

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

Das Problem ist nun, dass ich ein ext4-Dateisystem mounten möchte, das sich auf dieser Festplatte befand, aber

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

führt offensichtlich zu einem Superblock-Fehler, da das Image die gesamte Festplatte (MBR, andere Partitionen) enthält und nicht nur die Partition, die ich brauche. Ich schätze also, ich sollte einen Weg finden, das Festplatten-Image im Ordner anzuzeigen /dev/...

Weiß jemand, wie das geht?

PS: Ich kann dddas Image jederzeit auf der Originalfestplatte sichern, aber das wäre sehr umständlich (ich habe das Betriebssystem aktualisiert und möchte es so lassen, wie es ist).

Antwort1

Holen Sie sich das Partitionslayout des Images

$ 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 Offset vom Start des Images zum Partitionsstart

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

Mounten Sie es auf /dev/loop0 unter Verwendung des Offsets

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

Jetzt befindet sich die Partition auf/Entwickler/Loop0. Du kannstfsckes, montieren Sie es usw.

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

Aushängen

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

Antwort2

Update für Ubuntu 16.04:Mit der Neuen losetupist das nun einfacher:

sudo losetup -Pf disk_image.raw

Den Rest der Antwort finden Sie für ältere Versionen von Ubuntu.


Eine einfache Lösung ist die VerwendungAbonnieren: Es ermittelt das Partitionslayout und ordnet jedes einem Blockgerät zu. Danach müssen Sie nur noch das gewünschte Gerät mounten.

Öffnen Sie Terminal, suchen Sie das Disk-Image und geben Sie diesen 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

Dadurch wird loop0p1und loop0p2unter erstellt /dev/mapper. In der Ausgabe können Sie die Größe der Partitionen sehen, was Ihnen bei der Identifizierung hilft. Sie können die gewünschte Partition mit folgendem mounten:

$ sudo mount /dev/mapper/loop0p2 /mnt

Alternativ wird das Blockgerät von Nautilus erkannt und Sie können es über die Seitenleiste mounten:

Bildbeschreibung hier eingeben

Wenn Sie fertig sind, unmounten Sie das gemountete Gerät und entfernen Sie die Gerätezuordnung:

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

Antwort3

Bearbeiten: arbeitet mitutil-linux >=2.21. Zum Zeitpunkt des Schreibens dieses Artikels wird Ubuntu mit der Version2.20nur

AusMann verliert:

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

Also lauf einfach

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

um Geräteknoten für jede Partition Ihres Disk-Images auf dem ersten unbenutzten Loop-Gerät zu erstellen und auf stdout auszugeben. Wenn Sie /dev/loop0ein Gerät verwenden, wird zumindest das erstellt /dev/loop0p1, was Sie wie gewohnt mounten können.

Antwort4

losetup -PAutomatisierung

losetup -Pist die beste Methode ab Ubuntu 16.04, wie erwähnt unterhttps://askubuntu.com/a/496576/52975, hier sind Funktionen zur weiteren Automatisierung. Verwendung:

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

Loop-Modul max_part-Konfiguration

Dies ist eine gute Methode vor dem 16.04.

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

Bei richtiger Konfiguration 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.

Dies ist 0unter Ubuntu 14.04 die Standardeinstellung, weshalb keine automatische Aufteilung erfolgt.

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

options loop max_part=31

in eine Datei im /etc/modprobe, oder:

GRUB_CMDLINE_LINUX="loop.max_part=31"

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

Wie Sie einen Modulparameter festlegen, wird auch hier beschrieben:Wie füge ich Kernelmodulparameter hinzu?

Wenn Sie nach einem Neustart Folgendes tun:

sudo losetup -f --show my.img

Es mountet das Image auf einem /dev/loopXGerät und mountet die Partitionen automatisch auf /dev/loopXpYGeräten.

Wenn Sie einen Neustart durchführen möchten, ist dies die bequemste Methode.

Siehe auch

verwandte Informationen