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
PIBOX : Raspberry Pi which is used
SD_CARD_A : 8GB micro SD card which is used on PIBOX and on which Raspbian-lite (the OS) is installed
SD_CARD_B : 2GB micro SD card which will be used on PIBOX and on which Raspbian-lite (the OS) will be installed
Partitions de SD_CARD_A
Pendant que PIBOX fonctionne, nous listons les partitions (les partitions système inutiles ne sont pas affichées ici).
root@pibox:~# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/root ext4 7.3G 1.1G 5.9G 16% /
/dev/mmcblk0p1 vfat 63M 21M 43M 33% /boot
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
.
root@mylaptop:~# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sdb2 ext4 22G 13G 7.9G 63% /
/dev/sdb1 vfat 197M 2.6M 195M 2% /boot/efi
/dev/sda8 ext4 66G 11G 52G 17% /home
/dev/sdc1 vfat 63M 21M 43M 33% /media/some_user_name/boot
/dev/sdc2 ext4 7.3G 1.1G 5.9G 16% /media/some_user_name/some_uuid_serial
Nous démontons ces partitions de notre système pour qu'elles fonctionnent correctement.
root@mylaptop:~# umount /dev/sdc1
root@mylaptop:~# umount /dev/sdc2
Nous affichons les informations sur l'appareil de SD_CARD_A en détail pour les confirmations dans les prochaines étapes.
root@mylaptop:~# fdisk -l /dev/sdc
Disk /dev/sdc: 7969 MB, 7969177600 bytes
246 heads, 62 sectors/track, 1020 cylinders, total 15564800 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: 0x2019f6d8
Device Boot Start End Blocks Id System
/dev/sdc1 8192 137215 64512 c W95 FAT32 (LBA)
/dev/sdc2 137216 15564799 7713792 83 Linux
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.
root@mylaptop:~# dd bs=4MB if=/dev/sdc of=pibox.img
1992+1 records in
1992+1 records out
7969177600 bytes (8.0 GB) copied, 416.582 s, 19.1 MB/s
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.
root@mylaptop:~# modprobe loop
Nous trouvons un chemin de périphérique de bouclage inutilisé.
root@mylaptop:~# losetup -f /dev/loop0
Maintenant, nous créons un périphérique de bouclage pour le fichier pibox.img.
root@mylaptop:~# losetup /dev/loop0 pibox.img
Nous déclenchons le noyau sur les changements de partition.
root@mylaptop:~# partprobe /dev/loop0
Nous confirmons si les opérations précédentes ont réussi.
root@mylaptop:~# losetup /dev/loop0
/dev/loop0: [0806]:69 (/root/pibox.img)
Nous affichons les informations du périphérique de bouclage en détail pour le comparer avec SD_CARD_A.
root@mylaptop:~# fdisk -l /dev/loop0
Disk /dev/loop0: 7969 MB, 7969177600 bytes
255 heads, 63 sectors/track, 968 cylinders, total 15564800 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: 0x2019f6d8
Device Boot Start End Blocks Id System
/dev/loop0p1 8192 137215 64512 c W95 FAT32 (LBA)
/dev/loop0p2 137216 15564799 7713792 83 Linux
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 termes 1900001280 bytes
(= 512 * 3710940).
Ainsi, le nouveau numéro de bloc de fin est 3848155
calculé par start 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.
- Redimensionnement du système de fichiers. Nous allons réduire le système de fichiers sur THE_PARTITION en définissant sa taille sur
3710940 blocks
.
- Redimensionnement de la partition. Nous allons réduire THE_PARTITION en définissant son numéro de bloc de fin sur
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
.
root@mylaptop:~# e2fsck -f /dev/loop0p2
e2fsck 1.42.9 (4-Feb-2014)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0p2: 41175/475776 files (0.2% non-contiguous), 309183/1928448 blocks
Nous réduisons le système de fichiers avec resize2fs
.
root@mylaptop:~# resize2fs /dev/loop0p2 3710940s
resize2fs 1.42.9 (4-Feb-2014)
Resizing the filesystem on /dev/loop0p2 to 463867 (4k) blocks.
The filesystem on /dev/loop0p2 is now 463867 blocks long.
Rétrécissement de la partition
Nous apprenons avec quel numéro THE_PARTITION parted
.
root@mylaptop:~# parted /dev/loop0
GNU Parted 2.3
Using /dev/loop0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: Loopback device (loop)
Disk /dev/loop0: 7969MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 4194kB 70.3MB 66.1MB primary fat16 lba
2 70.3MB 7969MB 7899MB primary ext4
(parted) quit
Nous réduisons THE_PARTITION avec parted
.
root@mylaptop:~# parted /dev/loop0 unit s resizepart 2 3848155
Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
Yes/No? Yes
Nous avons terminé avec le périphérique de bouclage. On le détache.
root@mylaptop:~# losetup -d /dev/loop0
Fichier d'image tronquée
Nous vérifions la nouvelle table de partition.
root@mylaptop:~# fdisk -l pibox.img
Disk pibox.img: 7969 MB, 7969177600 bytes
255 heads, 63 sectors/track, 968 cylinders, total 15564800 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: 0x2019f6d8
Device Boot Start End Blocks Id System
pibox.img1 8192 137215 64512 c W95 FAT32 (LBA)
pibox.img2 137216 3848155 1855470 83 Linux
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 être 1970255872 bytes
(= (3848155 + 1) * 512).
Nous tronquons le fichier pibox.img.
root@mylaptop:~# truncate --size=1970255872 pibox.img
Nous vérifions la nouvelle taille du fichier pibox.img.
root@mylaptop:~# ls -l pibox.img
-rw-r--r-- 1 root root 1970255872 Oct 13 21:53 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
.
root@mylaptop:~# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sdb2 ext4 22G 13G 7.9G 63% /
/dev/sdb1 vfat 197M 2.6M 195M 2% /boot/efi
/dev/sda8 ext4 66G 11G 52G 17% /home
/dev/sdc1 vfat 63M 21M 43M 33% /media/some_user_name/boot
/dev/sdc2 ext4 1.8G 1.6G 59M 97% /media/some_user_name/some_uuid_serial
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.
root@mylaptop:~# umount /dev/sdc1
root@mylaptop:~# umount /dev/sdc2
Nous clonons le fichier pibox.img dans SD_CARD_B.
root@mylaptop:~# dd bs=4MB if=pibox.img of=/dev/sdc
492+1 records in
492+1 records out
1970255872 bytes (2.0 GB) copied, 646.967 s, 3.0 MB/s
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).
root@pibox:~# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/root ext4 1.8G 1.1G 601M 64% /
/dev/mmcblk0p1 vfat 63M 21M 43M 33% /boot