Wie finde ich den Typ einer IMG-Datei und mounte sie?


36

Ich muss eine .img-Datei mounten, weiß aber nicht, um welche Art von .img es sich handelt. Wie kann ich herausfinden, um welchen Typ von IMG-Datei es sich handelt?

# mount -t auto -o ro,loop gmapsupp.img /mnt/iso/
mount: you must specify the filesystem type
# file -k gmapsupp.img 
gmapsupp.img: x86 boot sector, code offset 0x0
#

Antworten:


34

Führen Sie den Befehl aus fdisk -l <img file>. Wenn es sich bei den .imgDateien um vollständige Datenträger handelt, beispielsweise um eine KVM-VM, handelt es sich in der Regel um einen virtuellen Datenträger.

Beispiel

Ich habe eine CentOS KVM VM, die wie folgt aussieht file:

$ file centostest.img 
centostest.img: x86 boot sector; partition 1: ID=0x83, active, starthead 1, startsector 63, 208782 sectors; partition 2: ID=0x8e, starthead 0, startsector 208845, 20755980 sectors, code offset 0x48

Laufen fdiskdamit:

$ sudo /sbin/fdisk -lu /kvm/centostest.img
last_lba(): I don't know how to handle files with mode 81ed
You must set cylinders.
You can do this from the extra functions menu.

Disk /kvm/centostest.img: 0 MB, 0 bytes
255 heads, 63 sectors/track, 0 cylinders, total 0 sectors
Units = sectors of 1 * 512 = 512 bytes

              Device Boot      Start         End      Blocks   Id  System
/kvm/centostest.img1   *          63      208844      104391   83  Linux
/kvm/centostest.img2          208845    20964824    10377990   8e  Linux LVM
Partition 2 has different physical/logical endings:
     phys=(1023, 254, 63) logical=(1304, 254, 63)

Wenn Sie eine dieser Partitionen mounten möchten, können Sie dies wie folgt tun:

fdisk (Zylinderleistung)
  • Blockgröße von 512 Bytes und der Startblock ist 63.
  • Der Versatz beträgt 512 * 63 = 32256.
fdisk (Sektorausgabe)
  • Blockgröße von 512 Bytes und der Startblock ist 1.
  • Der Versatz beträgt 512 * 1 = 512.

Der Befehl mount wäre also:

in Zylindern
$ mount -o loop,offset=32256 centostest.img /mnt/tmp

So hängen Sie die andere Partition ein (512 * 208845 = 106928640):

$ mount -o loop,offset=106928640 centostest.img /mnt/tmp
in Branchen
$ mount -o loop,offset=512 centostest.img /mnt/tmp

So hängen Sie die andere Partition ein (512 * 14 = 7168):

$ mount -o loop,offset=7168 centostest.img /mnt/tmp

HINWEIS

Dies funktioniert nur, wenn mount den Typ des Dateisystems in der "Partition" bestimmen kann, die Sie bereitstellen möchten. Möglicherweise müssen Sie einbeziehen -t autooder genau angeben, mountdass dies -t ext4beispielsweise der Fall ist .

Verweise


# mount -t auto -o ro,loop,offset=512 gmapsupp.img /mnt/iso/\mount: you must specify the filesystem type
Luigi

# fdisk -l gmapsupp.img Disk gmapsupp.img: 0 MB, 0 bytes 255 heads, 63 sectors/track, 0 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System gmapsupp.img1 1 9 65536 0 Empty Partition 1 has different physical/logical endings: phys=(1023, 15, 8) logical=(8, 40, 32) Partition 1 does not end on cylinder boundary.
Luigi

@Luigi - kannst du diese Kommentare als Updates für deine Frage posten? Ich kann nicht sehen, was los ist.
SLM

@Luigi - Es gibt keine Garantie, dass -t autoder Typ der Partition identifiziert werden kann. Sie müssen nur versuchen, andere zu sehen, was funktioniert.
SLM

Wie wird der Offset für die 2. Partition ermittelt? warum 512x14? und meine 1. Partition W95 FAT16 (LBA) -t vfatkonnte meine 1. Partition nicht mounten.
Necktwi

21

Dient partedzum Identifizieren von Versatzwerten.

root@mysystem:~/# parted myimage.img
GNU Parted 2.3
Using /root/myimage.img
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) u
Unit?  [compact]? B
(parted) print
Model:  (file)
Disk /root/myimage.img: 8589934592B
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start        End          Size         Type     File system     Flags
 1      32256B       254983679B   254951424B   primary  ext3            boot
 2      254983680B   1274918399B  1019934720B  primary  linux-swap(v1)
 3      1274918400B  3323013119B  2048094720B  primary  ext3
 4      3323013120B  8587192319B  5264179200B  primary  ext3

(parted) 

Jetzt haben Sie Versatzwerte und können diese zum Mounten von Dateisystemen verwenden.

# mount -o loop,offset=32256 myimage.img /mnt/disk1 
# mount -o loop,offset=1274918400 myimage.img /mnt/disk2
# mount -o loop,offset=3323013120 myimage.img /mnt/disk3

1
Ein- oder zweizeilige Antworten werden oft als nicht hilfreich angesehen. Erwägen Sie, die Erläuterung Ihrer Empfehlung zu erweitern oder auf relevante Dokumentationen oder hilfreiche Ressourcen zu verweisen.
HalosGhost

Definitiv besser mit ein bisschen Erklärung, die effizienteste Antwort für mich hier, danke Fayiz / HalosGhost!
Tisc0

parted:
Unbekanntes

1

Es sieht so aus, als ob @slm etwas Wonky Mathe hat oder zumindest nicht mit der fdisk -lAusgabe übereinstimmt . In den Überarbeitungen sieht es so aus, als würde der uParameter zu fdisk hinzugefügt und von Zylindern zu Sektoren geändert. Keine Ahnung, aber auf meiner Seite macht es nichts, da die Standardeinstellung Sektoren sein sollte.

Auf meinem Bild:

$ fdisk -l bone-debian-7.5-2015-01-14-beaglebone.img
Disk bone-debian-7.5-2015-01-14-beaglebone.img: 3.7 GiB, 3965190144 bytes, 7744512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device                                     Boot     Start       End  Blocks  Id System
bone-debian-7.5-2015-01-14-beaglebone.img1 *         2048    198655   98304   e W95 FAT16 (LBA)
bone-debian-7.5-2015-01-14-beaglebone.img2         198656   3481599 1641472  83 Linux

$ sudo mount -t vfat -o loop,offset=1048576,ro bone-debian-7.5-2015-01-14-beaglebone.img /mnt

Woher

offset = Block size from 'Units' x Fdisk 'Start' column

In meinem Beispiel sagt fdisk start at 2048 * 512 block size = 1048576.


1

Eine moderne Version des fileBefehls meldet den Startsektor viel bequemer als fdisk oder parted:

file $img Armbian_jw.img: DOS/MBR boot sector; partition 1 : ID=0x83, start-CHS (0x40,0,1), end-CHS (0x3ff,3,32), startsector 8192, 2883584 sectors

Diese einzeilige Ausgabe kann folgendermaßen geschrieben werden:

startsector=$(file $img | sed -n -e 's/.* startsector *\([0-9]*\),.*/\1/p')
offset=$(expr $startsector '*' 512)
echo $offset
 4194304
sudo mount -o loop,offset=$offset $img /mnt

1

losetup -P Automatisierung

Die folgenden Skripte stellen automatisch alle Partitionen eines Images bereit.

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

Getestet in Ubuntu 16.04.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.