L'image SD ne tient pas sur la carte SD

13

J'ai eu un pi installé et fonctionnant bien pendant un certain temps (RPi - 1). Je voulais créer une image de RPi - 1 pour pouvoir charger une copie exacte sur mon 2e pi (RPi - 2). La carte SD dans RPi - 1 fait 4 Go (seulement environ la moitié est réellement utilisée) et la carte SD dans RPi - 2 fait également 4 Go. J'utilise Win32 Disk Imager pour créer une copie de RPi - 1 avec succès. J'ai ensuite formaté la carte SD pour RPi - 2 avec SD Formatter 4.0 (sous Windows 7). Cependant, lorsque j'utilise Win32 Disk Imager pour écrire l'image RPi - 1 sur la carte SD de RPi - 2, j'obtiens: "Pas assez d'espace sur le disque: Taille 7744512 Disponible: 7626752 secteurs Taille de secteur: 512"

Je sais que ce n'est pas une mauvaise image car je peux formater la carte SD pour RPi-1 et y réécrire l'image sans problème.

Qu'est-ce que j'oublie ici? Les cartes SD de 4 Go ne sont-elles pas toutes de la même taille ou varient-elles légèrement? Y a-t-il quelque chose que vous devez faire sur une toute nouvelle carte SD que j'ai manquée?

(RPi - 1 carte SD = Sandisk 4 Go // RPi - 2 carte SD = Kingston 4 Go)

Rob_IGS
la source
2
il n'y a PAS deux cartes SD de même taille, sauf si elles proviennent du même fabricant, de la même marque et du même lot de production. vous ne devez PAS utiliser l'image de la carte SD à des fins de sauvegarde, mais copiez les fichiers à la place.
lenik
Combien d'espace votre ordinateur indique-t-il sur la carte vide?
Beta Decay

Réponses:

6

En effet, toutes les cartes SD n'ont pas la même taille exacte. Vous devez réduire la partition pour l'adapter à la petite SD. J'ai moi-même eu un problème similaire. Ce que j'ai fait était d'avoir une SD séparée avec (dans mon cas) Raspbian. Et j'ai branché ma SD que je voulais redimensionner, en utilisant un lecteur de carte USB.

Avant de pouvoir réduire votre partition en toute sécurité, vous devez vous assurer qu'aucune donnée n'est présente à la fin de la suppression. Vous pouvez le faire avec resize2fs -M -p /dev/sda2(vous devez remplacer / dev / sda2 par le chemin correct vers le lecteur de carte USB et la partition linux que vous souhaitez redimensionner). Cela redimensionnera le système de fichiers à la plus petite taille possible. Vous pouvez en fait spécifier la taille exacte que vous voulez, mais cela implique un peu de calcul et de conversion des tailles en tailles de blocs et en secteurs, etc. Plus sûr et plus facile de ne pas le faire.

Après cela, vous pouvez réduire la partion. Je pense que je l'ai utilisé fdiskpour cela. Obtenez la position de départ exacte de la partition, supprimez-la et recréez-la en utilisant la même position de départ, mais avec une taille plus petite.

Enfin, vous devez à nouveau agrandir le système de fichiers pour occuper toute la partition en utilisant resize2fs -p /dev/sda2

Gerben
la source
Je veux juste clarifier un peu cette réponse car je l'ai trouvée un peu difficile à suivre. J'ai d'abord démonté les partitions sur la carte SD. Ensuite, j'ai dû exécuter e2fsck -f /dev/mmcblk0p2(je réduis la deuxième partition de mmcblk0) pour vérifier la cohérence. Ensuite, j'ai été autorisé à courir resize2fs -M -p /dev/mmcblk0p2comme suggéré.
audiFanatic
1

Vous feriez mieux de créer une archive tar du système de fichiers, car lorsque vous créez une image disque complète, vous copiez également les données supprimées. Lorsque vous supprimez un fichier, l'inode n'est pas lié mais les données réelles sont toujours sur le disque. Une image de disque complète utilisant ddcopierait ces anciennes données (sauf si vous les écrasez d'abord avec /dev/zero, ce qui prend un certain temps) mais une sauvegarde utilisant tarne copierait que les données actuelles.

Ou ... vous pouvez faire comme le font de nombreuses distributions: réduire la taille de votre système de fichiers à quelque chose de sûr comme 1,9 Gio avant de créer votre image, et redimensionner pour remplir le disque après avoir restauré la sauvegarde.

Attention: je ne suis pas familier avec les outils d'imagerie Windows, je suis un utilisateur Linux.

Amédée Van Gasse
la source
1

si vous utilisez linux, voici un petit script:

#!/bin/bash
# Automatic Image file resizer
# Written by SirLagz
strImgFile=$1

export PATH=$PATH:/sbin

if [[ ! $(whoami) =~ "root" ]]; then
echo ""
echo "**********************************"
echo "*** This should be run as root ***"
echo "**********************************"
echo ""
exit
fi

if [[ -z $1 ]]; then
echo "Usage: ./autosizer.sh <Image File>"
exit
fi

if [[ ! -e $1 || ! $(file $1) =~ "x86" ]]; then
echo "Error : Not an image file, or file doesn't exist"
exit
fi

partinfo=`parted -ms $1 unit B p | awk '{if (NR!=2) {print}}'`  
fileSystemType=`echo "$partinfo" | grep -o 'ext4\|ext3'`
numberOfMatchPart=`echo "$fileSystemType" | wc -l`

if [[ $fileSystemType == "" || $numberOfMatchPart -eq 0 || $numberOfMatchPart -gt 1 ]] ; then
echo "Error : Your partition layout is not currently supported by this tool."
exit
fi

partnumber=`echo "$partinfo" | grep $fileSystemType | awk -F: ' { print $1 } '`
partstart=`echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2)) } '`
loopback=`losetup -f --show -o $partstart $1`

e2fsck -f $loopback

minsize=`resize2fs -P $loopback | awk -F': ' ' { print $2 } '`
minsize=`echo $minsize+200000 | bc`

resize2fs -p $loopback $minsize
sleep 1
losetup -d $loopback

partnewsize=`echo "$minsize * 4096" | bc`
newpartend=`echo "$partstart + $partnewsize" | bc`

parted $1 rm $partnumber
parted $1 unit B mkpart primary $partstart $newpartend
endresult=`parted -m $1 unit B print free | tail -1 | awk -F: ' { print substr($2,0,length($2)) } '`
truncate -s $endresult $1

crédit: Sirlagz ( soooo désolé!)

Gilles Grandguillaume
la source
4
seriez-vous si gentil d'expliquer ce que ce script est censé faire? comment puis-je spécifier la taille d'image requise, par télépathie?
lenik
le script réduit une img, prend la taille utilisée, ajoute 200000 à la fin (pour log etc), après un boot avec cette img il faut agrandir pour adapter la taille de la nouvelle carte SD ...
Gilles Grandguillaume
Salut, j'ai écrit ce script alors n'hésitez pas à me poser des questions sur mon blog: sirlagz.net - Ce script doit être exécuté sur Linux. Le script réduira l'image à la taille minimale possible, plus un peu d'espace libre. Cela vous permet de mettre une image de 8 Go (dont seulement 1 Go est utilisé) sur une carte de 1 Go.
Lawrence
il doit utiliser "partstart = echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2) - 1) } '" pour se débarrasser de B dans partstart.
netawater
@netawater j'ai un résultat différent pour cette commande avec kubuntu / debian: sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/… ... j'utilise ce script sans "-1" avec succès ! Je ne comprends pas.
Gilles Grandguillaume