J'ai créé une image de ma carte SD Raspberry Pi avec 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
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/loop0p1
et /dev/mapper/loop0p2
. Ensuite, ces partitions peuvent être montées directement:
Sudo mount -o rw -t ext4 /dev/mapper/loop0p2 mount_target/
Pour éviter d'avoir à créer des images distinctes pour chaque partition ou à installer un utilitaire tel que kpartx
name__, vous pouvez monter chaque partition individuellement en spécifiant un offset
dans la commande mount
name__.
Examinez d’abord les partitions dans le fichier image et déterminez le décalage à l’aide de fdisk
name__:
$ 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 secteur Start
de la partition que vous voulez et multipliez cette valeur par la taille Units
name__. Donc, si vous voulez la deuxième partition, vous aurez 540672 * 512 = 276824064
.
Maintenant, créez 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 la partition:
Sudo umount rpi_partition2/
rm -r rpi_partition2/
si votre objectif est d'explorer ou de modifier le contenu d'une partition (système de fichiers), cette ligne de commande monte 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 ]
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 dans un fichier normal, même lorsqu'il est attaché à un périphérique de bouclage. Vous devez donc identifier avec soin les décalages des partitions et les transmettre à la commande mount
.
Le moyen préférable serait de créer des images séparées 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'il s'agissait de partitions individuelles sur un disque et les monter comme vous le feriez normalement avec une partition de disque réelle en les mappant sur un périphérique en boucle . Un périphérique en boucle, ou périphérique de bouclage, est un périphérique virtuel qui fournit une couche de traduction permettant à Linux de traiter un fichier comme un périphérique en mode bloc (comme un disque ou une partition).
Les périphériques de boucle sont généralement /dev/loop0
à /dev/loop8
. Identifiez un périphérique de boucle inutilisé à l'aide de la commande losetup
:
$ 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 attribué. 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. Désormais, /dev/loop0
correspond, dans la plupart des cas, à /dev/sdf1
de votre carte SD, et vous pouvez le 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ésattribuez les périphériques en boucle:
Sudo umount /dev/loop0
Sudo losetup -d /dev/loop0