¿Cómo encontrar el tipo de un archivo img y montarlo?

36

Tengo que montar un archivo .img pero no sé qué tipo de .img es. ¿Cómo puedo averiguar qué tipo de archivo .img es?

# 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
fuente

Respuestas:

34

Intenta ejecutar el comando fdisk -l <img file>. Por lo general, si los .imgarchivos son discos completos de, por ejemplo, una máquina virtual KVM, técnicamente son un disco virtual.

Ejemplo

Tengo una máquina virtual CentOS KVM que se muestra así con el filecomando:

$ 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

Corriendo fdiskcon eso:

$ 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 desea montar una de estas particiones, puede hacerlo de la siguiente manera:

fdisk (salida del cilindro)
  • tamaño de bloque de 512 bytes y el bloque de inicio es 63.
  • El desplazamiento es 512 * 63 = 32256.
fdisk (salida del sector)
  • tamaño de bloque de 512 bytes y el bloque de inicio es 1.
  • El desplazamiento es 512 * 1 = 512.

Entonces el comando de montaje sería:

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

Para montar la otra partición (512 * 208845 = 106928640):

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

Para montar la otra partición (512 * 14 = 7168):

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

NOTA

Esto solo funcionará si mount puede determinar el tipo de sistema de archivos dentro de la "partición" que está intentando montar. Es posible que deba incluir -t autoo ser específico y decir mountque es -t ext4por ejemplo.

Referencias

slm
fuente
# 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: ¿puede publicar estos comentarios como actualizaciones de su pregunta? No puedo ver lo que está pasando.
slm
@Luigi: no hay garantía de que -t autopueda identificar el tipo de partición. Tendrás que probar otros para ver qué funciona.
slm
¿Cómo determinar el desplazamiento para la 2da partición? ¿Por qué 512x14? y mi primera partición W95 FAT16 (LBA) -t vfatno pudo montar mi primera partición.
Necktwi
21

Se usa partedpara identificar valores de desplazamiento.

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) 

Ahora tiene valores de desplazamiento y puede usarlos para montar sistemas de archivos.

# 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
fuente
1
Las respuestas de una o dos líneas a menudo se consideran no tan útiles. Considere ampliar su explicación de su recomendación o vincularla a documentación relevante o recursos útiles.
HalosGhost
Definitivamente mejor con un poco de explicación, la respuesta más eficiente para mí aquí, ¡gracias Fayiz / HalosGhost!
tisc0
despedida: etiqueta de disco no reconocida
usuario180574
1

Parece que @slm tiene algunas matemáticas inestables, o al menos no coincide con la fdisk -lsalida. De las revisiones parece que se agrega elu parámetro a fdisk cambió de cilindros a sectores. No sé, pero no hace nada en la mía ya que el valor predeterminado debería ser sectores.

En mi imagen:

$ 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

Dónde

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

En mi ejemplo, fdisk dice comenzar en 2048 * 512 tamaño de bloque = 1048576.

eresonance
fuente
1

Una versión moderna del filecomando informa al sector de inicio de una manera mucho más conveniente que fdisk o 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

Esta salida de una línea se puede escribir así:

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
fuente
1

losetup -P automatización

Los siguientes scripts montan automáticamente todas las particiones de una imagen.

Uso:

$ 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

Fuente:

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

Probado en Ubuntu 16.04.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente