web-dev-qa-db-fra.com

"Redimensionnez" le .img pour une carte SD plus petite. Comment réduire une image de carte SD amorçable

Le contexte

J'ai une carte SD de 16 Go avec un système d'exploitation basé sur Linux pour un Raspberry Pi. La majeure partie de l'espace est vide.

Je souhaite partager la SD .img avec d'autres personnes mais si j'utilise la commande

dd if=/dev/sdXX of=/home/user123/SD.img

cela créera une image de 16 Go. Trop grand.

Question

Comment puis-je redimensionner une image de carte SD de 16 Go en un plus petit 4 Go?

J'ai essayé avec GParted: il crée une partition de 4 Go sans problème, cependant l'ensemble .img de la carte SD continue d'être de 16 Go avec 12 Go d'espace non alloué.

GParted table

J'ai lu la question et la réponse Clonage de plusieurs partitions dans Ubunt , mais je ne peux toujours pas redimensionner la carte SD de 16 Go en une carte de 4 Go.

Plus d'informations

~$ lsblk 
...

sdc      8:32   1  14,9G  0 disk 
├─sdc1   8:33   1   100M  0 part 
└─sdc2   8:34   1     4G  0 part 
~$ Sudo fdisk -l /dev/sdc
Disk /dev/sdc: 14,9 GiB, 15931539456 bytes, 31116288 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: 0xf8a631ce

Device     Boot  Start     End Sectors  Size Id Type
/dev/sdc1  *      2048  206847  204800  100M  c W95 FAT32 (LBA)
/dev/sdc2       206848 8595455 8388608    4G 83 Linux

Tout conseil est apprécié!

Veuillez noter : comme l'a observé Melebius dans n commentaire , le bon mot à utiliser est rétrécir:

Vous ne peut pas redimensionner une carte SD car il s'agit d'un matériel d'une capacité donnée qui ne peut pas être modifiée. Vous voulez clairement rétrécir une carte SD image.

6
Leos313

Cet article donne une solution qui résout mon problème. Il est assez similaire à l'autre, mais il explique mieux comment calculer et quelle signification ont les nombres et les partitions.

L'information clé était l'utilisation de la commande truncate. Suivre la solution complète afin de ne pas perdre la réponse.

Une étape préliminaire consiste à cloner la carte SD dans votre PC:

  1. utilisez lsblk pour voir quels périphériques sont disponibles et si leurs partitions sont montées

  2. démontez toutes les partitions de l'appareil que vous souhaitez copier sur votre PC. Par exemple:

    umount /dev/sdc1
    umount /dev/sdc2
    
  3. créer une copie de la carte sd entière avec toutes les partitions démontées

    dd if=/dev/sdc of=/path/to/file/myimage.img
    

Rétrécissement d'images sur Linux

Contexte du problème :

Avoir un myimage.img plus grand que le support matériel (s'il est plus petit, il ne devrait pas y avoir de problème; cependant, en utilisant la même stratégie, vous pouvez mieux adapter l'image dans le support matériel).

Le secret est d'utiliser des outils et instruments Linux standard: GParted, fdisk et truncate.

Exigences :

  • Un PC Linux
  • Le .img vous voulez réduire (myimage.img dans cet exemple)

Création d'un périphérique de bouclage :

GParted est une application généralement utilisée pour gérer les tables de partition et les systèmes de fichiers. Afin de rétrécir l'image, GParted va être utilisé le long de la première partie de la réponse.

GParted fonctionne sur les appareils, pas sur des fichiers simples comme des images. C'est pourquoi nous devons d'abord créer un appareil pour l'image. Nous le faisons en utilisant la fonctionnalité de bouclage de Linux.

Activons le bouclage:

Sudo modprobe loop

Demandons un nouveau périphérique de bouclage (gratuit):

Sudo losetup -f

La commande renvoie le chemin vers un périphérique de bouclage gratuit:

/dev/loop0

Créons un appareil de l'image:

Sudo losetup /dev/loop0 myimage.img

Le dispositif /dev/loop0 représente myimage.img. Nous voulons accéder aux partitions qui se trouvent sur l'image, nous devons donc demander au noyau de les charger aussi:

Sudo partprobe /dev/loop0

Cela devrait nous donner l'appareil /dev/loop0p1, qui représente la première partition dans myimage.img. Nous n'avons pas besoin de cet appareil directement, mais GParted en a besoin.

Redimensionner la partition en utilisant GParted :

Chargeons le nouvel appareil à l'aide de GParted:

Sudo gparted /dev/loop0

Lorsque l'application GParted s'ouvre, une fenêtre similaire à celle-ci doit apparaître:

screenshot

Remarquez maintenant quelques éléments:

  • Il y a une partition.
  • La partition alloue l'intégralité du disque/périphérique/image.
  • La partition est remplie en partie.

Nous voulons redimensionner cette partition afin qu'elle corresponde à son contenu, mais pas plus que cela.

Sélectionnez la partition et cliquez sur Redimensionner/Déplacer. Une fenêtre similaire à la suivante apparaîtra:

screenshot of dialog

Faites glisser la barre de droite vers la gauche autant que possible.

Notez que parfois GParted aura besoin de quelques Mo supplémentaires pour placer certaines données liées au système de fichiers. Pour ce faire, vous pouvez appuyer plusieurs fois sur la flèche vers le haut dans la zone Nouvelle taille. Par exemple, je l'ai appuyé 10 fois (= 10 Mo) pour que FAT32 fonctionne. Pour NTFS, vous pourriez ne pas avoir besoin du tout.

Enfin, appuyez sur Redimensionner/Déplacer. Vous reviendrez à la fenêtre GParted. Cette fois, il ressemblera à ceci:

unallocated space on right

Notez qu'une partie du disque n'est pas allouée. Cette partie du disque ne sera pas utilisée par la partition, nous pouvons donc raser cette partie de l'image plus tard. GParted est un outil pour les disques, donc il ne réduit pas les images, seulement les partitions, nous devons faire le rétrécissement de l'image nous-mêmes.

Presse Apply dans GParted. Il va maintenant déplacer des fichiers et enfin réduire la partition, ce qui peut prendre une minute ou deux, mais la plupart du temps, il se termine rapidement. Ensuite, fermez GParted.

Maintenant, nous n'avons plus besoin du périphérique de bouclage, alors déchargez-le:

Sudo losetup -d /dev/loop0

Rasage de l'image :

Maintenant que nous avons toutes les données importantes au début de l'image, il est temps de raser cette partie non allouée. Nous devrons d'abord savoir où se termine notre partition et où commence la partie non allouée. Nous faisons cela en utilisant fdisk:

fdisk -l myimage.img

Ici, nous verrons une sortie similaire à la suivante:

Disk myimage.img: 6144 MB, 6144000000 bytes, 12000000 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: 0x000ea37d

      Device Boot      Start         End      Blocks   Id  System
myimage.img1            2048     9181183     4589568    b  W95 FAT32

Notez deux choses dans la sortie:

  • La partition se termine sur le bloc 9181183 (affiché sous End)
  • La taille de bloc est de 512 octets (représentés par des secteurs de 1 * 512)

Nous utiliserons ces chiffres dans le reste de l'exemple. La taille de bloc (512) est souvent la même, mais le bloc de fin (9181183) sera différent pour vous. Les nombres signifient que la partition se termine sur l'octet 9181183 * 512 du fichier. Après cet octet vient la partie non allouée. Seuls les 9181183 * 512 premiers octets seront utiles pour notre image.

Ensuite, nous réduisons le fichier image à une taille qui peut simplement contenir la partition. Pour cela, nous utiliserons la commande truncate (merci uggla!). Avec la commande truncate, vous devez fournir la taille du fichier en octets. Le dernier bloc était 9181183 et les numéros de bloc commencent à 0. Cela signifie que nous avons besoin de (9181183 + 1) * 512 octets. C'est important, sinon la partition ne s'adaptera pas à l'image. Alors maintenant, nous utilisons tronquer avec les calculs:

truncate --size=$[(9181183+1)*512] myimage.img
3
Leos313

Vous pouvez utiliser les options bs et count dans la commande dd- pour limiter la taille du fichier de sortie.

Exemple:

dd if=sdx of=SD.img bs=1G count=4

donnerait un fichier de sortie d'une taille de 4 Gio.

Jetez un œil sur man dd.

Vous devez savoir combien d'octets vous devez copier pour que toutes les partitions soient entièrement couvertes, alors jetez un œil à Sudo fdisk -l /dev/sdx quel secteur est le dernier dont vous avez besoin.

Les partitions doivent être au début du disque (comme dans l'image que vous avez fournie).

Les disques avec msdos-partition-table peuvent être clonés facilement de cette façon, mais si le disque utilise GPT et doit être cloné sur un disque de taille différente, le MBR protecteur doit être adapté par la suite et la sauvegarde GPT qui réside au tout fin du disque doit être recréé, cela peut être fait avec gdisk.


À partir de votre sortie fdisk-, vous pouvez voir que le dernier secteur de la dernière partition est le secteur 8595455, cela signifie que vous devez copier au moins 8595455 + 1 secteurs (le premier secteur est 0). Avec une taille de secteur de 512 octets, cela équivaut à 4 400 873 472 octets. bs multiplié par count doit être supérieur ou égal à cela.

C'est peut-être encore trop gros pour une clé USB de 4 Go, vous pouvez toujours réduire la taille de sdc2, il y a beaucoup d'espace inutilisé dedans.

Pour l'exemple actuel que vous avez fourni,

 dd if=/dev/sdc of=SD.img bs=10M count=420

couvrira la table de partition, sdc1 et sdc2. Calculer:

10*1024*1024*420 = 4,404,019,200 > 4,400,873,472
2
mook765

resize2fs peut également être utilisé pour redimensionner cela.

Sudo resize2fs -fp SD.img 4G

Il redimensionne également le fichier lui-même!

0
user1040155