Montar una partición única de la imagen del disco completo (dispositivo)

117

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 creo 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 hacer una ddcopia 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á)

Nicola Feltrin
fuente

Respuestas:

142

Obtenga 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 * Inicio = (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 / loop0 . Puedes fsck , montarlo, etc.

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

Desmontar

sudo umount /mnt
sudo losetup -d /dev/loop0
organizar
fuente
Muchas gracias! ¡Trabajado como un encanto! Me alegraste el día (y salvaste a un inocente Ocelote de ser brutalmente eliminado; P)
Nicola Feltrin
8
Al menos en bash, el shell incluso puede hacer los cálculos por ti:sudo losetup -o $((56*512)) /dev/loop0 sda.img
Enno Gröper el
1
Esto no solo es útil, es absolutamente increíble.
andho
¿Qué pasa si hay un .img1 y .img2? "win8.raw1 * 2048 718847 358400 7" y "win8.raw2 718848 52426751 25853952 7"
Enkouyami
66
Aún más simple: mount -o loop,offset=$((56 * 512)) sda.img /mnt. Fuente: madduck.net/blog/…
ostrokach
105

Actualización para Ubuntu 16.04: con la nueva, losetupahora es más fácil:

sudo losetup -Pf disk_image.raw

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


Una solución fácil es usar kpartx : determinará el diseño de la partición y asignará cada uno a un dispositivo de bloque. Después de eso, todo lo que tienes que hacer es montar el que quieras.

Abra la 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

Esto creado loop0p1y loop0p2bajo /dev/mapper. Desde el resultado puede ver los tamaños de las particiones que le ayudan a identificarlos. Puedes montar el que quieras con:

$ sudo mount /dev/mapper/loop0p2 /mnt

Alternativamente, Nautilus detecta el dispositivo de bloqueo 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
Joni
fuente
Excelente respuesta, rápida y fácil, evitar el paso de multiplicación es bueno
Elder Geek
sudo apt-get install kpartx- para acceder a kpartx. El kpartxenlace al comienzo de la publicación es una "trampa" en mi opinión. Los enlaces que implican la instalación de software son un no-no.
Hannu
1
@Hannu, los enlaces que se integran con Software Center son una práctica común en askubuntu , aunque en este caso particular se podría agregar el ícono típico y se debería actualizar la URL.
Joni
losetup -Pfhabía sido mencionado previamente por askubuntu.com/a/496576/52975 . Recomiendo que al menos se vincule a esa respuesta.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
Para su información, el losetup -Pf ..comando creará dispositivos como /dev/loopXpYese que aún necesita montar. Puede encontrarlo Xmirando la salida del losetupcomando. El Yes el número de partición.
Gunchars
26

Editar : funciona con util-linux> = 2.21 . En el momento de la escritura barcos ubuntu con la versión 2.20 sólo se

De hombre losetup :

       -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 su imagen de disco en el primer dispositivo de bucle no utilizado e imprimirlo en stdout. Si usa el /dev/loop0dispositivo, creará al menos /dev/loop0p1que podrá montar como de costumbre.

Ludovic Ronsin
fuente
2
¿Dónde encuentro esta versión de losetup? El que tengo en Ubuntu 14.04 tiene una página de manual de julio de 2003 (util-linux) y ninguna opción `-P` (o cualquier otra cosa) para escanear particiones.
Hannu
1
Lo siento, cometí un error, he estado usando esta opción en Arch Linux que viene con una versión más reciente del paquete util-linux. ¡Parece que Ubuntu está tristemente atascado en la versión 2.20.1 que se lanzó en enero de 2012! La --partscanopción se ha introducido en util-linux 2.21
Ludovic Ronsen
1
Bueno, gnome-diskstiene una opción para montar una imagen de disco y sus particiones. (<- eso es para instalación y uso de bash / Terminal, Disksen el tablero también lo encuentra).
Hannu
2
Esta debería ser la respuesta aceptada ...
matthid
@matthid ¿Es posible cambiar una respuesta aceptada? Esto es bueno (y la respuesta de kpartx en realidad depende de esta versión de losetup), pero es casi tres años más nueva que la respuesta aceptada, que era la forma de hacerlo en ese momento.
Auspex
9

Prueba gnome-disk-image-mounter:

gnome-disk-image-mounter sda.img

No se sudorequiere Se montará en /media/your_user_name/partition_name, al igual que las unidades USB.

Mihai Capotă
fuente
1
Estaba funcionando bien el 16.04. Acabo de instalar un nuevo 18.04 y las herramientas solicitan la contraseña de sudo para acceder al dispositivo virtual / dev / loopXX :(
Laurent
7

losetup -P automatización

losetup -Pes el mejor método que comienza en Ubuntu 16.04 como se menciona en https://askubuntu.com/a/496576/52975 , aquí hay funciones para automatizar si es 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"
)

módulo de bucle max_part config

Este es un método decente antes de 16.04.

loop es un módulo del núcleo, integrado en el núcleo en 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.

Es 0por defecto en Ubuntu 14.04, razón por la cual no ocurre la 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"

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

Cómo configurar un parámetro de módulo también se trata en: ¿Cómo agregar parámetros de módulo de kernel?

Después de reiniciar, cuando lo haces:

sudo losetup -f --show my.img

monta la imagen en un /dev/loopXdispositivo y monta automáticamente las particiones en los /dev/loopXpYdispositivos.

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

Ver también

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

Use losetup para adjuntar toda la imagen del disco.

# sudo losetup /dev/loop2 sda.img

Luego use mdadm para crear un dispositivo md y se crearán dispositivos de bloque para todas las particiones.

# sudo mdadm --build --level=0 --force --raid-devices=1 /dev/md2 /dev/loop2
mdadm: array /dev/md2 built and started.

Ahora debería ver los dispositivos de partición.

nile-172-b0fef38-76:/mnt/sdb1 # ls -l /dev/md2*
brw-rw---- 1 root disk   9, 2 Oct 10 12:37 /dev/md2
brw-rw---- 1 root disk 259, 0 Oct 10 12:37 /dev/md2p1
Mike Bappe
fuente
Ese es un truco divertido :)
Johan Boulé
4

La forma más simple, en mi opinión, es usar mount -o loop,offset=...como se menciona en esta respuesta en StackOverflow . La idea es la siguiente:

fdisk -l $IMAGE
# calculate the offset in bytes
mount -o loop,offset=$OFFSET $IMAGE $MOUNTPOINT

El método es mejor porque no requiere eliminar el dispositivo de bucle después de desmontar la partición montada.

Para simplificar aún más la tarea (que es necesaria si lo hace con frecuencia), puede usar mi script mountimgpara hacer todo por usted. Solo obténgalo de https://github.com/AlexanderAmelkin/mountimg y úselo así:

mountimg /media/external_media/sda.img 2 /media/sda_image

También puede especificar el tipo de sistema de archivos y cualquier otra opción de montaje adicional si lo desea:

mountimg /media/external_media/sda.img 2 /media/sda_image -t vfat -o codepage=866,iocharset=utf-8

Cuando haya terminado con la partición, simplemente umount:

umount /media/sda_image
Alexander Amelkin
fuente