web-dev-qa-db-fra.com

Comment créer une image .IMG d'un disque (carte SD) sans inclure d'espace libre?

Sous Linux, nous pouvons faire

dd if=/dev/sdb of=bckup.img

mais si le disque est de 32 Go avec seulement 4 Go utilisés, le fichier image de 32 Go est une perte d'espace-temps. Existe-t-il un moyen ou un outil pour créer des images avec uniquement des données valides?

29
Necktwi

La meilleure chose à faire est

  1. Copiez tous les fichiers de toutes les partitions en préservant les métadonnées

    mkdir -p myimage/partition1

    mkdir myimage/partition2

    Sudo cp -Rrf --preserve=all /media/mount_point_partition1/* myimage/partition1/

    Sudo cp -Rrf --preserve=all /media/mount_point_partition2/* myimage/partition2/

  2. Extraire le MBR

    Sudo dd if=/dev/sdX of=myimage/mbr.img bs=446 count=1

    remplacer /dev/sdX avec l'appareil correspondant.

  3. Partitionnez le disque de destination en partitions de taille supérieure aux données copiées et doit être du même format et des mêmes indicateurs à l'aide de gparted. Google comment partitionner un disque.

  4. Montez le disque fraîchement formaté et partitionné. Sur la plupart des ordinateurs, il vous suffit de connecter le disque et vous pouvez trouver les partitions montées dans /media dossier.

  5. Copiez les données précédemment copiées dans les partitions de destination à l'aide des commandes suivantes

    Sudo cp -Rrf --preserve=all myimage/partition1/* /media/mount_point_partition1/Sudo cp -Rrf --preserve=all myimage/partition2/* /media/mount_point_partition2/

  6. Copiez le MBR

    Sudo dd if=myimage/mbr.img of=/dev/sdX bs=446 count=1

Maintenant, profitez de votre nouveau disque!

7
Necktwi

Un moyen assez bon et simple de gérer cela est simplement de le diriger via gzip, quelque chose comme ceci:

# dd if=/dev/sdb | gzip > backup.img.gz

De cette façon, votre image sera compressée et l'espace inutilisé sera probablement réduit à presque rien.

Vous utiliseriez ceci pour restaurer une telle image:

# cat backup.img.gz | gunzip | dd of=/dev/sdb

Une remarque: si vous avez eu beaucoup de fichiers qui ont été récemment supprimés, la taille de l'image peut être encore grande (la suppression du fichier ne met pas nécessairement à zéro les secteurs sous-jacents). Vous pouvez effacer l'espace libre en créant et en supprimant immédiatement un gros fichier contenant des zéros:

# cd /media/flashdrive
# dd if=/dev/zero of=bigfile bs=1M     # let it run and quit by disk full error
# rm bigfile
32
mvp

En utilisant les paramètres bs et count de dd, vous pouvez limiter la taille de l'image, comme indiqué à l'étape 2 de réponse 1665017 .

Vous savez peut-être déjà quelle taille d'image vous souhaitez créer. Sinon, vous pouvez obtenir une bonne idée de df:

df -H --total /

Remplacer / avec une liste séparée par des espaces de tous les points de montage relatifs aux partitions de disque.

Un moyen plus précis pourrait être d'utiliser fdisk ou votre éditeur de partition préféré et de vous occuper d'une calculatrice.

$ fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 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
Disklabel type: dos
Disk identifier: 0x00057540

Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1        2048  186367  184320   90M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      186368 3667967 3481600  1.7G  5 Extended
/dev/mmcblk0p5      188416 3667967 3479552  1.7G 83 Linux

Espace total utilisé en octets = secteur final de la dernière taille de secteur de la partition X (ici c'est 3667967 x 512).

Espace total utilisé en Go = espace total utilisé en octets/10243 (ici, c'est 1,749023 Go).

Si vous décidez, par exemple, que votre image doit faire exactement 2 Go, la commande suivante le fera:

dd if=/dev/mmcblk0 of=/path/to/pi_updated.img bs=1M count=2048

L'image résultante inclura également le bruit aléatoire au-delà de la plus grande étendue de la dernière partition.

N'oubliez pas de Sudo les commandes ci-dessus si votre compte ne dispose pas déjà de privilèges suffisants.

Pour mes besoins, je n'ai pas besoin d'une image parfaitement ramenée au dernier bit de données, donc lorsque la taille réelle est de 1,75 Go, une image de 2 Go est assez proche pour moi. Cela supprime les 6 autres Go (ou 30 Go ou tout ce que l'appareil a de rechange) d'espace inutilisé qui serait autrement dans l'image.

J'ai vu à de nombreux endroits que dd ne devrait pas être exécuté sur une partition montée et j'ai suivi cela parce que cela semble intuitivement correct; cela ressemble plutôt à essayer de vous esquisser en faisant une esquisse dans un miroir avec l'esquisse que vous rendez également visible dans l'esquisse. C'est un peu sommaire.

3
Crumeniferus

Si vous avez une grande carte SD de 16 Go, 32 Go, etc., mais que vous souhaitez économiser de l'espace avec la sauvegarde, vous pouvez utiliser:

Sudo apt-get install gnome-disk-utility

Ouvrez l'utilitaire de disque pour vérifier que la lettre de sorcière est bien celle de votre lecteur USB:

gnome-disks

Dans mon cas, une carte SD de 32 Go avec une image Raspbian sur elle reconnue comme:/dev/sde

Je cours donc avec /dev/sde:

Sudo dd bs=4M status=progress if=/dev/sde | gzip > \
/you-selected-full-path-here/raspberry-images/`date +%Y%m%d`_rpi_image_backup.gz
status=progress gives you progress bar indication
| gzip > compresses the 32 GB total size and not writing the empty space from the 32 GB
`date +%Y%m%d` writes today date in the filename

Sortie: 20190529_rpi_image_backup.gz

Et la taille n'est que de 3,5 Go. Si vous souhaitez écrire cette image sur une nouvelle carte SD, utilisez:

https://www.balena.io/etcher/

Vous pouvez également écrire cette image faite de 32 Go sur un disque de 16 Go ou 8 Go, il ne se plaint plus que l'image soit trop grande.

1
jturi