Comment trouver le type d'un fichier img et le monter?

36

Je dois monter un fichier .img mais je ne sais pas quel type de .img il s'agit. Comment puis-je savoir quel type de fichier .img c'est?

# 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
#
Luigi
la source

Réponses:

34

Essayez d'exécuter la commande fdisk -l <img file>. Généralement, si les .imgfichiers sont des disques entiers, par exemple une machine virtuelle KVM, ils sont techniquement un disque virtuel.

Exemple

J'ai une machine virtuelle KVM CentOS qui apparaît comme telle avec la filecommande:

$ 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

Courir fdiskavec:

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

Si vous souhaitez monter l'une de ces partitions, procédez comme suit:

fdisk (sortie cylindre)
  • taille de bloc de 512 octets et le bloc de départ est 63.
  • Le décalage est 512 * 63 = 32256.
fdisk (sortie secteur)
  • taille de bloc de 512 octets et le bloc de départ est 1.
  • Le décalage est 512 * 1 = 512.

Donc, la commande mount serait:

en cylindres
$ mount -o loop,offset=32256 centostest.img /mnt/tmp

Pour monter l'autre partition (512 * 208845 = 106928640):

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

Pour monter l’autre partition (512 * 14 = 7168):

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

REMARQUE

Cela ne fonctionnera que si mount peut déterminer le type de système de fichiers dans la "partition" que vous essayez de monter. Vous devrez peut-être inclure -t auto, ou être spécifique et dire mountque c'est -t ext4par exemple.

Les références

slm
la source
# 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 - pouvez-vous poster ces commentaires en tant que mises à jour de votre question? Je ne peux pas voir ce qui se passe.
slm
@ Luigi - aucune garantie ne -t autopeut identifier le type de la partition. Vous devrez simplement essayer les autres pour voir ce qui fonctionne.
slm
Comment déterminer le décalage pour la 2ème partition? pourquoi 512x14? et ma 1ère partition n'est W95 FAT16 (LBA) -t vfatpas parvenue à monter ma 1ère partition.
Necktwi
21

Utilisez partedpour identifier les valeurs de décalage.

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) 

Vous avez maintenant des valeurs de décalage que vous pouvez utiliser pour monter des systèmes de fichiers.

# 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
Fayiz Musthafa
la source
1
Les réponses à une ou deux lignes sont souvent considérées comme peu utiles. Pensez à développer votre explication de votre recommandation ou à faire un lien vers la documentation pertinente ou des ressources utiles.
HalosGhost le
Absolument meilleur avec un peu d'explication, la réponse la plus efficace pour moi ici, merci Fayiz / HalosGhost!
mardi
séparé: étiquette de disque non reconnue
utilisateur180574
1

On dirait que @slm a des maths débiles, ou du moins ne correspond pas à la fdisk -lsortie. D'après les révisions, il semble que l'ajout du uparamètre à fdisk a changé de cylindres en secteurs? Je sais pas, mais ça ne fait rien sur le mien car le défaut devrait être secteurs.

Sur mon image:

$ 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

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

Dans mon exemple, fdisk dit de commencer à 2048 * 512 blocs = 1048576.

eresonance
la source
1

Une version moderne de la filecommande rapporte le secteur de démarrage de manière beaucoup plus pratique que fdisk ou 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

Cette sortie one-liner peut être scriptée comme ceci:

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
Jürgen Weigert
la source
1

losetup -P automatisation

Les scripts suivants montent automatiquement toutes les partitions d'une image.

Usage:

$ 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

La source:

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

Testé dans Ubuntu 16.04.

Ciro Santilli 改造 中心 六四 事件
la source