Est-il possible de copier une installation Raspbian existante et configurée sur une carte SD plus petite?
Lorsque j'ai installé Raspbian pour la première fois, je n'avais qu'une carte de 32 Go à portée de main, ce qui est évidemment plus gros que nécessaire.
Réponses:
Dans cette réponse, je montre ce qu'il faut faire étape par étape pour que les gens comprennent la logique derrière la solution et soient capables d'appliquer des étapes à leurs autres problèmes.
Mais tout d'abord, il convient de préciser qu'il s'agit d'un problème générique (non spécifique à Raspi) de migrer les systèmes de fichiers d'une carte SD vers une carte SD plus petite (mais suffisamment grande pour les données).
Exigences
Un ordinateur portable avec un lecteur de carte micro SD et Linux (je préfère Ubuntu) fonctionnant dessus.
Abréviations
Partitions de SD_CARD_A
Pendant que PIBOX fonctionne, nous listons les partitions (les partitions système inutiles ne sont pas affichées ici).
Il y a 2 partitions sur SD_CARD_A comme
/
et/boot
. Même 2 Go ne sont pas utilisés au total.Sauvegarde SD_CARD_A
Après avoir arrêté et arrêté PIBOX, nous retirons SD_CARD_A de la carte PIBOX et le mettons dans le lecteur de carte de notre ordinateur portable.
Les partitions de SD_CARD_A sont automatiquement montées sur notre système au fur
/dev/sdc1
et à mesure/dev/sdc2
.Nous démontons ces partitions de notre système pour qu'elles fonctionnent correctement.
Nous affichons les informations sur l'appareil de SD_CARD_A en détail pour les confirmations dans les prochaines étapes.
Ci-dessus, vous pouvez voir que SD_CARD_A a une capacité de 8 Go.
Nous clonons SD_CARD_A dans le fichier pibox.img.
Vérifiez la taille des octets copiés, elle est égale à la valeur que nous avons obtenue par
fdisk -l /dev/sdc
commande.Module de bouclage Linux
Linux a un module appelé loopback qui nous permet de gérer un fichier comme un périphérique bloc.
Nous chargeons le module de bouclage.
Nous trouvons un chemin de périphérique de bouclage inutilisé.
Maintenant, nous créons un périphérique de bouclage pour le fichier pibox.img.
Nous déclenchons le noyau sur les changements de partition.
Nous confirmons si les opérations précédentes ont réussi.
Nous affichons les informations du périphérique de bouclage en détail pour le comparer avec SD_CARD_A.
Ci-dessus, vous pouvez voir que la taille du périphérique de bouclage (= 7969177600 octets) et les partitions sont identiques à celles de SD_CARD_A.
Mathématiques de base
Désormais, nous nous concentrerons sur la partition
/dev/loop0p2
. Appelons-le THE_PARTITION .La taille du bloc est de 512 octets (comme imprimé sur la ligne commençant par Unités = secteurs .....)
THE_PARTITION commence à partir du bloc 137216 et se termine au bloc 15564799 ce qui signifie qu'il a la taille de
15427584 blocks
(= 15564799 - 137216 + 1).Ainsi, la taille de THE_PARTITION en octets est
7898923008 bytes
(= 512 * 15427584).Pour adapter THE_PARTITION dans SD_CARD_B, nous voulons qu'il ait une nouvelle taille
3710940 blocks
ou en d'autres termes1900001280 bytes
(= 512 * 3710940).Ainsi, le nouveau numéro de bloc de fin est
3848155
calculé parstart block number
(= 137216) +size in blocks
(= 3710940) -1
.Système de fichiers vs partition
Il y a 2 opérations qui ne doivent pas être confondues.
3710940 blocks
.3848155
.Rétrécissement du système de fichiers
Avant de réduire le système de fichiers, il doit être marqué comme propre par
e2fsck
.Nous réduisons le système de fichiers avec
resize2fs
.Rétrécissement de la partition
Nous apprenons avec quel numéro THE_PARTITION
parted
.Nous réduisons THE_PARTITION avec
parted
.Nous avons terminé avec le périphérique de bouclage. On le détache.
Fichier d'image tronquée
Nous vérifions la nouvelle table de partition.
Dans la sortie, on voit clairement que le nombre de bloc de fin de THE_PARTITION est diminué
from 15564799 to 3848155
.Le dernier bloc que nous utilisons est
3848155
. La numérotation des blocs commence à 0. Nous avons donc 3848155 + 1 blocs au total et la nouvelle taille du fichier pibox.img devrait être1970255872 bytes
(= (3848155 + 1) * 512).Nous tronquons le fichier pibox.img.
Nous vérifions la nouvelle taille du fichier pibox.img.
Création de SD_CARD_B
Nous avons mis SD_CARD_B dans le lecteur de carte de notre ordinateur portable. Les partitions de SD_CARD_B sont automatiquement montées sur notre système au fur
/dev/sdc1
et à mesure/dev/sdc2
.Ci-dessus, vous pouvez voir que SD_CARD_B a une capacité de 2 Go.
Nous démontons ces partitions de notre système pour fonctionner avec succès sur SD_CARD_B.
Nous clonons le fichier pibox.img dans SD_CARD_B.
Vérifiez la taille des octets copiés, elle est égale à la valeur que nous avons obtenue par
ls -l pibox.img
commande.Démarrage de PIBOX
Après avoir retiré SD_CARD_B de notre ordinateur portable et l'avoir placé dans la carte PIBOX, nous démarrons le système et nous connectons à la console PIBOX.
Nous listons les partitions (certaines autres partitions système inutiles ne sont pas affichées ici).
la source
losetup
ou même-o loop=whatever
. Selon l'autre article que j'utilisemount -o offset=123 /imagefilepath /mntpoint
et l'utilisation du bouclage est implicite. Je suppose que c'est généralement vrai sur Linux maintenant - essayez de voir. Vous pouvez ensuite réduire cela à simplement dire que les partitions sont montées via un "périphérique de bouclage" virtuel.Lorsque vous l'utilisez
dd if=/dev/sdx of=/path/to/image bs=1M
, se/dev/sdx
réfère à l'ensemble du "disque", donc l'image aurait toujours la taille de la carte entière.Au lieu de cela, vous devez utiliser l'
dd if=/dev/sdxn ...
emplacementn
du numéro de partition.Vous devrez probablement le faire deux fois - une fois pour la
/boot
partition et une fois pour la/
partition.Ensuite, vous devez créer des partitions sur la nouvelle carte qui sont au moins aussi grandes que ces deux originales, pour réenregistrer le contenu.
la source
Utilisez quelque chose comme parted (éditeur de partition) pour réduire la partition principale à une taille plus petite, puis utilisez un outil comme Clonezilla pour copier de la partition désormais plus petite vers votre nouvelle carte. Cependant, vous devrez probablement le faire sur un autre ordinateur.
la source
dd if=/dev/sdx of=/path/to/image bs=1M
de ce fil: raspberrypi.stackexchange.com/questions/311/…Créer une image de la carte en utilisant l'une des méthodes déjà mentionnées - Comment sauvegarder mon Raspberry Pi?
Utilisez le script à http://sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/ pour réduire l'image
Restaurer l'image réduite sur une nouvelle carte plus petite
la source
script.sh
, rendez le fichier exécutable à l'aidechmod
et exécutez-le.J'utilise
rsync
pour copier des systèmes de fichiers d'un disque à un autre depuis un certain temps maintenant, sans hoquet. L'avantage d'utiliser rsync est qu'il copie le contenu du système de fichiers, plutôt que de faire une copie au niveau bloc de l'appareil; par conséquent, peu importe la taille des lecteurs cible et source, tant que le lecteur cible dispose de suffisamment d'espace pour contenir les données.Voici donc comment je le ferais:
rsync -avx oldFilesystem newFilesystem
pour copier / écraser le système de fichiers sur la nouvelle carte avec le système de fichiers de l'ancienne carte.rpi-update
pour vous assurer que votre micrologiciel est cohérent et à jour.Après cela, votre nouvelle carte devrait avoir un système Raspbian parfaitement fonctionnel installé dessus.
la source
J'ai créé un script shell pour sauvegarder et restaurer toutes les données sur une carte SD. Il supprime d'abord certaines données (correspondant à mon projet) et réduit la partition à la taille minimale afin que l'image soit aussi grande que les données sur la carte SD. En complément, le script crée un fichier * .zip de l'image. Après avoir restauré l'image créée sur une autre carte SD, la partition sera agrandie à sa taille maximale. Le script utilise les commandes mentionnées dans les autres réponses. Comme c'est mon premier script shell avec cette taille, il m'a fallu des heures pour le créer et ce n'est pas un jet parfait. Surtout, je ne sais pas comment gérer les valeurs de retour de resize2fs et fdisk donc l'utilisateur doit taper les valeurs dont j'ai besoin. Y a-t-il des idées pour y remédier? J'espère que ce script aide quelqu'un d'autre. N'hésitez pas à le modifier et à l'améliorer.
C'est ici:
la source
La solution la plus simple que j'ai trouvée était de faire une sauvegarde de la plus grande carte d'origine en utilisant les commandes dd décrites ci-dessus, puis de restaurer l'image sur la plus petite carte en utilisant quelque chose comme piwriter. dd peut aussi fonctionner ... pas sûr. PiWriter a renvoyé une erreur car il manquait de place, mais comme l'image ne contenait aucune donnée réelle au-delà de la taille de la carte plus petite, elle tronquait simplement des secteurs vides. Je ne sais pas quelles sont les implications de ceci ... la partition peut avoir besoin d'être vérifiée ou réparée mais je peux vérifier que cela a fonctionné lorsque je l'ai mise dans le Pi.
la source
J'utilise une ancienne version de
win32diskimager-RELEASE-0.1-r15-win32
pour lire l'image, elle crée une image de 4 Go même à partir d'une carte SD de 8 Go et écrit ensuite l'image avec la dernière version de win32diskimager.J'utilise l'ancienne version car l'ancienne ignorera toutes les erreurs.
la source