Montar una partición única a partir de la imagen de todo el disco (dispositivo)

Montar una partición única a partir de la imagen de todo el disco (dispositivo)

Hice una imagen de todo mi disco con

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

Ahora el problema es que me gustaría montar un sistema de archivos ext4 que estaba en ese disco pero

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

Obviamente da un error de superbloque ya que la imagen contiene todo el disco (MBR, otras particiones), no solo la partición que necesito. Así que supongo que debería encontrar una manera de hacer que la imagen del disco aparezca en la /dev/carpeta...

¿Alguien sabe cómo hacer eso?

PD: siempre puedo ddhacer una copia de seguridad de la imagen en el disco original, pero eso sería muy inconveniente (actualicé el sistema operativo y me gustaría mantenerlo como está)

Respuesta1

Obtener el diseño de partición de la imagen.

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

Calcule el desplazamiento desde el inicio de la imagen hasta el inicio de la partición

Tamaño del sector*Comenzar= (en el caso) 512 * 56 =28672

Móntelo en /dev/loop0 usando el desplazamiento

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

Ahora la partición reside en/dev/bucle0. Puedefsckmontarlo, etc.

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

Desmontar

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

Respuesta2

Actualización para Ubuntu 16.04:Con lo nuevo losetupesto ahora es más fácil:

sudo losetup -Pf disk_image.raw

Consulte el resto de la respuesta para versiones anteriores de Ubuntu.


Una solución fácil es usarkpartx: descubrirá el diseño de la partición y asignará cada una a un dispositivo de bloque. Después de eso lo único que tienes que hacer es montar el que quieras.

Abra Terminal, ubique la imagen del disco e ingrese este comando:

$ 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

Esta creado loop0p1y loop0p2bajo /dev/mapper. En el resultado puede ver los tamaños de las particiones, lo que le ayuda a identificarlas. Puedes montar el que quieras con:

$ sudo mount /dev/mapper/loop0p2 /mnt

Alternativamente, Nautilus detecta el dispositivo de bloque y puede montarlo desde la barra lateral:

ingrese la descripción de la imagen aquí

Cuando haya terminado, desmonte lo que montó y elimine la asignación del dispositivo:

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

Respuesta3

Editar: funciona conutilidad-linux >=2.21. Al momento de escribir este artículo, Ubuntu viene con la versión2.20solo

Dehombre perdido:

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

así que solo corre

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

para crear nodos de dispositivo para cada partición de la imagen de su disco en el primer dispositivo de bucle no utilizado e imprimirlo en la salida estándar. Si usa /dev/loop0un dispositivo, al menos podrá /dev/loop0p1montarlo como de costumbre.

Respuesta4

losetup -Pautomatización

losetup -Pes el mejor método a partir de Ubuntu 16.04 como se menciona enhttps://askubuntu.com/a/496576/52975, aquí hay funciones para automatizar si hay más. 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"
)

configuración del módulo de bucle max_part

Este es un método decente antes del 16.04.

loopes un módulo del kernel, integrado en el kernel de Ubuntu 14.04.

Si lo configura correctamente, Linux divide automáticamente los dispositivos por usted.

cat /sys/module/loop/parameters/max_part

dice cuántas particiones looppueden generar los dispositivos.

Está 0predeterminado en Ubuntu 14.04, por lo que no se produce ninguna división automática.

Para cambiarlo, podemos agregar:

options loop max_part=31

a un archivo en /etc/modprobe, o:

GRUB_CMDLINE_LINUX="loop.max_part=31"

hasta /etc/default/gruby luego sudo update-grub.

También se explica cómo configurar un parámetro de módulo en:¿Cómo agregar parámetros del módulo del kernel?

Después de reiniciar, cuando lo hagas:

sudo losetup -f --show my.img

monta la imagen en un /dev/loopXdispositivo y monta automáticamente las particiones en /dev/loopXpYlos dispositivos.

Este es el método más conveniente si está dispuesto a reiniciar.

Ver también

información relacionada