Comment monter une image de carte SD créée avec dd?

21

J'ai créé une image de ma carte SD Raspberry Pi en utilisant dd:

sudo dd if=/dev/sdf of=/home/myusername/raspberry-backup-2014-04-10.img

La carte SD comprend deux partitions (une vfat, une ext4) qui sont automatiquement montées lorsque je branche la carte.

Ma question: comment puis-je monter ces partitions à partir du fichier .img?


Plus de détails:

$ fdisk -l raspberry-backup-2014-04-10.img 

Disk raspberry-backup-2014-04-10.img: 3974 MB, 3974103040 bytes
255 heads, 63 sectors/track, 483 cylinders, total 7761920 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000981cb

                          Device Boot      Start         End      Blocks   Id  System
raspberry-backup-2014-04-10.img1            8192      122879       57344    c  W95 FAT32 (LBA)
raspberry-backup-2014-04-10.img2          122880     7761919     3819520   83  Linux
MrD
la source
Vous souhaitez monter l'image sans l'écrire sur une carte SD?
OrangeTux
Oui, je veux avoir un accès complet au système de fichiers stocké dans le fichier .img afin de pouvoir copier / modifier / supprimer / etc. des fichiers sans carte SD
MrD
Peut - être que cette question vous aide.
OrangeTux
Malheureusement, cela ne fonctionne pas, a essayé les deux tentatives. Le premier n'a pas créé le périphérique / dev / loop0p1. Le second (j'ai calculé le point de départ en conséquence) wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other errorpose un problème
MrD
En outre, sudo fdisk -l /dev/loop0affirme: Disk / dev / loop0 ne contient pas de table de partition valide.
MrD

Réponses:

33

Pour éviter d'avoir à créer des images distinctes pour chaque partition ou à installer un utilitaire comme kpartx, vous pouvez monter chaque partition individuellement en spécifiant un offsetdans la mountcommande.

Examinez d'abord les partitions du fichier image et déterminez le décalage en utilisant fdisk:

$ fdisk -u -l rpi_image280914 

Disk rpi_image280914: 16.0 GB, 16012804096 bytes
255 heads, 63 sectors/track, 1946 cylinders, total 31275008 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000cdac7

           Device Boot      Start         End      Blocks   Id  System
rpi_image280914p1   *        2048      514047      256000    c  W95 FAT32 (LBA)
rpi_image280914p2          540672    31242239    15350784   83  Linux

Prenez le Startsecteur de la partition que vous voulez et multipliez cette valeur par la Unitstaille. Donc, si vous voulez la deuxième partition, vous obtiendrez 540672 * 512 = 276824064.

Créez maintenant un dossier et montez la partition:

mkdir rpi_partition2
sudo mount -o loop,offset=276824064 rpi_image280914 rpi_partition2/

Une fois que vous avez fini de faire ce que vous voulez avec les données de partition:

sudo umount rpi_partition2/
rm -r rpi_partition2/
Fourrage
la source
17

Après quelques tests supplémentaires, j'ai trouvé la solution moi-même: kpartx

sudo kpartx -a raspberry-backup-2014-04-10.img

Cette commande a créé /dev/mapper/loop0p1et /dev/mapper/loop0p2. Ensuite, ces partitions peuvent être montées directement:

sudo mount -o rw -t ext4 /dev/mapper/loop0p2 mount_target/
MrD
la source
1

si votre objectif est d'explorer ou de modifier le contenu d'une partition (système de fichiers), cette ligne de commande montera le système de fichiers du vidage de la carte sd my_sdcard_dump.img dans le répertoire mount_dir .

part_id=2; INFILE=my_sdcard_dump.img; MOUNTPT=mount_dir PARTITION=${part_id}; sudo mount "$INFILE" "$MOUNTPT" -o loop,offset=$[ `/sbin/sfdisk -d "$INFILE" | grep "start=" | head -n $PARTITION | tail -n1 | sed 's/.*start=[ ]*//' | sed 's/,.*//'` * 512 ]
davlar
la source
0

Traiter une image d'un disque entier avec plusieurs partitions est assez délicat . Linux n'a pas été conçu pour lire une table de partition à partir d'un fichier normal, même lorsqu'il est attaché à un périphérique de bouclage, vous devez donc identifier soigneusement les décalages des partitions et les transmettre à la mountcommande.

Le moyen préférable serait de créer des images distinctes de chaque partition:

sudo dd if=/dev/sdf1 of=/home/myusername/raspberry-backup-sdf1-2014-04-10.img
sudo dd if=/dev/sdf2 of=/home/myusername/raspberry-backup-sdf2-2014-04-10.img

Maintenant, vous pouvez facilement traiter ces fichiers comme s'ils étaient des partitions individuelles sur un disque, en les montant comme vous le feriez normalement avec une vraie partition de disque, en les mappant sur un périphérique en boucle . Un périphérique en boucle, ou périphérique en boucle, est un périphérique virtuel qui fournit une couche de traduction pour Linux pour traiter un fichier comme un périphérique bloc (comme un disque ou une partition).

Les périphériques de boucle sont généralement /dev/loop0traversés /dev/loop8. Identifiez un périphérique de boucle inutilisé avec la losetupcommande:

$ sudo losetup /dev/loop0
loop: can't get info on device /dev/loop0: No such device or address

Cette réponse indique un périphérique de boucle non affecté. Nous pouvons maintenant affecter le périphérique de boucle à l'un de nos fichiers image:

$ sudo losetup /dev/loop0 /home/myusername/raspberry-backup-sdf1-2014-04-10.img

L'absence de sortie de cette commande indique le succès. Maintenant, /dev/loop0pour la plupart des usages, il est fonctionnellement équivalent à /dev/sdf1votre carte SD, et vous pouvez la monter comme vous le feriez normalement:

sudo mount -t vfat /dev/loop0 /media/sdimage-1

Répétez le processus en utilisant un autre périphérique de boucle pour monter l'autre partition. Lorsque vous avez terminé, démontez les systèmes de fichiers et désaffectez les périphériques de boucle:

sudo umount /dev/loop0
sudo losetup -d /dev/loop0
tgies
la source
Je voudrais éviter de créer deux fichiers image, car - entre autres raisons mineures - je voudrais distribuer l'image à d'autres personnes afin qu'elles puissent l'utiliser pour initialiser leurs cartes SD avec. Par conséquent, les différentes partitions comme / boot etc. doivent être dans un seul fichier.
MrD