Comment redimensionner un fichier image avant d'écrire sur la carte SD?

13

J'ai essayé de créer une nouvelle image Raspbian avec un noyau différent (avec support CAN) et avec Python 3.3 installé. Plutôt que de faire tout cela sur le Raspberry Pi, j'ai pensé qu'il serait intéressant de le faire sur l'ordinateur à la place (en suivant ces instructions ). Cependant, une fois l'image montée et prête à l'emploi, j'ai rapidement manqué d'espace disque. Je suppose que cela est dû au fait que l'image est dimensionnée pour être juste juste assez grande avec l'espoir que l'utilisateur redimensionnera le système de fichiers une fois qu'il aura été écrit sur une carte SD.

Est-il possible de redimensionner l'image et le système de fichiers avant de les écrire sur la carte SD afin que je puisse faire plus de personnalisation sans manquer d'espace?

DrAl
la source
Cette question vous aidera probablement.
Jivings
1
@Jivings: toutes ces réponses décrivent comment redimensionner l'image après l'avoir écrite sur la carte SD. Je sais comment faire ca; Je souhaite savoir comment redimensionner l'image avant de l' écrire sur la carte SD.
DrAl

Réponses:

7

Voici comment redimensionner un fichier image brut. Je sais que cela semble stupidement simpliste, mais cela fonctionnera.

Créez une image vierge, de la taille que vous souhaitez développer l'original (dans mon exemple, j'utilise 5 Go);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Ajoutez ceci à l'image originale:

cat /path/to/temp_image >> /path/to/rasperrypi.img

Redimensionnez le système de fichiers qui vit à la fin du disque (en général, c'est celui que vous souhaitez agrandir):

resize2fs -f /path/to/rasperrypi.img

Terminé! Votre disque devrait maintenant être plus gros de 5 Go!

Jivings
la source
Cela semble parfait, merci: je testerai ce soir.
DrAl
5
Je viens d'essayer ceci et quand j'arrive à l'étape resize2fs (après avoir ajouté 1 Go au fichier), j'obtiens "Mauvais numéro magique en super-bloc en essayant d'ouvrir 2012-12-16-wheezy-raspbian.img Can'tn ' t trouver un superbloc de système de fichiers valide. " Des suggestions sur ce que je fais mal?
DrAl
Il me semble que c'est un problème avec le fait que j'essaie de redimensionner l'image entière (l'équivalent de / dev / sda) au lieu de la partition (l'équivalent de / dev / sda2). Cependant, je peux me tromper et j'ai essayé quelques autres choses sans succès (comme redimensionner la partition avec fdisk, qui semble fonctionner mais ne m'aide pas à redimensionner le système de fichiers).
DrAl
3
D'accord, j'ai trouvé la réponse au dernier bit avec un peu de recherche: j'ai eu besoin de créer un périphérique de boucle pointant vers la partition dans l'image. J'ai fait cela en récupérant le secteur de démarrage de la deuxième partition fdisk -l file.img(c'était 122880), puis losetup --offset $((122880 * 512)) /dev/loop0 file.img. Je pourrais alors utiliser resize2fssur /dev/loop0et bien rangé avec losetup -d /dev/loop0. Si vous mettez à jour votre réponse pour l'inclure, je la marquerai comme la réponse acceptée. Merci de m'avoir indiqué dans la bonne direction.
DrAl
1
@DrAl Hé, j'ai essayé votre solution en utilisant resize2fson /dev/loop0mais j'ai une panique du noyau au démarrage disant que la taille du superbloc et la taille de la partition ne correspondent pas: The filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocksavez-vous rencontré quelque chose comme ça?
GuySoft
4

Ceci est une synthèse des réponses ci-dessus et ailleurs qui ont fonctionné pour moi - sauvegardez votre image en cas d'erreur:

Tout d'abord, agrandissez le fichier image (ici, nous ajoutons 1 Go à la fin):

truncate -s +1G ./image.img

Mappez ensuite l'image entière en tant que périphérique de boucle afin que nous puissions pousser la table de partition

sudo losetup /dev/loop0 ./image.img

Pour référence future, nous pouvons le vider:

sudo fdisk -l /dev/loop0

La sortie ressemble à:

Disk /dev/loop0: 2962 MB, 2962227200 bytes
255 heads, 63 sectors/track, 360 cylinders, total 5785600 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: 0x000c4661

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop0p2          122880     5785599     2831360   83  Linux

Nous allons maintenant refaire la dernière partition en la supprimant, puis en la recréant au même emplacement de départ, même type mais à un emplacement de fin différent. Notez donc la colonne "Démarrer" pour loop0p2 (partition 2 - la partition Linux) - nous l'utiliserons plus tard - son 122880 ici.

sudo fdisk /dev/loop0

Entrez ce qui suit - ils sont sûrs d'entrer - rien de permanent ne se produit jusqu'à ce que vous ayez lu mon explication qui suit:

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. appuyez simplement sur Entrée pour accepter la valeur par défaut
  9. p

Étape 1 - imprimer le tableau actuel. Étapes 2-3 - supprimer la partition 2, étapes 4-8 - recréer la partition 2 avec un nouveau point de fin (la valeur par défaut est la fin de l'image), Étape 9 - imprimer le nouveau tableau.

En supposant que votre table nouvellement imprimée est identique à la table d'origine, à l'exception de la valeur Fin et de la valeur Blocs (c'est-à-dire que la taille a changé), vous êtes prêt à valider.

Entrez wpour valider votre modification, puis entrez qpour quitter.

Vous pouvez supprimer ce périphérique de bouclage, nous en ferons un autre pour la deuxième partition. Rappelez-vous le décalage de départ que vous avez noté et utilisé ci-dessus - nous l'utiliserons à nouveau:

sudo losetup -d /dev/loop0     # delete the old loop setup
sudo losetup -o $((122880*512)) /dev/loop0 ./image.img

Cela créera un nouveau mappage en /dev/loop0pointant juste sur la partition 2 - pour la référence 512 est la taille de secteur que vous pouvez voir dans la première fdisksortie.

Redimensionnez maintenant la partition pour remplir l'espace disponible:

sudo e2fsck -f /dev/loop0
sudo resize2fs /dev/loop0

Terminé - maintenant nettoyer:

sudo losetup -d /dev/loop0
Greg
la source
merci ... les instructions ci-dessus n'ont pas fonctionné pour moi, mais cela a fonctionné. J'ai reçu un avertissement lors de l'écriture de la table de partition: `` `Commande (m pour l'aide): w La table de partition a été modifiée. Appel à ioctl () pour relire la table de partition. La relecture de la table de partition a échoué.: Argument invalide Le noyau utilise toujours l'ancienne table. La nouvelle table sera utilisée au prochain redémarrage ou après avoir exécuté partprobe (8) ou kpartx (8). `` Je viens de l'ignorer et c'était bien.
StFS
Excellent! Vous êtes le seul à avoir fait la bonne réponse! Merci.
yushulx
3

Pour ceux qui utilisent Oracle VM VirtualBox, c'est assez simple.

Sur une machine Windows, les choses se passent comme suit:

input.imgest ici l'image dont la taille doit être réduite et output.imgest l'image finale - dans cet exemple défini comme étant de 7000 Mo de large.

ECHO "========================================================================="
ECHO "input.img => output.img"

ECHO "========================================================================="

DEL  input.vdi

DEL  output.vdi

DEL  output.img

ECHO "========================================================================="
"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw input.img input.vdi -format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" createhd --filename output.vdi --size 7000 --format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd input.vdi output.vdi --existing

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd output.vdi output.img --format RAW

J'espère que ça aide un peu.

Markus
la source
Merci pour cette solution, très astucieuse. C'est le seul que j'ai pu trouver qui soit gratuit et fonctionne parfaitement sous Windows. J'ai eu des problèmes avec des cartes de 16 Go qui n'étaient pas tout à fait de la même taille et devaient redimensionner mon image.
Josh
J'ai une erreur de panique du noyau. Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX
Notez que cela tronque l'image - vous perdrez des données s'il y en a au-delà de la marque 7000MB - les commandes ne vous avertiront ni ne se plaindront.
Mike Redrobe
2

Voici comment redimensionner un fichier image brut. Je sais que cela semble stupidement simpliste, mais cela fonctionnera.

Créez une image vierge, de la taille que vous souhaitez développer l'original (dans mon exemple, j'utilise 5 Go);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Ajoutez ceci à l'image originale:

cat /path/to/temp_image >> /path/to/rpi.img

Ensuite, le redimensionnement de la partition et du système de fichiers. Tout d'abord, obtenez le décalage de la partition;

fdisk -l /path/to/rpi.img

Résultats dans un tableau comme celui-ci:

Device    Boot   Start      End   Sectors   Size  Id  Type
rpi.img1          8192   122879    114688    56M   c  W95 FAT32 (LBA)
rpi.img2       1122880  8447999   8325120     4G  83  Linux

Notez le décalage de démarrage de la deuxième partition

losetup --offset $((122880 * 512)) /dev/loop0 /path/to/rpi.img
e2fsck -f /dev/loop0
resize2fs -f /dev/loop0

Enfin démonter / dev / loop

losetup -d /dev/loop0

Terminé! Votre disque devrait maintenant être plus gros de 5 Go!

Jonas Stumph Stevnsvig
la source