web-dev-qa-db-fra.com

Monter une seule partition à partir de l'image du disque entier (périphérique)

J'ai fait une image de mon disque entier avec

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

Maintenant, le problème est que je voudrais monter un système de fichiers ext4 qui était sur ce disque, mais

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

donne évidemment une erreur de superbloc puisque l'image contient le disque entier (MBR, autres partitions) et pas seulement la partition dont j'ai besoin. Je suppose donc que je devrais trouver un moyen de faire apparaître l’image disque dans le dossier /dev/ ...

Est-ce que quelqu'un sait comment faire ça?

PS: Je peux toujours dd sauvegarder l’image sur le disque d’origine, mais ce serait très pratique (j’ai mis à jour le système d’exploitation et j’aimerais le conserver tel quel)

110
Nicola Feltrin

Obtenir la disposition de la partition de l'image

$ 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 le décalage du début de l'image au début de la partition

Taille du secteur * Début = (dans le cas) 512 * 56 = 28672

montez le sur/dev/loop0 en utilisant l'offset

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

Maintenant, la partition réside sur /dev/loop0 . Vous pouvez fsck , montez-le, etc.

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

Démonter

Sudo umount /mnt
Sudo losetup -d /dev/loop0
137
arrange

Mise à jour pour Ubuntu 16.04: Avec le nouveau losetup ceci est maintenant plus facile:

Sudo losetup -Pf disk_image.raw

Voir le reste de la réponse pour les anciennes versions d'Ubuntu.


Une solution simple consiste à utiliser kpartx : il va déterminer la disposition des partitions et les mapper sur des périphériques en mode bloc. Après cela, tout ce que vous avez à faire est de monter celui que vous voulez.

Ouvrez Terminal, localisez l’image disque et entrez la commande suivante:

$ 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

Ceci a créé loop0p1 et loop0p2 sous /dev/mapper. Dans la sortie, vous pouvez voir la taille des partitions, ce qui vous aide à les identifier. Vous pouvez monter celui que vous voulez avec:

$ Sudo mount /dev/mapper/loop0p2 /mnt

Sinon, le périphérique de blocage est détecté par Nautilus et vous pouvez le monter à partir de la barre latérale:

enter image description here

Lorsque vous avez terminé, démontez ce que vous avez monté et supprimez le mappage de périphérique:

$ Sudo umount /mnt
$ Sudo kpartx -d disk_image.raw
102
Joni

Edit: fonctionne avec util-linux> = 2.21 . Au moment de la rédaction, ubuntu est livré avec la version 2.20 uniquement.

De man losetup :

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

Donc juste courir

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

créer des nœuds de périphérique pour chaque partition de votre image disque sur le premier périphérique de boucle inutilisé et l’imprimer sur la sortie standard. Si vous utilisez /dev/loop0 device, il créera au moins /dev/loop0p1 que vous pourrez monter comme d’habitude.

24
Ludovic Ronsin

Essayez gnome-disk-image-mounter:

gnome-disk-image-mounter sda.img

Non Sudo requis. Il sera monté à /media/your_user_name/partition_name, tout comme les clés USB.

9
Mihai Capotă

losetup -P automation

losetup -P est la meilleure méthode à partir d’Ubuntu 16.04, comme indiqué à l’adresse https://askubuntu.com/a/496576/52975 , voici des fonctions à automatiser ultérieurement. Usage:

$ 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

La source:

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

module de boucle max_part config

Ceci est une méthode décente avant 16.04.

loopest un module de noyau, intégré au noyau dans Ubuntu 14.04.

Si vous le configurez correctement, Linux divise automatiquement les périphériques pour vous.

cat /sys/module/loop/parameters/max_part

indique le nombre de partitions que looppeuvent générer.

Il s'agit de 0 par défaut sur Ubuntu 14.04, raison pour laquelle aucune division automatique n'a lieu.

Pour le changer, on peut soit ajouter:

options loop max_part=31

dans un fichier dans /etc/modprobe, ou:

GRUB_CMDLINE_LINUX="loop.max_part=31"

à /etc/default/grub puis à Sudo update-grub.

Comment définir un paramètre de module est également couvert à: Comment ajouter des paramètres de module au noyau?

Après un redémarrage, quand vous faites:

Sudo losetup -f --show my.img

il monte l'image sur un périphérique /dev/loopX et monte automatiquement les partitions sur des périphériques /dev/loopXpY.

C'est donc la méthode la plus pratique si vous souhaitez redémarrer.

Voir aussi

Utilisez losetup pour attacher l’image entière du disque.

# Sudo losetup /dev/loop2 sda.img

Ensuite, utilisez mdadm pour créer un périphérique md et des périphériques de blocage seront créés pour toutes les partitions.

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

Vous devriez maintenant voir les périphériques de partition.

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
5
Mike Bappe

La manière la plus simple, à mon avis, utilise mount -o loop,offset=... comme mentionné dans cette réponse sur StackOverflow . L'idée est la suivante:

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

Cette méthode est préférable car elle ne nécessite pas la suppression du périphérique de boucle après le démontage de la partition montée.

Pour simplifier davantage la tâche (ce qui est nécessaire si vous le faites souvent), vous pouvez utiliser mon script mountimgpour tout faire à votre place. Il suffit de l’obtenir de https://github.com/AlexanderAmelkin/mountimg et l’utiliser comme ceci:

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

Vous pouvez également spécifier le type de système de fichiers et toute autre option de montage supplémentaire si vous le souhaitez:

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

Lorsque vous avez terminé avec la partition, il suffit simplement de umountit:

umount /media/sda_image
2
Alexander Amelkin