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.
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é.
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.
~$ 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.
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:
utilisez lsblk
pour voir quels périphériques sont disponibles et si leurs partitions sont montées
démontez toutes les partitions de l'appareil que vous souhaitez copier sur votre PC. Par exemple:
umount /dev/sdc1
umount /dev/sdc2
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
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 :
.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:
Remarquez maintenant quelques éléments:
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:
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:
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:
End
)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
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
resize2fs
peut également être utilisé pour redimensionner cela.
Sudo resize2fs -fp SD.img 4G
Il redimensionne également le fichier lui-même!