Monta singola partizione dall'immagine dell'intero disco (dispositivo)

96

Ho creato un'immagine del mio intero disco con

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

Ora il problema è che mi piacerebbe installare un filesystem ext4 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 penso che dovrei trovare un modo per far apparire l'immagine del disco nella cartella /dev/ ...

Qualcuno sa come farlo?

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

    
posta Nicola Feltrin 19.10.2011 - 18:36

7 risposte

123

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 della immagine all'inizio della partizione

Dimensione 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
    
risposta data arrange 19.10.2011 - 21:55
87

Aggiornamento per Ubuntu 16.04: Con il nuovo losetup questo è ora 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 : sarà in grado di capire il layout della partizione e mappare ciascuno a un dispositivo a blocchi. Dopo tutto quello 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 ha creato loop0p1 e loop0p2 sotto /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:

Quando hai finito, smonta ciò che hai montato e rimuovi la mappatura del dispositivo:

$ sudo umount /mnt
$ sudo kpartx -d disk_image.raw
    
risposta data Joni 02.10.2013 - 14:12
21

Modifica : funziona con util-linux & gt; = 2.21 . Al momento di scrivere ubuntu viene fornito con la versione 2,20 solo

Da man losetup :

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

Quindi esegui

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

per creare i nodi del dispositivo per ogni partizione dell'immagine del disco sul primo dispositivo loop inutilizzato e stamparlo su stdout. Se utilizzi il dispositivo /dev/loop0 , creerà almeno /dev/loop0p1 che potrai montare come al solito.

    
risposta data Ludovic Ronsin 11.07.2014 - 19:29
6

Prova gnome-disk-image-mounter :

gnome-disk-image-mounter sda.img

Nessuna sudo richiesta. Sarà montato a /media/your_user_name/partition_name , proprio come le unità USB.

    
risposta data Mihai Capotă 24.07.2015 - 00:02
5

losetup -P automation

losetup -P è il metodo migliore che inizia in Ubuntu 16.04 come citato al link , 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=""
  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"
  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 in Ubuntu 14.04.

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

cat /sys/module/loop/parameters/max_part

indica quante partizioni loop dispositivi possono generare.

È 0 di default su Ubuntu 14.04 che è il motivo per cui non avviene la divisione automatica.

Per cambiarlo, possiamo aggiungere:

options loop max_part=31

in un file in /etc/modprobe o:

GRUB_CMDLINE_LINUX="loop.max_part=31"

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

Come impostare un parametro del modulo è anche disponibile 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 dispositivo /dev/loopX e monta automaticamente le partizioni su /dev/loopXpY dispositivi.

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

Vedi anche

4

Usa losetup per allegare l'intera immagine del disco.

# sudo losetup /dev/loop2 sda.img

Quindi usa mdadm per creare un dispositivo md e verranno creati dispositivi di blocco 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
    
risposta data Mike Bappe 10.10.2014 - 14:45
2

Il modo più semplice, a mio avviso, è utilizzare mount -o loop,offset=... come menzionato 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 è il migliore perché non richiede la cancellazione del dispositivo loop dopo aver smontato la partizione montata.

Per semplificare ulteriormente l'attività (che è necessaria se lo fai spesso), puoi usare il mio script mountimg per fare tutto per te. Scaricalo dal link e usare 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 aggiuntiva, se lo desideri:

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 it:

umount /media/sda_image
    
risposta data Alexander Amelkin 11.11.2016 - 11:13

Leggi altre domande sui tag