Montare una singola partizione dall'immagine dell'intero disco (dispositivo)


117

Ho fatto un'immagine di tutto il mio disco con

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

Ora il problema è che vorrei montare un filesystem ext4 che era su quel disco ma

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

ovviamente dà un errore di superblocco poiché l'immagine contiene l'intero disco (MBR, altre partizioni) non solo la partizione di cui ho bisogno. Quindi suppongo che dovrei trovare un modo per far apparire l'immagine del disco nella /dev/cartella ...

Qualcuno sa come farlo?

PS: posso sempre ddripristinare l'immagine sul disco originale, ma sarebbe molto scomodo (ho aggiornato il sistema operativo e vorrei mantenerlo così com'è)

Risposte:


142

Ottieni il layout della partizione dell'immagine

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

Calcola l'offset dall'inizio dell'immagine all'inizio della partizione

Dimensione del settore * Inizio = (nel caso) 512 * 56 = 28672

Montalo su / dev / loop0 usando l'offset

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

Ora la partizione risiede su / dev / loop0 . Puoi fsck , montarlo ecc

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

Smonta

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

Grazie mille! Ha funzionato come un fascino! Mi hai reso felice (e hai salvato un'innocente Ocelot dall'essere brutalmente cancellata; P)
Nicola Feltrin,

8
Almeno su bash, la shell può persino fare i sudo losetup -o $((56*512)) /dev/loop0 sda.img
conti

1
Questo non è solo utile, è assolutamente fantastico.
andho,

E se ci sono .img1 e .img2? "win8.raw1 * 2048 718847 358400 7" e "win8.raw2 718848 52426751 25853952 7"
Enkouyami

6
Ancora più semplice: mount -o loop,offset=$((56 * 512)) sda.img /mnt. Fonte: madduck.net/blog/…
ostrokach,

105

Aggiornamento per Ubuntu 16.04: con il nuovo losetupora è più semplice:

sudo losetup -Pf disk_image.raw

Vedi il resto della risposta per le versioni precedenti di Ubuntu.


Una soluzione semplice sta usando kpartx : capirà il layout della partizione e mapperà ciascuno su un dispositivo a blocchi. Dopo di che tutto ciò che devi fare è montare quello che vuoi.

Apri Terminale, individua l'immagine del disco e inserisci questo 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

Questo creato loop0p1e loop0p2sotto /dev/mapper. Dall'output puoi vedere le dimensioni delle partizioni che ti aiutano a identificarle. Puoi montare quello che vuoi con:

$ sudo mount /dev/mapper/loop0p2 /mnt

In alternativa, il dispositivo a blocchi viene rilevato da Nautilus e puoi montarlo dalla barra laterale:

inserisci qui la descrizione dell'immagine

Al termine, smonta ciò che hai montato e rimuovi la mappatura del dispositivo:

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

Risposta eccellente, rapida e semplice, evitare il passaggio di moltiplicazione è bello
Elder Geek,

sudo apt-get install kpartx- per accedere a kpartx. Il kpartxlink all'inizio del post è una 'trappola' secondo me. I collegamenti che implicano l'installazione di software è un no-no.
Hannu,

1
@ Annu, i collegamenti che si integrano con Software Center sono una pratica comune su askubuntu , anche se in questo caso particolare è possibile aggiungere l'icona tipica e aggiornare l'URL.
Joni

losetup -Pfera stato precedentemente menzionato da askubuntu.com/a/496576/52975 ti consiglio di collegarti almeno a quella risposta.
Ciro Santilli 22 改造 中心 法轮功 六四 事件 il

1
Cordiali saluti, il losetup -Pf ..comando creerà dispositivi come quelli /dev/loopXpYche è ancora necessario montare. È possibile trovare il Xguardando l'output del losetupcomando. Il Yè il numero della partizione.
Gunchars,

26

Modifica : funziona con util-linux> = 2.21 . Al momento della scrittura navi Ubuntu con la versione 2.20 solo

Da man losetup :

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

Quindi corri e basta

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

per creare nodi di dispositivo per ogni partizione dell'immagine del disco sul primo dispositivo di loop inutilizzato e stamparlo su stdout. Se si utilizza il /dev/loop0dispositivo, si creerà almeno /dev/loop0p1che si sarà in grado di montare normalmente.


2
Dove trovo questa versione di losetup? Quello che ho in Ubuntu 14.04 ha una manpage di luglio 2003 (util-linux) e nessuna opzione `-P` (o qualsiasi altra cosa) per la scansione di partizioni.
Hannu,

1
Scusate, ho fatto un errore, sto usando questa opzione su Arch Linux che viene fornita con una versione più recente del pacchetto util-linux. Sembra che Ubuntu sia tristemente bloccato sulla versione 2.20.1 che è stata rilasciata a gennaio 2012! L' --partscanopzione è stata introdotta in util-linux 2.21
Ludovic Ronsin il

1
Bene, gnome-disksha un'opzione per montare un'immagine del disco ed è partizioni. (<- che è per l'installazione e l'uso di bash / Terminal, anche Disksnel trattino lo trova).
Hannu,

2
Questa dovrebbe essere la risposta accettata ...
matthid,

@matthid È anche possibile cambiare una risposta accettata? Questo è buono (e la risposta di kpartx dipende in realtà da questa versione di losetup), ma è quasi tre anni più recente della risposta accettata, che era il modo di farlo in quel momento.
Auspex,

9

Prova gnome-disk-image-mounter:

gnome-disk-image-mounter sda.img

Non sudorichiesto Verrà montato su /media/your_user_name/partition_name, proprio come le unità USB.


1
Funzionava bene il 16.04. Ho appena installato un nuovo 18.04 e gli strumenti richiedono la password sudo per accedere al dispositivo virtuale / dev / loopXX :(
Laurent

7

losetup -P automazione

losetup -Pè il metodo migliore che inizia in Ubuntu 16.04 come menzionato su https://askubuntu.com/a/496576/52975 , qui ci sono funzioni per automatizzare se ulteriormente. 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

Fonte:

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

modulo loop max_part config

Questo è un metodo decente prima del 16.04.

loop è un modulo del kernel, integrato nel kernel di Ubuntu 14.04.

Se lo configuri correttamente, Linux suddivide automaticamente i dispositivi per te.

cat /sys/module/loop/parameters/max_part

indica quante partizioni looppossono essere generate dai dispositivi.

È 0di default su Ubuntu 14.04 ed è per questo che non si verifica alcuna divisione automatica.

Per cambiarlo, possiamo aggiungere:

options loop max_part=31

a un file in /etc/modprobeoppure:

GRUB_CMDLINE_LINUX="loop.max_part=31"

a /etc/default/grube poi sudo update-grub.

Come impostare un parametro del modulo è anche trattato in: Come aggiungere i parametri del modulo del kernel?

Dopo un riavvio, quando lo fai:

sudo losetup -f --show my.img

monta l'immagine su un /dev/loopXdispositivo e monta automaticamente le partizioni sui /dev/loopXpYdispositivi.

Quindi questo è il metodo più conveniente se sei disposto a riavviare.

Guarda anche


5

Utilizzare losetup per allegare l'intera immagine del disco.

# sudo losetup /dev/loop2 sda.img

Quindi utilizzare mdadm per creare un dispositivo md e verranno creati i dispositivi a blocchi per tutte le partizioni.

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

Ora dovresti vedere i dispositivi di partizione.

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

È un trucco divertente :)
Johan Boulé il

4

Il modo più semplice, secondo me, sta usando mount -o loop,offset=...come indicato in questa risposta su StackOverflow . L'idea è la seguente:

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

Il metodo è migliore perché non richiede l'eliminazione del dispositivo loop dopo aver smontato la partizione montata.

Per semplificare ulteriormente l'attività (che è necessario se lo fai spesso), puoi usare il mio script mountimgper fare tutto per te. Scarica da https://github.com/AlexanderAmelkin/mountimg e usa in questo modo:

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

Puoi anche specificare il tipo di filesystem e qualsiasi altra opzione di mount se ti piace:

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

Quando hai finito con la partizione, semplicemente umount:

umount /media/sda_image
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.