Ce document décrit comment déplacer, indépendamment de son contenu, une partition. Trois cas sont distingués, selon que
la partition cible n'a pas de point commun avec la partition source : absence de recouvrement
la fin de la partition cible est située dans la partition source : recouvrement avec déplacement vers la droite
le début de la partition cible est situé dans la partition source : recouvrement avec déplacement vers la gauche
Sommaire
1 - Préalable
1.1 - Précautions
Le risque de perte ou d'écrasement de données ne pouvant être écarté, il est important avant de démarrer l'opération
de sauvegarder si possible les données de la partition et des autres données sur le disque
d'identifier correctement les volumes ou partitions à modifier
1.2 - Unités de mesure
Selon les commandes (parted, fdisk, gdisk,dd,...), les abréviations des unités de mesure des positions et taille mémoire peuvent différer.
La notation des puissances de 10 est KB, MB, GB, ....
La notation des puissances de 2 est K,M,G ou KiB, MiB, GiB selon les commandes et peut différer entre la saisie et l'affichage
Commande Saisie unité ^^2 Affichage unité ^^2
parted s,KiB,MiB,GiB KiB,MiB,GiB avec option unit, par ex unit MiB df - - - - - - K, M, G avec option -B --block-size), par exemple -BM fdisk s et/ou K,M,G s et/ou K, M, G par défaut gdisk s et/ou K,M,G s et/ou KiB,MiB,GiB par défaut resizepart K,M,G block 4k = 4 x 1024 dd K,M,G
Pour mémoire
1secteur =512 octets
1K=1KiB = 2 secteurs = 1024 octets
1M=1MiB = 2x1024 secteurs =1024 x 1024 octets = 1 048 576 octets, soit environ 1,05 Millions d'octets
1G=1GiB = 2x1024x1024 secteurs = 1024 x 1024 x 1024 octets = 1 073 741 824, soit environ 1, 07 Milliards d'octets
2 - Cas général
La commande sfdisk --move-data permet de déplacer une partition et son contenu (avec ou sans recouvrement, vers la droite ou vers la gauche).
Dans la commande suivante, la partition 1 et son contenu sont déplacés de 500 MiB vers la droite
la source (partition à déplacer) se situe sur le disque /dev/sdb
porte le numéro 1
démarre en 1000 MiB
se termine en 2000 MiB (taille de la partition 1000 MiB)
et que l'objectif est de recopier la partition source à partir de l'emplacement situé en 5000 MIB
Lorsque le déplacement a lieu sans recouvrement, la partition cible peut-être créée sans supprimer préalablement la partition source, elle a la même taille que la partition source
$ sudo parted /dev/sdb unit MiB print ... Number Start End Size File system Name Flags 1 1000MiB 2000MiB 1000MiB ext4 source 2 5000MiB 6000MiB 1000MiB cible
Le déplacement s'effectue comme une copie "ordinaire", on sélectionne une taille de bloc de par exemple 100M
$ time sudo dd if=/dev/sdb1 bs=100M of=/dev/sdb2 conv=fsync status=progress ... real 0m56,862s user 0m0,006s sys 0m2,467s
Signification des options
La recopie s'effectue par blocs de 100M, toute autre valeur, diviseur de la taille de la partition convient, mais une valeur trop petite, valeur par défaut par exemple (512 octets, un secteur) ralentit considérablement la recopie
Grâce à l'option conv=fsync, la commande s'achève une fois la recopie physique des données sur le périphérique effectuée
L'option status=progress est responsable de l'affichage de l'avancement de la recopie.
A l'issue de la recopie
La partition 2 est identique à la partition 1
$ sudo parted /dev/sdb unit MiB print ... Number Start End Size File system Name Flags 1 1000MiB 2000MiB 1000MiB ext4 source 2 5000MiB 6000MiB 1000MiB ext4 cible
On peut vérifier l'intégrité de la recopie au moyen des sommes de contrôle des partitions source et cible, elles doivent être identiques
Il est alors possible de supprimer la partition source (partition 1) et de renommer les partitions dans l'ordre
$ sudo parted /dev/sdb rm 1
$ sudo sfdisk --reorder /dev/sdb
3.2 - Utilisation de cat
L'utilisation de "cat" pour effectuer la recopie évite d'avoir à définir la taille du bloc de recopie (bs)
$ time sudo cat /dev/sdb1 |sudo tee /dev/sdb2 |pv -s 1000M 1>/dev/null ... real 0m57,183s user 0m0,613s sys 0m5,140s
Le suivi de l'avancement de la recopie est réalisé avec la commande pv.
4 - Cas du déplacement avec recouvrement
4.1 - Principe
Dans le cas d'un déplacement avec recouvrement, le contenu de la partition source se retrouve partiellement écrasée par celui de la partition cible. La recopie s'effectue par blocs, ainsi en cas de problème, il est possible de recommencer la copie en partant du premier bloc mal transmis.
Dans le cas d'un déplacement vers la gauche, la recopie s'effectue en commençant par le début de la partition (premier bloc)
Dans le cas d'un déplacement vers la droite, la recopie s'effectue en commençant par la fin de la partition (dernier bloc)
La taille du bloc
est choisie parmi les sous-multiples de la position de départ de la partition source et de la taille de la partition
doit-être inférieure ou égale à la différence au déplacement de la partition
Dans les exemples ci-dessous,
Le début et la taille de la partition source sont respectivement 1000MiB et 1000MiB
Le déplacement est de 500MiB à gauche ou à droite : les début de la partition déplacée sont respectivement 500MiB et 1500MiB
La taille de blocs choisie est de 100MiB (elle pourrait être au maximum de 500MiB)
Un fichier log est créé pour enregistrer la progression de la recopie
4.2 - Déplacement vers la gauche
Enregistrer la somme de contrôle de la partition source