Puis-je utiliser dd pour cloner une carte SD plus grande sur une carte SD plus petite si les partitions réelles conviennent?

9

J'ai une carte SD de 16 Go qui a quelques partitions (c'est en fait la carte pour un Raspberry Pi). J'ai plusieurs autres cartes de 4 Go sur lesquelles je veux cloner la carte principale. Les 3 partitions sur la carte principale sont:

  • Partition de démarrage Rasp, FAT, 60 Mo
  • Partition Linux, ext2, 1 Go
  • Partition de stockage supplémentaire, FAT, 1 Go

Si j'utilise ddpour créer une image de la carte via:

dd if=/dev/sdb of=~/sd-card.bin

puis le .bin résultant est de 16 Go. Existe-t-il un moyen d'utiliser ddpour copier exactement ce qui est réellement utilisé, c'est-à-dire <4 Go pour que je puisse ensuite le faire ddsur une nouvelle carte de 4 Go? Ou existe-t-il une meilleure solution que je devrais utiliser?

Charlie Schliesser
la source
J'ai fini par créer le contenu exact sur une nouvelle carte de 4 Go et le cloner avec ddune quantité d'autres cartes. J'aimerais quand même savoir s'il est possible de résoudre le problème initial.

Réponses:

9

Je suppose que vous utilisez un ordinateur PC Linux ou Mac pour effectuer la copie, pas le Raspberry Pi lui-même. Vous devrez probablement ajouter une taille de bloc.

J'ai vu un et quatre mégaoctets utilisés pour les disques Raspberry pi en spécifiant bs = 1M ou bs = 4M. Je pense que la taille des blocs est plus importante lors de l'écriture du disque car les gros transferts sont plus rapides que les plus petits. Cela ne définit pas la taille du bloc pour le disque, cela affecte seulement la taille des transferts utilisés par dd. L'une des raisons pour définir une taille de bloc importante est la nécessité d'effacer le flash avant de l'écrire. Cela se fait automatiquement mais plus rapidement pour les transferts supérieurs à la taille d'effacement minimale.

Vous pouvez limiter la quantité totale de données copiées par dd à l'aide de "count". "count" est en unités de blocs. Si la fin de la dernière partition sur le disque source est antérieure à la taille de la destination, vous pouvez faire ce que vous voulez.

Quelque chose comme dd if=/dev/sdb of=~/sd-card.bin bs=1M count=4000va créer une image de 4000 Mo.

Voir http://en.wikipedia.org/wiki/Dd_(Unix) et http://elinux.org/RPi_Easy_SD_Card_Setup pour plus d'informations. Vous ne savez pas comment trouver la fin de la dernière partition ou la taille totale des cartes. Cependant, si vous avez formaté les disques, vous saurez probablement comment procéder.

William J Bagshaw
la source
Merci pour l'info. Je n'étais pas au courant de l'option de comptage. Je vais essayer.
@charlie ce serait fascinant si vous pouvez l'essayer avec et sans l'option de comptage et faire rapport. assurez-vous cependant de vérifier comment la taille du disque est signalée et si vous pouvez y ajouter des fichiers et que la taille change. 'cos quand dd échoue lié à des disques de tailles différentes, vous obtenez ce genre de problèmes. Voici un exemple où j'ai foiré avec dd avec deux disques de tailles différentes. superuser.com/questions/538583/difficulty-resizing-a-partition Finalement je n'ai pas utilisé dd pour faire le clone.
barlop
3

En développant la réponse de William , on pourrait calculer la fin de la dernière partition en utilisant fdisket 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 / 1024 3 (ici, c'est 1,749023 Go).

Habituellement, il n'est pas essentiel de créer une image qui soit ramenée jusqu'au dernier bit de données utile, donc dans l'exemple ci-dessus, je créerais une image de 2 Go en utilisant la méthode décrite par William dans cette même réponse précédente :

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

À la fin de l'image se trouvera une petite partie du guff inutile après vos dernières données utiles, mais ce n'est pas différent en principe du guff inutile qui sera écrasé lorsque vous réécrirez l'image sur votre support.

Cette méthode a fonctionné pour moi sur une dizaine de clones. S'il y a des défauts fatals dans cette méthode, ils n'ont pas encore fait surface.

Crumeniferus
la source